/ Hex Artifact Content
Login

Artifact 4e3bbc44aeda16cebf7e502e82e211285e5b6f92:


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 31 35  : pager.c,v 1.15
0350: 35 20 32 30 30 34 2f 30 38 2f 31 38 20 30 32 3a  5 2004/08/18 02:
0360: 31 30 3a 31 35 20 64 72 68 20 45 78 70 20 24 0a  10:15 drh Exp $.
0370: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e  */.#include "os.
0380: 68 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75  h"         /* Mu
0390: 73 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65  st be first to e
03a0: 6e 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65  nable large file
03b0: 20 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63   support */.#inc
03c0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
03d0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67  h".#include "pag
03e0: 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  er.h".#include <
03f0: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
0400: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f  de <string.h>../
0410: 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20  *.** Macros for 
0420: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e  troubleshooting.
0430: 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65    Normally turne
0440: 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73  d off.*/.#if 0.s
0450: 74 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69  tatic Pager *mai
0460: 6e 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66  nPager = 0;.#def
0470: 69 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29  ine SET_PAGER(X)
0480: 20 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d    if( mainPager=
0490: 3d 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d  =0 ) mainPager =
04a0: 20 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52   (X).#define CLR
04b0: 5f 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d  _PAGER(X)  if( m
04c0: 61 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20  ainPager==(X) ) 
04d0: 6d 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64  mainPager = 0.#d
04e0: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
04f0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d      if( pPager==
0500: 6d 61 69 6e 50 61 67 65 72 20 29 20 73 71 6c 69  mainPager ) sqli
0510: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0520: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32  ).#define TRACE2
0530: 28 58 2c 59 29 20 20 20 69 66 28 20 70 50 61 67  (X,Y)   if( pPag
0540: 65 72 3d 3d 6d 61 69 6e 50 61 67 65 72 20 29 20  er==mainPager ) 
0550: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0560: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
0570: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 69 66  TRACE3(X,Y,Z) if
0580: 28 20 70 50 61 67 65 72 3d 3d 6d 61 69 6e 50 61  ( pPager==mainPa
0590: 67 65 72 20 29 20 73 71 6c 69 74 65 33 44 65 62  ger ) sqlite3Deb
05a0: 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a  ugPrintf(X,Y,Z).
05b0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 53 45  #else.#define SE
05c0: 54 5f 50 41 47 45 52 28 58 29 0a 23 64 65 66 69  T_PAGER(X).#defi
05d0: 6e 65 20 43 4c 52 5f 50 41 47 45 52 28 58 29 0a  ne CLR_PAGER(X).
05e0: 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58  #define TRACE1(X
05f0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32  ).#define TRACE2
0600: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54 52  (X,Y).#define TR
0610: 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 65 6e 64  ACE3(X,Y,Z).#end
0620: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  if.../*.** The p
0630: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0640: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0650: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0660: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0670: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
0680: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
0690: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
06a0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
06b0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
06e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
06f0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0720: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0730: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0760: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
0770: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0780: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0790: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
07a0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
07b0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
07c0: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
07d0: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
07e0: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0800: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0810: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0820: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0850: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0860: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0870: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
0880: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
0890: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
08a0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
08d0: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
08e0: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
08f0: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0910: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0920: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0930: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0950: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0960: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0970: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0980: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
09a0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
09b0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
09c0: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
09f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0a00: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0a10: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0a20: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0a30: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0a50: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0a60: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0a70: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0aa0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0ab0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0ac0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0ad0: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0ae0: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0af0: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0b00: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0b10: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0b20: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0b30: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0b60: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0b70: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0b80: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ba0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0bb0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0bc0: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0bf0: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0c00: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74 68   is to remove th
0c10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0c20: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
0c30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0c40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
0c50: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
0c70: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0c80: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0c90: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0ca0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0cb0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0cc0: 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 6f  te3pager_get() o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0cf0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0d00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0d10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0d20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0d30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0d40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0d50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0d60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0d80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 70 61 67   that sqlite3pag
0d90: 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61  er_write() is ca
0da0: 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20  lled, the state 
0db0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a  transitions to.*
0dc0: 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
0dd0: 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71  .  (Note that sq
0de0: 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28  lite_page_write(
0df0: 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a  ) can only be.**
0e00: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75   called on an ou
0e10: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77  tstanding page w
0e20: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
0e30: 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a  the pager must.*
0e40: 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48  * be in PAGER_SH
0e50: 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74  ARED before it t
0e60: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41  ransitions to PA
0e70: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a  GER_RESERVED.).*
0e80: 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  * The transition
0e90: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
0ea0: 49 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20  IVE occurs when 
0eb0: 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
0ec0: 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74  es.** are made t
0ed0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
0ee0: 69 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73  ile.  After an s
0ef0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
0f00: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
0f10: 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite_pager_commit
0f20: 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f  (), the state go
0f30: 65 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  es back to PAGER
0f40: 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66  _SHARED..*/.#def
0f50: 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  ine PAGER_UNLOCK
0f60: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
0f70: 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20  PAGER_SHARED    
0f80: 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45    1.#define PAGE
0f90: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 0a  R_RESERVED    2.
0fa0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58  #define PAGER_EX
0fb0: 43 4c 55 53 49 56 45 20 20 20 33 0a 23 64 65 66  CLUSIVE   3.#def
0fc0: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
0fd0: 20 20 20 20 20 20 34 0a 0a 0a 2f 2a 0a 2a 2a 20        4.../*.** 
0fe0: 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  Each in-memory i
0ff0: 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62  mage of a page b
1000: 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66  egins with the f
1010: 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e  ollowing header.
1020: 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20  .** This header 
1030: 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20  is only visible 
1040: 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f  to this pager mo
1050: 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e  dule.  The clien
1060: 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63  t.** code that c
1070: 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20  alls pager sees 
1080: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68  only the data th
1090: 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68  at follows the h
10a0: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69  eader..**.** Cli
10b0: 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64 20  ent code should 
10c0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 70 61 67 65  call sqlite3page
10d0: 72 5f 77 72 69 74 65 28 29 20 6f 6e 20 61 20 70  r_write() on a p
10e0: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
10f0: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1100: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1110: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1120: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 70 61  t time sqlite3pa
1130: 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20 69  ger_write().** i
1140: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72  s called, the or
1150: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
1160: 65 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e  ents are written
1170: 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61   into the rollba
1180: 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ck.** journal an
1190: 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61  d PgHdr.inJourna
11a0: 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64  l and PgHdr.need
11b0: 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c  Sync are set.  L
11c0: 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68  ater, once.** th
11d0: 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68  e journal page h
11e0: 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20  as made it onto 
11f0: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
1200: 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  , PgHdr.needSync
1210: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20  .** is cleared. 
1220: 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61   The modified pa
1230: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69  ge cannot be wri
1240: 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
1250: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64  he original.** d
1260: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
1270: 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  il the journal p
1280: 61 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79  ages has been sy
1290: 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64  nced to disk and
12a0: 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65   the.** PgHdr.ne
12b0: 65 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20  edSync has been 
12c0: 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  cleared..**.** T
12d0: 68 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66  he PgHdr.dirty f
12e0: 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20  lag is set when 
12f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1300: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61  te() is called a
1310: 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nd.** is cleared
1320: 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20   again when the 
1330: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
1340: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
1350: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
1360: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1370: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1380: 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74   PgHdr PgHdr;.st
1390: 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50  ruct PgHdr {.  P
13a0: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13c0: 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68   The pager to wh
13d0: 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65  ich this page be
13e0: 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  longs */.  Pgno 
13f0: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
1400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1410: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
1420: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1430: 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68  PgHdr *pNextHash
1440: 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f  , *pPrevHash;  /
1450: 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  * Hash collision
1460: 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72   chain for PgHdr
1470: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64 72  .pgno */.  PgHdr
1480: 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50   *pNextFree, *pP
1490: 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65  revFree;  /* Fre
14a0: 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77  elist of pages w
14b0: 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a  here nRef==0 */.
14c0: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c    PgHdr *pNextAl
14d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
14e0: 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
14f0: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
1500: 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a  dr *pNextStmt, *
1510: 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c  pPrevStmt;  /* L
1520: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
1530: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1540: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
1550: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
1560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1570: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
1580: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
1590: 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b   */.  u8 inStmt;
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
15c0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
15d0: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
15e0: 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20 20   u8 dirty;      
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e 65  /* TRUE if we ne
1610: 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b  ed to write back
1620: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38   changes */.  u8
1630: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1650: 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66  Sync journal bef
1660: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69 73  ore writing this
1670: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c   page */.  u8 al
1680: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
1690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
16a0: 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61  able dont_rollba
16b0: 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61  ck() for this pa
16c0: 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e  ge */.  short in
16d0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
16e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16f0: 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 69   of users of thi
1700: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
1710: 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20  r *pDirty;      
1720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
1730: 72 74 79 20 70 61 67 65 73 20 73 6f 72 74 65 64  rty pages sorted
1740: 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a   by PgHdr.pgno *
1750: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
1760: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
1770: 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f   page data follo
1780: 77 20 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f  w this header */
1790: 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74  .  /* Pager.nExt
17a0: 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61  ra bytes of loca
17b0: 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  l data follow th
17c0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  e page data */.}
17d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  ;../*.** For an 
17e0: 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64  in-memory only d
17f0: 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78  atabase, some ex
1800: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
1810: 69 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75  is recorded abou
1820: 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73  t.** each page s
1830: 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63  o that changes c
1840: 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1850: 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c  k.  (Journal fil
1860: 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73  es are not.** us
1870: 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ed for in-memory
1880: 20 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68   databases.)  Th
1890: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f  e following info
18a0: 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64  rmation is added
18b0: 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f   to.** the end o
18c0: 66 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c  f every EXTRA bl
18d0: 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  ock for in-memor
18e0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  y databases..**.
18f0: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
1900: 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
1910: 65 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74  een added direct
1920: 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20  ly to the PgHdr 
1930: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75  structure..** Bu
1940: 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20  t then it would 
1950: 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61  take up an extra
1960: 20 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72   8 bytes of stor
1970: 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48  age on every PgH
1980: 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64  dr.** even for d
1990: 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61  isk-based databa
19a0: 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20  ses.  Splitting 
19b0: 69 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62  it out saves 8 b
19c0: 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69  ytes.  This.** i
19d0: 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73  s only a savings
19e0: 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f   of 0.8% but tho
19f0: 73 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61  se percentages a
1a00: 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65  dd up..*/.typede
1a10: 66 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  f struct PgHisto
1a20: 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74  ry PgHistory;.st
1a30: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b  ruct PgHistory {
1a40: 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20  .  u8 *pOrig;   
1a50: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61    /* Original pa
1a60: 67 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72  ge text.  Restor
1a70: 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66  e to this on a f
1a80: 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ull rollback */.
1a90: 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20    u8 *pStmt;    
1aa0: 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77   /* Text as it w
1ab0: 61 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  as at the beginn
1ac0: 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65  ing of the curre
1ad0: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  nt statement */.
1ae0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
1af0: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
1b00: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
1b10: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
1b20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
1b30: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
1b40: 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58 29  e CODEC(P,D,N,X)
1b50: 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 29   if( P->xCodec )
1b60: 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  { P->xCodec(P->p
1b70: 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b  CodecArg,D,N,X);
1b80: 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
1b90: 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58 29  e CODEC(P,D,N,X)
1ba0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
1bb0: 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72  onvert a pointer
1bc0: 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f   to a PgHdr into
1bd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
1be0: 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61  s data.** and ba
1bf0: 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65  ck again..*/.#de
1c00: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41  fine PGHDR_TO_DA
1c10: 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28  TA(P)  ((void*)(
1c20: 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e  &(P)[1])).#defin
1c30: 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  e DATA_TO_PGHDR(
1c40: 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29 28  D)  (&((PgHdr*)(
1c50: 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65  D))[-1]).#define
1c60: 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28   PGHDR_TO_EXTRA(
1c70: 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28  G,P) ((void*)&((
1c80: 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29 29  char*)(&(G)[1]))
1c90: 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d 29  [(P)->pageSize])
1ca0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
1cb0: 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c  O_HIST(P,PGR)  \
1cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50  .            ((P
1cd0: 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61  gHistory*)&((cha
1ce0: 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50  r*)(&(P)[1]))[(P
1cf0: 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28 50  GR)->pageSize+(P
1d00: 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f  GR)->nExtra])../
1d10: 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20  *.** How big to 
1d20: 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1d30: 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ble used for loc
1d40: 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20  ating in-memory 
1d50: 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65  pages.** by page
1d60: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66   number..*/.#def
1d70: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32 30  ine N_PG_HASH 20
1d80: 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61  48../*.** Hash a
1d90: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a   page number.*/.
1da0: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61  #define pager_ha
1db0: 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e  sh(PN)  ((PN)&(N
1dc0: 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a  _PG_HASH-1))../*
1dd0: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
1de0: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
1df0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1e00: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1e10: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
1e20: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65   {.  char *zFile
1e30: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1e40: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1e50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e60: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
1e70: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1e80: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
1e90: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1ea0: 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79  char *zDirectory
1eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
1ec0: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61  irectory hold da
1ed0: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
1ee0: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73  al files */.  Os
1ef0: 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20 20  File fd, jfd;   
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1f10: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
1f20: 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  r database and j
1f30: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69  ournal */.  OsFi
1f40: 6c 65 20 73 74 66 64 3b 20 20 20 20 20 20 20 20  le stfd;        
1f50: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1f60: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
1f70: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
1f80: 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e 74 20  journal*/.  int 
1f90: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
1fa0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1fb0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1fc0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1fd0: 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20  origDbSize;     
1fe0: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
1ff0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
2000: 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20  rent change */. 
2010: 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20   int stmtSize;  
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2030: 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
2040: 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73   (in pages) at s
2050: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
2060: 20 6f 66 66 5f 74 20 73 74 6d 74 4a 53 69 7a 65   off_t stmtJSize
2070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2080: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
2090: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
20a0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
20d0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ges written to t
20e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
20f0: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
2110: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
2120: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
2130: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
2140: 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20  nt stmtNRec;    
2150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2160: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
2170: 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e  in stmt subjourn
2180: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  al */.  int nExt
2190: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
21a0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
21b0: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
21c0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
21d0: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
21e0: 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a  estructor)(void*
21f0: 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  ,int); /* Call t
2200: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
2210: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
2220: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
2230: 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29  iter)(void*,int)
2240: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
2250: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
2260: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
2270: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2290: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22a0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
22b0: 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22d0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
22e0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
22f0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
2320: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69  -memory pages wi
2330: 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20  th PgHdr.nRef>0 
2340: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b  */.  int mxPage;
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2370: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68  er of pages to h
2380: 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  old in cache */.
2390: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
23a0: 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a  s, nOvfl;     /*
23b0: 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73   Cache hits, mis
23c0: 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76  sing, and LRU ov
23d0: 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 76 6f 69  erflows */.  voi
23e0: 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64  d (*xCodec)(void
23f0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
2400: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
2410: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
2420: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
2430: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
2440: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
2450: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
2460: 29 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  ) */.  u8 journa
2470: 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  lOpen;          
2480: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
2490: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
24a0: 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20  iptors is valid 
24b0: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
24c0: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
24d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
24e0: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
24f0: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
2500: 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  useJournal;     
2510: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2520: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
2530: 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  al on this file 
2540: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e  */.  u8 stmtOpen
2550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2560: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2570: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
2580: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a  rnal is open */.
2590: 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20    u8 stmtInUse; 
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b0: 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20   True we are in 
25c0: 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
25d0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
25e0: 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b  u8 stmtAutoopen;
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2600: 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c  pen stmt journal
2610: 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e   when main journ
2620: 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20  al is opened*/. 
2630: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2650: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
2660: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
2670: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
2680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2690: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
26a0: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
26b0: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
26c0: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20   */.  u8 state; 
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43    /* PAGER_UNLOC
26f0: 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53  K, _SHARED, _RES
2700: 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20  ERVED, etc. */. 
2710: 20 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20 20   u8 errMask;    
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2730: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
2740: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
2750: 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b  /.  u8 tempFile;
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  /* zFilename is 
2780: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2790: 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c   */.  u8 readOnl
27a0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
27b0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
27c0: 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
27d0: 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  se */.  u8 needS
27e0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
27f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2800: 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65  n fsync() is nee
2810: 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  ded on the journ
2820: 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79  al */.  u8 dirty
2830: 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20  Cache;          
2840: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
2850: 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76 65  ached pages have
2860: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38   changed */.  u8
2870: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b   alwaysRollback;
2880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
2890: 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61  able dont_rollba
28a0: 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67  ck() for all pag
28b0: 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62  es */.  u8 memDb
28c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
28e0: 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20  nhibit all file 
28f0: 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  I/O */.  u8 *aIn
2900: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2910: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2920: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2930: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2940: 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53  le */.  u8 *aInS
2950: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
2960: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
2970: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
2980: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
2990: 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70    BusyHandler *p
29a0: 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a  BusyHandler;  /*
29b0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
29c0: 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a  te.busyHandler *
29d0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
29e0: 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20  t, *pLast;      
29f0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
2a00: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
2a10: 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20   *pFirstSynced; 
2a20: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2a30: 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50  free page with P
2a40: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30  gHdr.needSync==0
2a50: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
2a60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2a70: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
2a80: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
2a90: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
2ab0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
2ac0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
2ad0: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
2ae0: 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48  *aHash[N_PG_HASH
2af0: 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61  ];    /* Hash ta
2b00: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
2b10: 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20  number to PgHdr 
2b20: 2a 2f 0a 20 20 6f 66 66 5f 74 20 6a 6f 75 72 6e  */.  off_t journ
2b30: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
2b40: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2b50: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
2b60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
2b70: 20 6f 66 66 5f 74 20 6a 6f 75 72 6e 61 6c 48 64   off_t journalHd
2b80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2b90: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
2ba0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
2bb0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 6f 66 66 5f  header */.  off_
2bc0: 74 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  t stmtHdrOff;   
2bd0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2be0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
2bf0: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
2c00: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 6f 66 66 5f  tement */.  off_
2c10: 74 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  t stmtCksum;    
2c20: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
2c30: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
2c40: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
2c50: 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  */.  int sectorS
2c60: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2c70: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
2c80: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
2c90: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20  ollback */.  u8 
2ca0: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
2cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2cc0: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2cd0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2ce0: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  to jrnl */.};../
2cf0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62  *.** These are b
2d00: 69 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  its that can be 
2d10: 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72  set in Pager.err
2d20: 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  Mask..*/.#define
2d30: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
2d40: 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77      0x01  /* a w
2d50: 72 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f  rite() failed */
2d60: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
2d70: 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32  RR_MEM      0x02
2d80: 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61    /* malloc() fa
2d90: 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  iled */.#define 
2da0: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20  PAGER_ERR_LOCK  
2db0: 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f     0x04  /* erro
2dc0: 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  r in the locking
2dd0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65   protocol */.#de
2de0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43  fine PAGER_ERR_C
2df0: 4f 52 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a  ORRUPT  0x08  /*
2e00: 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75   database or jou
2e10: 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
2e20: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
2e30: 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78  _ERR_DISK     0x
2e40: 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64  10  /* general d
2e50: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20  isk I/O error - 
2e60: 62 61 64 20 68 61 72 64 20 64 72 69 76 65 3f 20  bad hard drive? 
2e70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  */../*.** Journa
2e80: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
2e90: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
2ea0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
2eb0: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
2ec0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
2ed0: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
2ee0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
2ef0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
2f00: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
2f10: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
2f20: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
2f30: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
2f40: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
2f50: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
2f60: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
2f70: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
2f80: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
2f90: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
2fa0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
2fb0: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
2fc0: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
2fd0: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
2fe0: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
2ff0: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
3000: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
3010: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
3020: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
3030: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
3040: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
3050: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
3060: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
3070: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
3080: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
3090: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
30a0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
30b0: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
30c0: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
30d0: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
30e0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
30f0: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
3100: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
3110: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
3120: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
3130: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
3140: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
3150: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
3160: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
3170: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
3180: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
3190: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
31a0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
31b0: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
31c0: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
31d0: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
31e0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
31f0: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
3200: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
3210: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
3220: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
3230: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
3240: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
3250: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
3260: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
3270: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
3280: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
3290: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
32a0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
32b0: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
32c0: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
32d0: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
32e0: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
32f0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
3300: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
3310: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
3320: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
3330: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
3340: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
3350: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
3360: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
3370: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
3380: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
3390: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
33a0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
33b0: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
33c0: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
33d0: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
33e0: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
33f0: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
3400: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
3410: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
3420: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
3430: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
3440: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
3450: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
3460: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
3470: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
3480: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
3490: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
34a0: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
34b0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
34c0: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
34d0: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
34e0: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
34f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
3500: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
3510: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
3520: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
3530: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
3540: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
3550: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
3560: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3570: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
3580: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
3590: 69 7a 65 29 0a 0a 23 64 65 66 69 6e 65 20 50 41  ize)..#define PA
35a0: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  GER_SECTOR_SIZE 
35b0: 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  512../*.** Page 
35c0: 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f  number PAGER_MJ_
35d0: 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73  PGNO is never us
35e0: 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  ed in an SQLite 
35f0: 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a  database (it is.
3600: 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  ** reserved for 
3610: 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61  working around a
3620: 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69   windows/posix i
3630: 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e  ncompatibility).
3640: 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69   It is.** used i
3650: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  n the journal to
3660: 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68   signify that th
3670: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
3680: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
3690: 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74  .** is devoted t
36a0: 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74  o storing a mast
36b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
36c0: 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  - there are no m
36d0: 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20  ore pages to.** 
36e0: 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63  roll back. See c
36f0: 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63  omments for func
3700: 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72  tion writeMaster
3710: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65  Journal() for de
3720: 74 61 69 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tails..*/.#defin
3730: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
3740: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
3750: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
3760: 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  )../*.** Enable 
3770: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3780: 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65  tracking (for de
3790: 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a  bugging) here:.*
37a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
37b0: 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72  TEST.  int pager
37c0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
37d0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
37e0: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
37f0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
3800: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
3810: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
3820: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
3830: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
3840: 20 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20    printf(.      
3850: 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64   "REFCNT: %4d ad
3860: 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25  dr=0x%08x nRef=%
3870: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e  d\n",.       p->
3880: 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52  pgno, (int)PGHDR
3890: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
38a0: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
38b0: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
38c0: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
38d0: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
38e0: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
38f0: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
3900: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
3910: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
3920: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
3930: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
3940: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
3950: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3960: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
3970: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
3980: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
3990: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
39a0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
39b0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
39c0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
39d0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
39e0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
39f0: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
3a00: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
3a10: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
3a20: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
3a30: 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64  2bits(OsFile *fd
3a40: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
3a50: 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72  u32 res;.  int r
3a60: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
3a70: 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65 73  3OsRead(fd, &res
3a80: 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a  , sizeof(res));.
3a90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3aa0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  _OK ){.    unsig
3ab0: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
3ac0: 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26      memcpy(ac, &
3ad0: 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73  res, 4);.    res
3ae0: 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c   = (ac[0]<<24) |
3af0: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
3b00: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
3b10: 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  ];.  }.  *pRes =
3b20: 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72   res;.  return r
3b30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
3b40: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
3b50: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
3b60: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
3b70: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
3b80: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
3b90: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
3ba0: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
3bb0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
3bc0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
3bd0: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
3be0: 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75  d, u32 val){.  u
3bf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
3c00: 34 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  4];.  ac[0] = (v
3c10: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
3c20: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
3c30: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
3c40: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
3c50: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
3c60: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72   val & 0xff;.  r
3c70: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
3c80: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
3c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
3ca0: 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  the 32-bit integ
3cb0: 65 72 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68  er 'val' into th
3cc0: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
3cd0: 64 20 62 79 20 70 61 67 65 20 68 65 61 64 65 72  d by page header
3ce0: 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65  .** 'p' at offse
3cf0: 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73  t 'offset'..*/.s
3d00: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
3d10: 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20  32bits(u32 val, 
3d20: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
3d30: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
3d40: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
3d50: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
3d60: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
3d70: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
3d80: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
3d90: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
3da0: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
3db0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
3dc0: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
3dd0: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
3de0: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
3df0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
3e00: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
3e10: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
3e20: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
3e30: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
3e40: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
3e50: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
3e60: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
3e70: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
3e80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3e90: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
3ea0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
3eb0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
3ec0: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
3ed0: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
3ee0: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
3ef0: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
3f00: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
3f10: 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  rt the bits in t
3f20: 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  he pPager->errMa
3f30: 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f  sk into an appro
3f40: 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20  prate.** return 
3f50: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
3f60: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64  int pager_errcod
3f70: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
3f80: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
3f90: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
3fa0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
3fb0: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29  PAGER_ERR_LOCK )
3fc0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3fd0: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20  PROTOCOL;.  if( 
3fe0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
3ff0: 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  & PAGER_ERR_DISK
4000: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
4010: 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70  E_IOERR;.  if( p
4020: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
4030: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
4040: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
4050: 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61  _FULL;.  if( pPa
4060: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
4070: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20  AGER_ERR_MEM )  
4080: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4090: 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67  OMEM;.  if( pPag
40a0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
40b0: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
40c0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
40d0: 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  RRUPT;.  return 
40e0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  rc;.}../*.** Whe
40f0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
4100: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4110: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
4120: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
4130: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
4140: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
4150: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
4160: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
4170: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
4180: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
4190: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
41a0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d  teMalloc(). *pzM
41b0: 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20  aster is.** set 
41c0: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
41d0: 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
41e0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
41f0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
4200: 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a  * sqliteFree() *
4210: 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  pzMaster..**.** 
4220: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
4230: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
4240: 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73  s present *pzMas
4250: 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
4260: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
4270: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
4280: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
4290: 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c  terJournal(OsFil
42a0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
42b0: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
42c0: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
42d0: 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20 20  .  off_t szJ;.  
42e0: 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74  u32 cksum;.  int
42f0: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
4300: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
4310: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
4320: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
4330: 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73  der */..  *pzMas
4340: 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  ter = 0;..  rc =
4350: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
4360: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
4370: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4380: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
4390: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
43a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
43b0: 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29  k(pJrnl, szJ-16)
43c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
43d0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
43e0: 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64  c;. .  rc = read
43f0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c  32bits(pJrnl, &l
4400: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
4410: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4420: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
4430: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
4440: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
4450: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
4460: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
4470: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
4480: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
4490: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
44a0: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
44b0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
44c0: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
44d0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
44e0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
44f0: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  rnl, szJ-16-len)
4500: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
4510: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
4520: 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  c;..  *pzMaster 
4530: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
4540: 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20  Malloc(len+1);. 
4550: 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20   if( !*pzMaster 
4560: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
4580: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
4590: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d  Read(pJrnl, *pzM
45a0: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
45b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
45c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
45d0: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
45e0: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
45f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
4600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
4610: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
4620: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
4630: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
4640: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
4650: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
4660: 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65  sum -= (*pzMaste
4670: 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  r)[i];.  }.  if(
4680: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
4690: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
46a0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
46b0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
46c0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
46d0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
46e0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
46f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
4700: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
4710: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
4720: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
4730: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
4740: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
4750: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
4760: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
4770: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
4780: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
4790: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
47a0: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
47b0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20  aster = 0;.  }. 
47c0: 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e   (*pzMaster)[len
47d0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20  ] = '\0';.   .  
47e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
47f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
4800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4810: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
4820: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
4830: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
4840: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
4850: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
4860: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
4870: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
4880: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
4890: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
48a0: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
48b0: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
48c0: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
48d0: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
48e0: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
48f0: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4920: 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20  ** 0            
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
4940: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
4950: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
4960: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
4980: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
49a0: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
49b0: 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c   int seekJournal
49c0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
49d0: 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6f 66 66 73  r){.  off_t offs
49e0: 65 74 20 3d 20 30 3b 0a 20 20 6f 66 66 5f 74 20  et = 0;.  off_t 
49f0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
4a00: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
4a10: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
4a20: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
4a30: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
4a40: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
4a50: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
4a60: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
4a70: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
4a80: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
4a90: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
4aa0: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
4ab0: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
4ac0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4ad0: 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ) );.  pPager->j
4ae0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73  ournalOff = offs
4af0: 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  et;.  return sql
4b00: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
4b10: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
4b20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a  >journalOff);.}.
4b30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
4b40: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
4b50: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
4b60: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4b70: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
4b80: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
4b90: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
4ba0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4bb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
4bc0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
4bd0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
4be0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
4bf0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
4c00: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
4c10: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
4c20: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
4c30: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
4c40: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
4c50: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
4c60: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
4c70: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
4c80: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
4c90: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
4ca0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
4cb0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
4cc0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
4cd0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
4ce0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
4cf0: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
4d00: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
4d10: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
4d20: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20  journal..** .** 
4d30: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
4d40: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34  RNAL_HDR_SZ - 24
4d50: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
4d60: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
4d70: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
4d80: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
4d90: 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63  ager){..  int rc
4da0: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
4db0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
4dc0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
4dd0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
4de0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
4df0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
4e00: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
4e10: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
4e20: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
4e30: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
4e40: 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70  rnalHdr;.  }.  p
4e50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
4e60: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
4e70: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
4e80: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
4e90: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
4ea0: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
4eb0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
4ec0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
4ed0: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
4ee0: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
4ef0: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
4f00: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
4f10: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
4f20: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
4f30: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
4f40: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
4f50: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
4f60: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
4f70: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
4f80: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
4f90: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
4fa0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
4fb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
4fc0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
4fd0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
4fe0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
4ff0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5000: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
5010: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
5020: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
5030: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72  . */.    rc = wr
5040: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
5050: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5060: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
5070: 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  fff : 0);.  }.  
5080: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5090: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  K ){.    /* The 
50a0: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
50b0: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
50c0: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e   .    sqlite3Ran
50d0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
50e0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
50f0: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
5100: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20 3d  mInit);.    rc =
5110: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
5120: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
5130: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
5140: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
5150: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5160: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
5170: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
5180: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
5190: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
51a0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
51b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
51c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
51d0: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
51e0: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
51f0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
5200: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
5210: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5220: 64 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  d, pPager->secto
5230: 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rSize);.  }..  /
5240: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
5250: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
5260: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
5270: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
5280: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
5290: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
52a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
52b0: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
52c0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
52d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
52e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
52f0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
5300: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5310: 66 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  f-1);.    rc = s
5320: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
5330: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30  Pager->jfd, "\00
5340: 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  0", 1);.  }.  re
5350: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5360: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
5370: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
5380: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
5390: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
53a0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
53b0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
53c0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
53d0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
53e0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
53f0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53  urnal.** file. S
5400: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
5410: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
5420: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
5430: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
5440: 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  f.** the journal
5450: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
5460: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
5470: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
5480: 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20  essfully, *nRec 
5490: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
54a0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
54b0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
54c0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
54d0: 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74  d *dbSize is set
54e0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
54f0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
5500: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
5510: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
5520: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
5530: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
5540: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
5550: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
5560: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
5570: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
5580: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
5590: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
55a0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
55b0: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
55c0: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
55d0: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
55e0: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
55f0: 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a   and *nRec and *
5600: 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73  dbSize are not s
5610: 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  et.  If JOURNAL_
5620: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
5630: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
5640: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
5650: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
5660: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
5670: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5680: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
5690: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a  Pager *pPager, .
56a0: 20 20 6f 66 66 5f 74 20 6a 6f 75 72 6e 61 6c 53    off_t journalS
56b0: 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65  ize,.  u32 *pNRe
56c0: 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69  c, .  u32 *pDbSi
56d0: 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ze.){.  int rc;.
56e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
56f0: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
5700: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
5710: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
5720: 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a  */..  rc = seekJ
5730: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
5740: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
5750: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
5760: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5770: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
5780: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
5790: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
57a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
57b0: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  E;.  }..  rc = s
57c0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
57d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
57e0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
57f0: 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ));.  if( rc ) r
5800: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
5810: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
5820: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
5830: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
5840: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5850: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
5860: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
5870: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
5880: 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20  , pNRec);.  if( 
5890: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
58a0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
58b0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
58c0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
58d0: 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nit);.  if( rc )
58e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
58f0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
5900: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62  pPager->jfd, pDb
5910: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
5920: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5930: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73  /* Update the as
5940: 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a  sumed sector-siz
5950: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
5960: 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20  alue used by .  
5970: 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
5980: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
5990: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
59a0: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
59b0: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
59c0: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
59d0: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
59e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
59f0: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
5a00: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
5a10: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
5a20: 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
5a30: 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e  e.  ** of Pager.
5a40: 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
5a50: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
5a60: 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
5a70: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72  e..  */.  rc = r
5a80: 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65  ead32bits(&pPage
5a90: 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26  r->jfd, (u32 *)&
5aa0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
5ab0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
5ac0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
5ad0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5ae0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
5af0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  SZ(pPager);.  rc
5b00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
5b10: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
5b20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5b30: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  f);.  return rc;
5b40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
5b50: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
5b60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5b70: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
5b80: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
5b90: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
5ba0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
5bb0: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
5bc0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
5bd0: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
5be0: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
5bf0: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
5c00: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
5c10: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
5c20: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
5c30: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
5c40: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
5c50: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
5c60: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
5c70: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
5c80: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
5c90: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
5ca0: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
5cb0: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e  _MJ_PGNO..** + N
5cc0: 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f   bytes: length o
5cd0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
5ce0: 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79   name..** + 4 by
5cf0: 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79  tes: N.** + 4 by
5d00: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
5d10: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
5d20: 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a  m..** + 8 bytes:
5d30: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
5d40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
5d50: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
5d60: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
5d70: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
5d80: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
5d90: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  * journal name..
5da0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
5db0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
5dc0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
5dd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
5de0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
5df0: 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e    int len; .  in
5e00: 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75  t i; .  u32 cksu
5e10: 6d 20 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20 21  m = 0; ..  if( !
5e20: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
5e30: 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65  r->setMaster) re
5e40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5e50: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
5e60: 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20  ter = 1;..  len 
5e70: 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  = strlen(zMaster
5e80: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5e90: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
5ea0: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
5eb0: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  i];.  }..  /* If
5ec0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
5ed0: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
5ee0: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
5ef0: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
5f00: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
5f10: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
5f20: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
5f30: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
5f40: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
5f50: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
5f60: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
5f70: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
5f80: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
5f90: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
5fa0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
5fb0: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
5fc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5fd0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
5fe0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5ff0: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
6000: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
6010: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
6020: 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  d, PAGER_MJ_PGNO
6030: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
6040: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6050: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
6060: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6070: 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
6080: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
6090: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
60a0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
60b0: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
60c0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
60d0: 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  d, len);.  if( r
60e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
60f0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6100: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
6110: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73 75  Pager->jfd, cksu
6120: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
6130: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6140: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
6150: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
6160: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
6170: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
6180: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
6190: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
61a0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65  ./*.** Add or re
61b0: 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  move a page from
61c0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
61d0: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
61e0: 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d  in the.** statem
61f0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
6200: 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65  ** The Pager kee
6210: 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  ps a separate li
6220: 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  st of pages that
6230: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
6240: 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65  n.** the stateme
6250: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69  nt journal.  Thi
6260: 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69  s helps the sqli
6270: 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
6280: 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  mmit().** routin
6290: 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65  e run MUCH faste
62a0: 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  r for the common
62b0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72   case where ther
62c0: 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61  e are many.** pa
62d0: 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75  ges in memory bu
62e0: 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65  t only a few are
62f0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
6300: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  t journal..*/.st
6310: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61  atic void page_a
6320: 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
6330: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
6340: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
6350: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
6360: 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20  ( pPg->inStmt ) 
6370: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
6380: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
6390: 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78  ==0 && pPg->pNex
63a0: 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50  tStmt==0 );.  pP
63b0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
63c0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
63d0: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61  pStmt ){.    pPa
63e0: 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65  ger->pStmt->pPre
63f0: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d  vStmt = pPg;.  }
6400: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  .  pPg->pNextStm
6410: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  t = pPager->pStm
6420: 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74  t;.  pPager->pSt
6430: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  mt = pPg;.  pPg-
6440: 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73  >inStmt = 1;.}.s
6450: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
6460: 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
6470: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
6480: 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  ){.  if( !pPg->i
6490: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
64a0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
64b0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Stmt ){.    asse
64c0: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  rt( pPg->pPrevSt
64d0: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70  mt->pNextStmt==p
64e0: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
64f0: 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53  PrevStmt->pNextS
6500: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
6510: 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Stmt;.  }else{. 
6520: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
6530: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70  pPager->pStmt==p
6540: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
6550: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
6560: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
6570: 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
6580: 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  extStmt ){.    a
6590: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
65a0: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
65b0: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  ==pPg );.    pPg
65c0: 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72  ->pNextStmt->pPr
65d0: 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50  evStmt = pPg->pP
65e0: 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70  revStmt;.  }.  p
65f0: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
6600: 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53  0;.  pPg->pPrevS
6610: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  tmt = 0;.  pPg->
6620: 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  inStmt = 0;.}../
6630: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
6640: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
6650: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
6660: 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  e number.  Retur
6670: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
6680: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
6690: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
66a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
66b0: 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
66c0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
66d0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
66e0: 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  r *p = pPager->a
66f0: 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28  Hash[pager_hash(
6700: 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28  pgno)];.  while(
6710: 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70   p && p->pgno!=p
6720: 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  gno ){.    p = p
6730: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
6740: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
6750: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
6760: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
6770: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
6780: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
6790: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
67a0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
67b0: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
67c0: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
67d0: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
67e0: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
67f0: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
6800: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
6810: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
6820: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
6830: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
6840: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
6850: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
6860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6870: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
6880: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
6890: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
68a0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
68b0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
68c0: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  Pg=pNext){.    p
68d0: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
68e0: 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
68f0: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
6900: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
6910: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
6920: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
6930: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
6940: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
6950: 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  pAll = 0;.  mems
6960: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
6970: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
6980: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70  er->aHash));.  p
6990: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
69a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
69b0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
69c0: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
69d0: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
69e0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
69f0: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
6a00: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
6a10: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  O_LOCK);.  pPage
6a20: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
6a30: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
6a40: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
6a50: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
6a60: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
6a70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
6a80: 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n==0 );.}../*.**
6a90: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
6aa0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
6ab0: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
6ac0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
6ad0: 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52  n and.** a RESER
6ae0: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
6af0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
6b00: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
6b10: 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a  tine releases.**
6b20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
6b30: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
6b40: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
6b50: 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65   its place.  The
6b60: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
6b70: 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20   is deleted and 
6b80: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  closed..**.** TO
6b90: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
6ba0: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
6bb0: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
6bc0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
6bd0: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
6be0: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
6bf0: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
6c00: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
6c10: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
6c20: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
6c30: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
6c40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
6c50: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50  er_unwritelock(P
6c60: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6c70: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 61   PgHdr *pPg;.  a
6c80: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
6c90: 6d 65 6d 44 62 20 29 3b 0a 20 20 69 66 28 20 70  memDb );.  if( p
6ca0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
6cb0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
6cc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6cd0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
6ce0: 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
6cf0: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
6d00: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
6d10: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
6d20: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
6d30: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
6d40: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
6d50: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
6d60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
6d70: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
6d80: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
6d90: 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  >jfd);.    pPage
6da0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
6db0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   0;.    sqlite3O
6dc0: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
6dd0: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73  zJournal);.    s
6de0: 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
6df0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->aInJournal );
6e00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
6e10: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
6e20: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
6e30: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
6e40: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
6e50: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
6e60: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
6e70: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
6e80: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
6e90: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
6ea0: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
6eb0: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70  Cache = 0;.    p
6ec0: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
6ed0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6ee0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
6ef0: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
6f00: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
6f10: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71  l==0 );.  }.  sq
6f20: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
6f30: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
6f40: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  D_LOCK);.  pPage
6f50: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
6f60: 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65  _SHARED;.  pPage
6f70: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
6f80: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
6f90: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72 65  Master = 0;.  re
6fa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
6fc0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
6fd0: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
6fe0: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
6ff0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
7000: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
7010: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
7020: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
7030: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
7040: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
7050: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
7060: 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64   We experimented
7070: 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b   with.** a check
7080: 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72  sum of the entir
7090: 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74  e data, but that
70a0: 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65   was found to be
70b0: 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   too slow..**.**
70c0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
70d0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74  age number is st
70e0: 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69  ored at the begi
70f0: 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e  nning of data an
7100: 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75  d.** the checksu
7110: 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  m is stored at t
7120: 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73  he end.  This is
7130: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20   important.  If 
7140: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75  journal.** corru
7150: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
7160: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
7170: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
7180: 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a  kely scenario.**
7190: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
71a0: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
71b0: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
71c0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74   be changed.  It
71d0: 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73   is.** much less
71e0: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
71f0: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
7200: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
7210: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
7220: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
7230: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
7240: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
7250: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
7260: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
7270: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
7280: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
7290: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
72a0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tion..**.** FIX 
72b0: 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64  ME:  Consider ad
72c0: 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68  ding every 200th
72d0: 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66   (or so) byte of
72e0: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
72f0: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54  .** checksum.  T
7300: 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e  hat way if a sin
7310: 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33  gle page spans 3
7320: 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65   or more disk se
7330: 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c  ctors and.** onl
7340: 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63  y the middle sec
7350: 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20  tor is corrupt, 
7360: 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61  we will still ha
7370: 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a  ve a reasonable.
7380: 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69  ** chance of fai
7390: 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  ling the checksu
73a0: 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63  m and thus detec
73b0: 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ting the problem
73c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
73d0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
73e0: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
73f0: 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72  pgno, const char
7400: 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
7410: 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
7420: 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74  cksumInit;.  int
7430: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
7440: 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69  eSize-200;.  whi
7450: 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
7460: 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
7470: 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
7480: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
7490: 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  um;.}../*.** Rea
74a0: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
74b0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
74c0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
74d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
74e0: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
74f0: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
7500: 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73  .**.** If useCks
7510: 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  um==0 it means t
7520: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  his journal does
7530: 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75   not use checksu
7540: 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a  ms.  Checksums.*
7550: 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69  * are not used i
7560: 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  n statement jour
7570: 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61  nals because sta
7580: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
7590: 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74  do not.** need t
75a0: 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20  o survive power 
75b0: 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61  failures..*/.sta
75c0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
75d0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
75e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f  Pager *pPager, O
75f0: 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20  sFile *jfd, int 
7600: 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74  useCksum){.  int
7610: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
7620: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
7630: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
7640: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
7650: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
7660: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7680: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
7690: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
76a0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
76d0: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
76e0: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
76f0: 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41   aData[SQLITE_MA
7700: 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f  X_PAGE_SIZE];  /
7710: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66  * Temp storage f
7720: 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20  or a page */..  
7730: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7740: 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  jfd, &pgno);.  i
7750: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7760: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7770: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7780: 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20  ad(jfd, &aData, 
7790: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
77a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
77b0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
77c0: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
77d0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
77e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
77f0: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
7800: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
7810: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
7820: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
7830: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
7840: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
7850: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
7860: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
7870: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
7880: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
7890: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
78a0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
78b0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
78c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
78d0: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
78e0: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
78f0: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
7900: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
7910: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
7920: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
7930: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
7940: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
7950: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7960: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
7970: 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67   if( pgno>(unsig
7980: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
7990: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
79a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
79b0: 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29    if( useCksum )
79c0: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
79d0: 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75  2bits(jfd, &cksu
79e0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
79f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7a00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7a10: 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28  ff += 4;.    if(
7a20: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
7a30: 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61  ger, pgno, aData
7a40: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
7a50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7a60: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
7a70: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7a80: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
7a90: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
7aa0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
7ab0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
7ac0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
7ad0: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
7ae0: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
7af0: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
7b00: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
7b10: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
7b20: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
7b30: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
7b40: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
7b50: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
7b60: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
7b70: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
7b80: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
7b90: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
7ba0: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
7bb0: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
7bc0: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
7bd0: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
7be0: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
7bf0: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
7c00: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
7c10: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
7c20: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61  .  */.  pPg = pa
7c30: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
7c40: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
7c50: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
7c60: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
7c70: 56 45 20 7c 7c 20 70 50 67 20 29 3b 0a 20 20 54  VE || pPg );.  T
7c80: 52 41 43 45 32 28 22 50 4c 41 59 42 41 43 4b 20  RACE2("PLAYBACK 
7c90: 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 67 6e 6f  page %d\n", pgno
7ca0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
7cb0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
7cc0: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 73  CLUSIVE ){.    s
7cd0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
7ce0: 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d  ager->fd, (pgno-
7cf0: 31 29 2a 28 6f 66 66 5f 74 29 70 50 61 67 65 72  1)*(off_t)pPager
7d00: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
7d10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
7d20: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  rite(&pPager->fd
7d30: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
7d40: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
7d50: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
7d60: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
7d70: 6c 64 20 65 76 65 72 20 62 65 20 72 6f 6c 6c 65  ld ever be rolle
7d80: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
7d90: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 20 66 6f  n use, except fo
7da0: 72 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 31 20  r page.    ** 1 
7db0: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
7dc0: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
7dd0: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
7de0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
7df0: 20 20 20 2a 2a 20 61 63 74 69 76 65 2e 0a 20 20     ** active..  
7e00: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
7e10: 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
7e20: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
7e30: 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  | pPg->pgno==1 )
7e40: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  ;.    pData = PG
7e50: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
7e60: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
7e70: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
7e80: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
7e90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
7ea0: 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a  estructor ){  /*
7eb0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75  ** FIX ME:  Shou
7ec0: 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e  ld this be xRein
7ed0: 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70  it? ***/.      p
7ee0: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
7ef0: 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72  or(pData, pPager
7f00: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
7f10: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
7f20: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
7f30: 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
7f40: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
7f50: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
7f60: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
7f70: 7d 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67  }.    CODEC(pPag
7f80: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
7f90: 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20  pgno, 3);.  }.  
7fa0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7fb0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
7fc0: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
7fd0: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
7fe0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
7ff0: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
8000: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
8010: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
8020: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
8030: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
8040: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
8050: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
8060: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
8070: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
8080: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8090: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
80a0: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
80b0: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
80c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
80d0: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
80e0: 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72  f all child jour
80f0: 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c  nals..** To tell
8100: 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   if a master jou
8110: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
8120: 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61  ted, check to ea
8130: 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69  ch of the.** chi
8140: 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63  ldren.  If all c
8150: 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68  hildren are eith
8160: 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f  er missing or do
8170: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a   not refer to.**
8180: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73   a different mas
8190: 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ter journal, the
81a0: 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f  n this master jo
81b0: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
81c0: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
81d0: 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
81e0: 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
81f0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
8200: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
8210: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46  _open = 0;.  OsF
8220: 69 6c 65 20 6d 61 73 74 65 72 3b 0a 20 20 63 68  ile master;.  ch
8230: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
8240: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
8250: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
8260: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
8270: 6f 66 66 5f 74 20 6e 4d 61 73 74 65 72 4a 6f 75  off_t nMasterJou
8280: 72 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a  rnal;     /* Siz
8290: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
82a0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
82b0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
82c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
82d0: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
82e0: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
82f0: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
8300: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
8310: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
8320: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
8330: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
8340: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d    */.  memset(&m
8350: 61 73 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  aster, 0, sizeof
8360: 28 6d 61 73 74 65 72 29 29 3b 0a 20 20 72 63 20  (master));.  rc 
8370: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
8380: 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c  eadOnly(zMaster,
8390: 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28   &master);.  if(
83a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
83b0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
83c0: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
83d0: 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  en = 1;.  rc = s
83e0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
83f0: 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (&master, &nMast
8400: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
8410: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8420: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
8430: 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
8440: 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
8450: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  .    char *zJour
8460: 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  nal;.    char *z
8470: 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a  MasterPtr = 0;..
8480: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
8490: 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
84a0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
84b0: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
84c0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  rom.    ** sqlit
84d0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  eMalloc() and po
84e0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
84f0: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
8500: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
8510: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
8520: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d  )sqliteMalloc(nM
8530: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
8540: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
8550: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
8560: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
8570: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
8580: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
8590: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
85a0: 74 65 33 4f 73 52 65 61 64 28 26 6d 61 73 74 65  te3OsRead(&maste
85b0: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
85c0: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
85d0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
85e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
85f0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
8600: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
8610: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
8620: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
8630: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
8640: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
8650: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
8660: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
8670: 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29  ists(zJournal) )
8680: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
8690: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
86a0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
86b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
86c0: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
86d0: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
86e0: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
86f0: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
8700: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
8710: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
8720: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
8730: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
8740: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
8750: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8760: 20 4f 73 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b   OsFile journal;
8770: 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ..        memset
8780: 28 26 6a 6f 75 72 6e 61 6c 2c 20 30 2c 20 73 69  (&journal, 0, si
8790: 7a 65 6f 66 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a  zeof(journal));.
87a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
87b0: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
87c0: 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f  ly(zJournal, &jo
87d0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
87e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
87f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
8800: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
8810: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
8820: 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
8830: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f  asterJournal(&jo
8840: 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50  urnal, &zMasterP
8850: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  tr);.        sql
8860: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75  ite3OsClose(&jou
8870: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
8880: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8890: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
88a0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
88b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
88c0: 20 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72       if( zMaster
88d0: 50 74 72 20 26 26 20 21 73 74 72 63 6d 70 28 7a  Ptr && !strcmp(z
88e0: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
88f0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
8900: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
8910: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
8920: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
8930: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
8940: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
8950: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
8960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8970: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
8980: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
8990: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
89a0: 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44  .  .  sqlite3OsD
89b0: 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a  elete(zMaster);.
89c0: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
89d0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
89e0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
89f0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  teFree(zMasterJo
8a00: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
8a10: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
8a20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
8a30: 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a  Close(&master);.
8a40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65  .}../*.** Make e
8a60: 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
8a70: 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74   cache agree wit
8a80: 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
8a90: 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
8aa0: 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68  ds,.** reread th
8ab0: 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20  e disk to reset 
8ac0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
8ad0: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
8ae0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8af0: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c  lled after a rol
8b00: 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73  lback in which s
8b10: 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79  ome of the dirty
8b20: 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20   cache.** pages 
8b30: 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77  had never been w
8b40: 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69  ritten out to di
8b50: 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  sk.  We need to 
8b60: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a  roll back the.**
8b70: 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61   cache content a
8b80: 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77  nd the easiest w
8b90: 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73  ay to do that is
8ba0: 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f   to reread the o
8bb0: 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61  ld content.** ba
8bc0: 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ck from the disk
8bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8be0: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
8bf0: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
8c00: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
8c10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8c20: 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67  TE_OK;.  for(pPg
8c30: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
8c40: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
8c50: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72  xtAll){.    char
8c60: 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58   zBuf[SQLITE_MAX
8c70: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20  _PAGE_SIZE];.   
8c80: 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79   if( !pPg->dirty
8c90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8ca0: 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
8cb0: 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
8cc0: 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
8cd0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
8ce0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  (&pPager->fd, pP
8cf0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
8d00: 6f 66 66 5f 74 29 28 70 50 67 2d 3e 70 67 6e 6f  off_t)(pPg->pgno
8d10: 2d 31 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  -1));.      rc =
8d20: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26   sqlite3OsRead(&
8d30: 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
8d40: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8d50: 7a 65 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ze);.      TRACE
8d60: 32 28 22 52 45 46 45 54 43 48 20 70 61 67 65 20  2("REFETCH page 
8d70: 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
8d80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
8d90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43  ) break;.      C
8da0: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75  ODEC(pPager, zBu
8db0: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
8dc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8dd0: 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20     memset(zBuf, 
8de0: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
8df0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
8e00: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
8e10: 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   || memcmp(zBuf,
8e20: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
8e30: 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
8e40: 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  eSize) ){.      
8e50: 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
8e60: 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c  DATA(pPg), zBuf,
8e70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8e80: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  e);.      if( pP
8e90: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
8ea0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
8eb0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48  r->xReiniter(PGH
8ec0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
8ed0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8ee0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
8ef0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
8f00: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
8f10: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
8f20: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
8f30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8f40: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
8f50: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
8f60: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
8f70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8f80: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
8f90: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
8fa0: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
8fb0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
8fc0: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
8fd0: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
8fe0: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
8ff0: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
9000: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
9010: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
9020: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
9030: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
9040: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
9050: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
9060: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
9070: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
9080: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
9090: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
90a0: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
90b0: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
90c0: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
90d0: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
90e0: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
90f0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
9100: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
9110: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
9120: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
9130: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
9140: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
9150: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
9160: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
9170: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
9180: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
9190: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
91a0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
91b0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
91c0: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
91d0: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
91e0: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
91f0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
9200: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
9210: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
9220: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
9230: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9240: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
9250: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
9260: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
9270: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
9280: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
9290: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
92a0: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
92b0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
92c0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
92d0: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
92e0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
92f0: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
9300: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
9310: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
9320: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
9330: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
9340: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
9350: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
9360: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
9370: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
9380: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
9390: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
93a0: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
93b0: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
93c0: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
93d0: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
93e0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
93f0: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
9400: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
9410: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
9420: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
9430: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
9440: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
9450: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
9460: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
9470: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
9480: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
9490: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
94a0: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
94b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
94c0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
94d0: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
94e0: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
94f0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
9500: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
9510: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
9520: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
9530: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
9540: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
9550: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
9560: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
9570: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
9580: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
9590: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
95a0: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
95b0: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
95c0: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
95d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
95e0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
95f0: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
9600: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
9610: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
9620: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
9630: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
9640: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
9650: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
9660: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
9670: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
9680: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
9690: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
96a0: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
96b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
96c0: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
96d0: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
96e0: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
96f0: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
9700: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
9710: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
9720: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
9730: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
9740: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
9750: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
9760: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
9770: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
9780: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
9790: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
97a0: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
97b0: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
97c0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
97d0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
97e0: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
97f0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
9800: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
9810: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
9820: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
9830: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
9840: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
9850: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
9860: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
9870: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
9880: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
9890: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
98a0: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
98b0: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
98c0: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
98d0: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
98e0: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
98f0: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
9900: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
9910: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
9920: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
9930: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
9940: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
9950: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
9960: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
9970: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
9980: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
9990: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
99a0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
99b0: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
99c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
99d0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
99e0: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
99f0: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
9a00: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
9a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
9a20: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
9a30: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
9a40: 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20  off_t szJ;      
9a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9a60: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9a70: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
9a80: 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9aa0: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
9ab0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
9ac0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ae0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
9af0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
9b00: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
9b10: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
9b20: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
9b30: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b50: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
9b60: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
9b70: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
9b80: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
9b90: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
9ba0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
9bb0: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
9bc0: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
9bd0: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
9be0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
9bf0: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
9c00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9c10: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
9c20: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
9c30: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
9c40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
9c50: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a  eSize(&pPager->j
9c60: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
9c70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9c80: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
9c90: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
9ca0: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
9cb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
9cc0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
9cd0: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
9ce0: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
9cf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9d00: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
9d10: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
9d20: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
9d30: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
9d40: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
9d50: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
9d60: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
9d70: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
9d80: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
9d90: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
9da0: 61 6c 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al(&pPager->jfd,
9db0: 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73   &zMaster);.  as
9dc0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
9dd0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
9de0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
9df0: 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c  (zMaster && !sql
9e00: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
9e10: 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20  (zMaster)) ){.  
9e20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
9e30: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
9e40: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
9e50: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
9e60: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
9e70: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
9e80: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73  layback;.  }.  s
9e90: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
9ea0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
9eb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9ec0: 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  Off = 0;..  /* T
9ed0: 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
9ee0: 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
9ef0: 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  the readJournalH
9f00: 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  dr() call return
9f10: 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  s.  ** SQLITE_DO
9f20: 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
9f30: 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77  r occurs. */.  w
9f40: 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20  hile( 1 ){..    
9f50: 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
9f60: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9f70: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
9f80: 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
9f90: 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
9fa0: 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
9fb0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
9fc0: 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
9fd0: 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
9fe0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
9ff0: 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
a000: 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66  rocess must of f
a010: 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
a020: 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
a030: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
a040: 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
a050: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
a060: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
a070: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
a080: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
a090: 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
a0a0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a0b0: 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
a0c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
a0d0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
a0e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
a100: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
a110: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
a120: 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
a130: 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
a140: 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
a150: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
a160: 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
a170: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
a180: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
a190: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
a1a0: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
a1b0: 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
a1c0: 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
a1d0: 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
a1e0: 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
a1f0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
a200: 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
a210: 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
a220: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
a230: 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
a240: 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
a250: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
a260: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
a270: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
a280: 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
a290: 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
a2a0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
a2b0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
a2c0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
a2d0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
a2e0: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
a2f0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
a300: 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
a310: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
a320: 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
a330: 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73   it's original s
a340: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
a350: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
a360: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
a370: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
a380: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a390: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
a3a0: 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ze==0 || pPager-
a3b0: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50  >origDbSize==mxP
a3c0: 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g );.      rc = 
a3d0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
a3e0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  e(&pPager->fd, p
a3f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
a400: 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a 20 20  (off_t)mxPg);.  
a410: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a420: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a430: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
a440: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
a450: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
a460: 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
a470: 20 20 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c 69      /* rc = sqli
a480: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
a490: 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41 4c 5f  r->jfd, JOURNAL_
a4a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  HDR_SZ(pPager));
a4b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d   */.    if( rc!=
a4c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a4d0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
a4e0: 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72   .    /* Copy or
a4f0: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
a500: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
a510: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
a520: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
a530: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
a540: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
a550: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
a560: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
a570: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
a580: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
a590: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a5a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a5b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a5c0: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
a5d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a5e0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OK;.          pP
a5f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a600: 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
a610: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a630: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
a640: 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
a650: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a660: 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61  ..  /* Pages tha
a670: 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
a680: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
a690: 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e  al but never syn
a6a0: 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e  ced.  ** where n
a6b0: 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79 20 74  ot restored by t
a6c0: 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20  he loop above.  
a6d0: 57 65 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f  We have to resto
a6e0: 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61  re those.  ** pa
a6f0: 67 65 73 20 62 79 20 72 65 61 64 69 6e 67 20 74  ges by reading t
a700: 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  hem back from th
a710: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
a720: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ase..  */.  asse
a730: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
a740: 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f 72 65 6c  K );.  pager_rel
a750: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
a760: 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
a770: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
a780: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
a790: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
a7a0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
a7b0: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29  .  if( zMaster )
a7c0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
a7d0: 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
a7e0: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
a7f0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
a800: 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a  urn true,.    **
a810: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
a820: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
a830: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a840: 6e 61 6c 2e 20 49 66 20 65 72 72 6f 72 73 20 0a  nal. If errors .
a850: 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 64 75 72      ** occur dur
a860: 69 6e 67 20 74 68 69 73 20 70 72 6f 63 65 73 73  ing this process
a870: 2c 20 69 67 6e 6f 72 65 20 74 68 65 6d 2e 0a 20  , ignore them.. 
a880: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
a890: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a8a0: 20 20 20 20 20 70 61 67 65 72 5f 64 65 6c 6d 61       pager_delma
a8b0: 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20  ster(zMaster);. 
a8c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
a8d0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
a8e0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
a8f0: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
a900: 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
a910: 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
a920: 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
a930: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
a940: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
a950: 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
a960: 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52  ent PAGER_SECTOR
a970: 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65  _SIZE.  ** value
a980: 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
a990: 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
a9a0: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
a9b0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
a9c0: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41  >sectorSize = PA
a9d0: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  GER_SECTOR_SIZE;
a9e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a9f0: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
aa00: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
aa10: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
aa20: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
aa30: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
aa40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
aa50: 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a  rnal but with.**
aa60: 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69   a few extra twi
aa70: 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  sts..**.**    (1
aa80: 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  )  The number of
aa90: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
aaa0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
aab0: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20  he start of.**  
aac0: 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65         the state
aad0: 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  ment is stored i
aae0: 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  n pPager->stmtSi
aaf0: 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
ab00: 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
ab10: 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
ab20: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
ab30: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
ab40: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61  ing back the sta
ab50: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20  tement journal, 
ab60: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  also.**         
ab70: 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67  playback all pag
ab80: 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  es of the transa
ab90: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65  ction journal be
aba0: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ginning.**      
abb0: 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61     at offset pPa
abc0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a  ger->stmtJSize..
abd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
abe0: 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
abf0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
ac00: 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20  {.  off_t szJ;  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac20: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
ac30: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 6f 66   journal */.  of
ac40: 66 5f 74 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  f_t hdrOff;.  in
ac50: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
ac60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ac70: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
ac80: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
ac90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
aca0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
acb0: 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
acc0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
acd0: 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
ace0: 55 47 20 0a 20 20 7b 0a 20 20 20 20 6f 66 66 5f  UG .  {.    off_
acf0: 74 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63  t os_szJ;.    rc
ad00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
ad10: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
ad20: 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20  d, &os_szJ);.   
ad30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ad40: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
ad50: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d      assert( szJ=
ad60: 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23  =os_szJ );.  }.#
ad70: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
ad80: 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65  hdrOff to be the
ad90: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 66   offset to the f
ada0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
adb0: 64 65 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  der written.  **
adc0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
add0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
ade0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
adf0: 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61  ile if no journa
ae00: 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61  l.  ** header wa
ae10: 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  s written..  */.
ae20: 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65    hdrOff = pPage
ae30: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20  r->stmtHdrOff;. 
ae40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ae50: 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64  >fullSync || !hd
ae60: 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68  rOff );.  if( !h
ae70: 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72  drOff ){.    hdr
ae80: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20  Off = szJ;.  }. 
ae90: 20 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65   ..  /* Truncate
aea0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
aeb0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
aec0: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
aed0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
aee0: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
aef0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
af00: 53 69 7a 65 2a 28 6f 66 66 5f 74 29 70 50 61 67  Size*(off_t)pPag
af10: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20  er->stmtSize);. 
af20: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
af30: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
af40: 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  ze;..  /* Figure
af50: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
af60: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
af70: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
af80: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
af90: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  t( pPager->stmtI
afa0: 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e  nUse && pPager->
afb0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
afc0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
afd0: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
afe0: 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65  ;.  nRec = pPage
aff0: 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a  r->stmtNRec;.  .
b000: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
b010: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
b020: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b030: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
b040: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
b050: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
b060: 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
b070: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69  ment journal omi
b080: 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f  ts checksums fro
b090: 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f  m.  ** each reco
b0a0: 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66  rd since power-f
b0b0: 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20  ailure recovery 
b0c0: 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  is not important
b0d0: 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20   to statement.  
b0e0: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ** journals..  *
b0f0: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
b100: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
b110: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
b120: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
b130: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
b140: 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73  stfd, 0);.    as
b150: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
b160: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
b170: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b180: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
b190: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
b1a0: 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65  /* Now roll some
b1b0: 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d   pages back from
b1c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
b1d0: 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e   journal. Pager.
b1e0: 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77  stmtJSize.  ** w
b1f0: 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  as the size of t
b200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b210: 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  when this statem
b220: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c  ent was started,
b230: 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68   so.  ** everyth
b240: 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e  ing after that n
b250: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
b260: 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69  d back, either i
b270: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
b280: 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72  abase, the memor
b290: 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68  y cache, or both
b2a0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
b2b0: 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
b2c0: 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64  hen Pager.stmtHd
b2d0: 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73  rOff is the offs
b2e0: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
b2f0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
b300: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
b310: 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20   written during 
b320: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74  this statement t
b330: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
b340: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
b350: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
b360: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  fd, pPager->stmt
b370: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
b380: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b390: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
b3a0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
b3b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b3c0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
b3d0: 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
b3e0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
b3f0: 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
b400: 3b 0a 20 20 61 73 73 65 72 74 28 20 4a 4f 55 52  ;.  assert( JOUR
b410: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
b420: 72 29 3c 28 70 50 61 67 65 72 2d 3e 70 61 67 65  r)<(pPager->page
b430: 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68 69  Size+8) );.  whi
b440: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
b450: 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66  nalOff <= (hdrOf
b460: 66 2d 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f-(pPager->pageS
b470: 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20 20 72  ize+8)) ){.    r
b480: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
b490: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
b4a0: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
b4b0: 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
b4c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
b4d0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
b4e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
b4f0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
b500: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
b510: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
b520: 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
b530: 20 20 20 75 33 32 20 6e 52 65 63 3b 0a 20 20 20     u32 nRec;.   
b540: 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
b550: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
b560: 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
b570: 20 26 6e 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b   &nRec, &dummy);
b580: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
b590: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b5a0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
b5b0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
b5c0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
b5d0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
b5e0: 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 29     if( nRec==0 )
b5f0: 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
b600: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
b610: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61  urnalOff) / (pPa
b620: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
b630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
b640: 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26  i=nRec-1; i>=0 &
b650: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
b660: 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29  lOff < szJ; i--)
b670: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
b680: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
b690: 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
b6a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
b6b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
b6c0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
b6d0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
b6e0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
b6f0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
b700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
b710: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b720: 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
b730: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
b740: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b750: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
b760: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
b770: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
b780: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b790: 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65  CORRUPT;.  }else
b7a0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
b7b0: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
b7c0: 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c      /* pager_rel
b7d0: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
b7e0: 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ); */.  }.  retu
b7f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b800: 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
b810: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
b820: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
b830: 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
b840: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
b850: 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61   number is the a
b860: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66  bsolute value of
b870: 20 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61   the mxPage para
b880: 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50  meter..** If mxP
b890: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
b8a0: 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67   the noSync flag
b8b0: 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e   is also set.  n
b8c0: 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a  oSync bypasses.*
b8d0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
b8e0: 65 33 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65  e3OsSync().  The
b8f0: 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68   pager runs much
b900: 20 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53   faster with noS
b910: 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69  ync on,.** but i
b920: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
b930: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
b940: 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62  r there is an ab
b950: 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66  rupt power .** f
b960: 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61  ailure, the data
b970: 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20  base file might 
b980: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
b990: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a  consistent and.*
b9a0: 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73  * unrepairable s
b9b0: 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tate.  .*/.void 
b9c0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
b9d0: 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  _cachesize(Pager
b9e0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
b9f0: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
ba00: 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50  age>=0 ){.    pP
ba10: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
ba20: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
ba30: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
ba40: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
ba50: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
ba60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
ba70: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31  ager->noSync = 1
ba80: 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d  ;.    mxPage = -
ba90: 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66  mxPage;.  }.  if
baa0: 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20  ( mxPage>10 ){. 
bab0: 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
bac0: 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65  e = mxPage;.  }e
bad0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
bae0: 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20  >mxPage = 10;.  
baf0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
bb00: 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
bb10: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
bb20: 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
bb30: 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
bb40: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
bb50: 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
bb60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
bb70: 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
bb80: 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
bb90: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
bba0: 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
bbb0: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
bbc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
bbd0: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
bbe0: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
bbf0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
bc10: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
bc20: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
bc30: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
bc40: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
bc50: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
bc60: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
bc70: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
bc80: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
bc90: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
bca0: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
bcb0: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
bcd0: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
bce0: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
bcf0: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
bd00: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
bd10: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
bd20: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
bd30: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
bd40: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
bd50: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
bd60: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
bd70: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
bd80: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
bd90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
bda0: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
bdb0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
bdc0: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
bdd0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
bde0: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
bdf0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
be00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
be10: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
be20: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
be30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
be40: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
be60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
be70: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
be80: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
be90: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
bea0: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
beb0: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
bec0: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
bed0: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
bee0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
bef0: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
bf00: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
bf10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
bf20: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
bf30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
bf40: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
bf50: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
bf60: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
bf70: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
bf80: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
bf90: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
bfa0: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
bfb0: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
bfc0: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
bfd0: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
bfe0: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
bff0: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64   FULL=3..*/.void
c000: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
c010: 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50  t_safety_level(P
c020: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
c030: 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67  t level){.  pPag
c040: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
c050: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
c060: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
c070: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
c080: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
c090: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
c0a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
c0b0: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
c0c0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a  eedSync = 0;.}..
c0d0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
c0e0: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72  porary file.  Wr
c0f0: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
c100: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e  the file into zN
c110: 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75  ame.** (zName mu
c120: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 53  st be at least S
c130: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
c140: 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29  IZE bytes long.)
c150: 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66    Write.** the f
c160: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
c170: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
c180: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
c190: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
c1a0: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
c1b0: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
c1c0: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
c1d0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
c1e0: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
c1f0: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
c200: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
c210: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
c220: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
c230: 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f  p(char *zFile, O
c240: 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e  sFile *fd){.  in
c250: 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74  t cnt = 8;.  int
c260: 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63   rc;.  do{.    c
c270: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
c280: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
c290: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
c2a0: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
c2b0: 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66  clusive(zFile, f
c2c0: 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28  d, 1);.  }while(
c2d0: 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51   cnt>0 && rc!=SQ
c2e0: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
c2f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
c300: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c310: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
c320: 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  w page cache and
c330: 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
c340: 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
c350: 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a   in *ppPager..**
c360: 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   The file to be 
c370: 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20  cached need not 
c380: 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65  exist.  The file
c390: 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75   is not locked u
c3a0: 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73  ntil.** the firs
c3b0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
c3c0: 33 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64  3pager_get() and
c3d0: 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
c3e0: 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
c3f0: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
c400: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
c410: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
c420: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
c430: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
c440: 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
c450: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
c460: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
c470: 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
c480: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
c490: 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c  d.  The file wil
c4a0: 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  l be deleted.** 
c4b0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
c4c0: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
c4d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
c4e0: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
c4f0: 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72  " then all infor
c500: 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
c510: 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69  n cache..** It i
c520: 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
c530: 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63  to disk.  This c
c540: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
c550: 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e  plement an.** in
c560: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
c570: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c580: 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61  pager_open(.  Pa
c590: 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
c5a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
c5b0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
c5c0: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
c5d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
c5e0: 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
c5f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
c600: 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
c610: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
c620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
c630: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
c640: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
c650: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
c660: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 20 20 20 20   useJournal     
c670: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f        /* TRUE to
c680: 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   use a rollback 
c690: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
c6a0: 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  file */.){.  Pag
c6b0: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68  er *pPager;.  ch
c6c0: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
c6d0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d  e = 0;.  int nam
c6e0: 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66  eLen;.  OsFile f
c6f0: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
c700: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
c710: 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
c720: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44   = 0;.  int memD
c730: 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
c740: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61  dOnly = 0;.  cha
c750: 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
c760: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a  EMPNAME_SIZE];..
c770: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
c780: 20 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c    memset(&fd, 0,
c790: 20 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20   sizeof(fd));.  
c7a0: 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  if( sqlite3_mall
c7b0: 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  oc_failed ){.   
c7c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c7d0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
c7e0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
c7f0: 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
c800: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
c810: 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
c820: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
c830: 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
c840: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
c850: 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b  qliteStrDup("");
c860: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c870: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
c880: 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  {.      zFullPat
c890: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
c8a0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
c8b0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
c8c0: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
c8d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
c8e0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
c8f0: 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61  eadWrite(zFullPa
c900: 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65  thname, &fd, &re
c910: 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d  adOnly);.      }
c920: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
c930: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c940: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
c950: 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20  Temp, &fd);.    
c960: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d  zFilename = zTem
c970: 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  p;.    zFullPath
c980: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
c990: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
c9a0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
c9b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c9c0: 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65  {.      tempFile
c9d0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
c9e0: 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68    if( !zFullPath
c9f0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  name ){.    sqli
ca00: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
ca10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ca20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
ca30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ca40: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
ca50: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
ca60: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
ca70: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
ca80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
ca90: 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c    nameLen = strl
caa0: 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  en(zFullPathname
cab0: 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  );.  pPager = sq
cac0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
cad0: 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61  of(*pPager) + na
cae0: 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a  meLen*3 + 30 );.
caf0: 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20    if( pPager==0 
cb00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
cb10: 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20  Close(&fd);.    
cb20: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
cb30: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
cb40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
cb50: 45 4d 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 50 41  EM;.  }.  SET_PA
cb60: 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20 20 70  GER(pPager);.  p
cb70: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
cb80: 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
cb90: 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
cba0: 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
cbb0: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
cbc0: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50  nameLen+1];.  pP
cbd0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
cbe0: 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
cbf0: 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  tory[nameLen+1];
cc00: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
cc10: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75  ->zFilename, zFu
cc20: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
cc30: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  trcpy(pPager->zD
cc40: 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50  irectory, zFullP
cc50: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  athname);.  for(
cc60: 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26  i=nameLen; i>0 &
cc70: 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
cc80: 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
cc90: 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
cca0: 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
ccb0: 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
ccc0: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
ccd0: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c  >zJournal, zFull
cce0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c  Pathname);.  sql
ccf0: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
cd00: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
cd10: 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
cd20: 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a  al[nameLen], "-j
cd30: 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67  ournal");.  pPag
cd40: 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 23 69 66  er->fd = fd;.#if
cd50: 20 4f 53 5f 55 4e 49 58 0a 20 20 70 50 61 67 65   OS_UNIX.  pPage
cd60: 72 2d 3e 66 64 2e 70 50 61 67 65 72 20 3d 20 70  r->fd.pPager = p
cd70: 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20  Pager;.#endif.  
cd80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cd90: 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  pen = 0;.  pPage
cda0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
cdb0: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d  useJournal && !m
cdc0: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
cdd0: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
cde0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
cdf0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
ce00: 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 50 61  >nRef = 0;.  pPa
ce10: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65  ger->dbSize = me
ce20: 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d  mDb-1;.  pPager-
ce30: 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49  >pageSize = SQLI
ce40: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
ce50: 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e  SIZE;.  pPager->
ce60: 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20  stmtSize = 0;.  
ce70: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
ce80: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
ce90: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
cea0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
ceb0: 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  00;.  pPager->st
cec0: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
ced0: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  CK;.  pPager->er
cee0: 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  rMask = 0;.  pPa
cef0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
cf00: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
cf10: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
cf20: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
cf30: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
cf40: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
cf50: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
cf60: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
cf70: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
cf80: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
cf90: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
cfa0: 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
cfb0: 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
cfc0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
cfd0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
cfe0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
cff0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
d000: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
d010: 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61   = nExtra;.  pPa
d020: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
d030: 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  = PAGER_SECTOR_S
d040: 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  IZE;.  pPager->p
d050: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
d060: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
d070: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
d080: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
d090: 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ));.  *ppPager =
d0a0: 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
d0b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d0c0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
d0d0: 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
d0e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
d0f0: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75  ite3pager_set_bu
d100: 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20  syhandler(Pager 
d110: 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e  *pPager, BusyHan
d120: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
d130: 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er){.  pPager->p
d140: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42  BusyHandler = pB
d150: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f  usyHandler;.}../
d160: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
d170: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
d180: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
d190: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
d1a0: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
d1b0: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
d1c0: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
d1d0: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
d1e0: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
d1f0: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
d200: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
d210: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
d220: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
d230: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
d240: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
d250: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
d260: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
d270: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70   result sqlite3p
d280: 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a  ager_close().  .
d290: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
d2a0: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
d2b0: 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  y sqlite3pager_u
d2c0: 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nref()..*/.void 
d2d0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
d2e0: 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  _destructor(Page
d2f0: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
d300: 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69  (*xDesc)(void*,i
d310: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
d320: 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44  xDestructor = xD
d330: 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  esc;.}../*.** Se
d340: 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  t the reinitiali
d350: 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  zer for this pag
d360: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
d370: 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  , the reinitiali
d380: 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  zer.** is called
d390: 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
d3a0: 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63  t of a page in c
d3b0: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
d3c0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
d3d0: 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72  .** value as a r
d3e0: 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62  esult of a rollb
d3f0: 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61  ack.  The callba
d400: 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d  ck gives higher-
d410: 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e  level code.** an
d420: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
d430: 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52  restore the EXTR
d440: 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72  A section to agr
d450: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
d460: 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74  ored.** page dat
d470: 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
d480: 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e  e3pager_set_rein
d490: 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
d4a0: 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
d4b0: 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b  it)(void*,int)){
d4c0: 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
d4d0: 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
d4e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
d4f0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
d500: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
d510: 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 63 68 61  must only be cha
d520: 6e 67 65 64 20 77 68 65 6e 20 74 68 65 20 63 61  nged when the ca
d530: 63 68 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  che is empty..*/
d540: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
d550: 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28  er_set_pagesize(
d560: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
d570: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
d580: 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
d590: 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
d5a0: 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
d5b0: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 70 50 61  GE_SIZE );.  pPa
d5c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
d5d0: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
d5e0: 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
d5f0: 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
d600: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
d610: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
d620: 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
d630: 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4e  st points to.  N
d640: 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
d650: 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69   is done..*/.voi
d660: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  d sqlite3pager_r
d670: 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28 50  ead_fileheader(P
d680: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
d690: 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
d6a0: 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65  ar *pDest){.  me
d6b0: 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
d6c0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
d6d0: 3e 6d 65 6d 44 62 3d 3d 30 20 29 7b 0a 20 20 20  >memDb==0 ){.   
d6e0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
d6f0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
d700: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65 61      sqlite3OsRea
d710: 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  d(&pPager->fd, p
d720: 44 65 73 74 2c 20 4e 29 3b 0a 20 20 7d 0a 7d 0a  Dest, N);.  }.}.
d730: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
d740: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
d750: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
d760: 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61  isk file associa
d770: 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67  ted with.** pPag
d780: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
d790: 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
d7a0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
d7b0: 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61  {.  off_t n;.  a
d7c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
d7d0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
d7e0: 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
d7f0: 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
d800: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ->dbSize;.  }.  
d810: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
d820: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66  eSize(&pPager->f
d830: 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f  d, &n)!=SQLITE_O
d840: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
d850: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
d860: 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20  R_ERR_DISK;.    
d870: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d880: 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  n /= pPager->pag
d890: 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50  eSize;.  if( !pP
d8a0: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 6e  ager->memDb && n
d8b0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
d8c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
d8d0: 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
d8e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
d8f0: 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
d900: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
d910: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d  >dbSize = n;.  }
d920: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
d930: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
d940: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
d950: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
d960: 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f  nal(Pager*);.../
d970: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61  *.** Unlink a pa
d980: 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
d990: 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
d9a0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65  of all pages whe
d9b0: 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61  re nRef==0).** a
d9c0: 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  nd from its hash
d9d0: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
d9e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d9f0: 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64   unlinkPage(PgHd
da00: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
da10: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
da20: 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65  pPager;..  /* Ke
da30: 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e  ep the pFirstSyn
da40: 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ced pointer poin
da50: 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73  ting at the firs
da60: 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70  t synchronized p
da70: 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  age */.  if( pPg
da80: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
da90: 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67  Synced ){.    Pg
daa0: 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
dab0: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69  extFree;.    whi
dac0: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
dad0: 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
dae0: 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
daf0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
db00: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
db10: 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
db20: 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
db30: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
db40: 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
db50: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
db60: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
db70: 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  xtFree;.  }else{
db80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
db90: 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67  ger->pFirst==pPg
dba0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
dbb0: 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
dbc0: 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69  extFree;.  }.  i
dbd0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
dbe0: 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  e ){.    pPg->pN
dbf0: 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
dc00: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
dc10: 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
dc20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
dc30: 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
dc40: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
dc50: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
dc60: 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ee;.  }.  pPg->p
dc70: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
dc80: 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a  pPrevFree = 0;..
dc90: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
dca0: 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
dcb0: 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  able */.  if( pP
dcc0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
dcd0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
dce0: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
dcf0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
dd00: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
dd10: 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20  PrevHash ){.    
dd20: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e  pPg->pPrevHash->
dd30: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
dd40: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65  >pNextHash;.  }e
dd50: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d  lse{.    int h =
dd60: 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d   pager_hash(pPg-
dd70: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
dd80: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
dd90: 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20  h[h]==pPg );.   
dda0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
ddb0: 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
ddc0: 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  sh;.  }.  pPg->p
ddd0: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
dde0: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
ddf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
de00: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
de10: 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d  truncate an in-m
de20: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
de30: 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70   Delete.** all p
de40: 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20  ages whose pgno 
de50: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  is larger than p
de60: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
de70: 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
de80: 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64  d..** Referenced
de90: 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68   pages larger th
dea0: 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
deb0: 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f  e are zeroed..*/
dec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
ded0: 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61 67 65  oryTruncate(Page
dee0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
def0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64  Hdr *pPg;.  PgHd
df00: 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20  r **ppPg;.  int 
df10: 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
df20: 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67  >dbSize;..  ppPg
df30: 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c   = &pPager->pAll
df40: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  ;.  while( (pPg 
df50: 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20  = *ppPg)!=0 ){. 
df60: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
df70: 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  <=dbSize ){.    
df80: 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
df90: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
dfa0: 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  se if( pPg->nRef
dfb0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
dfc0: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
dfd0: 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
dfe0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
dff0: 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
e000: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
e010: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67  lse{.      *ppPg
e020: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
e030: 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  ;.      unlinkPa
e040: 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  ge(pPg);.      s
e050: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
e060: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
e070: 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
e080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
e090: 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
e0a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e0b0: 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
e0c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
e0d0: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
e0e0: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
e0f0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
e100: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
e110: 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
e120: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
e130: 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
e140: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
e150: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
e160: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e170: 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28  }.  if( nPage>=(
e180: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
e190: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
e1a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e1b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
e1c0: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
e1d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
e1e0: 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f   nPage;.    memo
e1f0: 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
e200: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  r);.    return S
e210: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e220: 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
e230: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
e240: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e250: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
e260: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
e270: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50  e3OsTruncate(&pP
e280: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
e290: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6f 66 66 5f  ->pageSize*(off_
e2a0: 74 29 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20  t)nPage);.  if( 
e2b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e2c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
e2d0: 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d  ize = nPage;.  }
e2e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e2f0: 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
e300: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
e310: 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
e320: 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
e330: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
e340: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
e350: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
e360: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
e370: 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
e380: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
e390: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
e3a0: 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
e3b0: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
e3c0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
e3d0: 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
e3e0: 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
e3f0: 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
e400: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
e410: 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
e420: 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
e430: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
e440: 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
e450: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
e460: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e470: 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65  pager_close(Page
e480: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
e490: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
e4a0: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50 61 67  ;.  switch( pPag
e4b0: 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20  er->state ){.   
e4c0: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53 45   case PAGER_RESE
e4d0: 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50  RVED:.    case P
e4e0: 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20  AGER_SYNCED: .  
e4f0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58 43    case PAGER_EXC
e500: 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20  LUSIVE: {.      
e510: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
e520: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
e530: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
e540: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
e550: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
e560: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
e570: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
e580: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
e590: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e5a0: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pen==0 );.      
e5b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e5c0: 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52   case PAGER_SHAR
e5d0: 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ED: {.      if( 
e5e0: 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
e5f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e600: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
e610: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
e620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e630: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e640: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
e650: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
e660: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
e670: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
e680: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
e690: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
e6a0: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
e6b0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
e6c0: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
e6d0: 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
e6e0: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
e6f0: 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
e700: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
e710: 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
e720: 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
e730: 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
e740: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e750: 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
e760: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
e770: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
e780: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
e790: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
e7a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
e7b0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64  lose(&pPager->fd
e7c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e7d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
e7e0: 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ==0 );.  /* Temp
e7f0: 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
e800: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
e810: 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
e820: 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
e830: 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
e840: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
e850: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
e860: 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20  );.  ** }.  */. 
e870: 20 43 4c 52 5f 50 41 47 45 52 28 70 50 61 67 65   CLR_PAGER(pPage
e880: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
e890: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d 28 63 68  ->zFilename!=(ch
e8a0: 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 20 29  ar*)&pPager[1] )
e8b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
e8c0: 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
e8d0: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ppen */.    sqli
e8e0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
e8f0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Filename);.    s
e900: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
e910: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
e920: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
e930: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b  er->zDirectory);
e940: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
e950: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
e960: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e970: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
e980: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
e990: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
e9a0: 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
e9b0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
e9c0: 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
e9d0: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
e9e0: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
e9f0: 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
ea00: 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
ea10: 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
ea20: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
ea30: 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
ea40: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
ea50: 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
ea60: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
ea70: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
ea80: 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
ea90: 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
eaa0: 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
eab0: 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
eac0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
ead0: 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
eae0: 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
eaf0: 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
eb00: 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
eb10: 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
eb20: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
eb30: 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
eb40: 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
eb50: 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
eb60: 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
eb70: 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
eb80: 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
eb90: 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
eba0: 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
ebb0: 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
ebc0: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
ebd0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
ebe0: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
ebf0: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
ec00: 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
ec10: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
ec20: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
ec30: 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
ec40: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
ec50: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
ec60: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
ec70: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
ec80: 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
ec90: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
eca0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
ecb0: 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
ecc0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
ecd0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
ece0: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
ecf0: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
ed00: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
ed10: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
ed20: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
ed30: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
ed40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ed50: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
ed60: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
ed70: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
ed80: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
ed90: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
eda0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
edb0: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
edc0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
edd0: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
ede0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
edf0: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
ee00: 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
ee10: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
ee20: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
ee30: 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
ee40: 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  g){.    if( pPg-
ee50: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
ee60: 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29    _page_ref(pPg)
ee70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ee80: 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a     pPg->nRef++;.
ee90: 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50        REFINFO(pP
eea0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  g);.    }.  }.#e
eeb0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
eec0: 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d  e_ref(P)   ((P)-
eed0: 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72  >nRef==0?_page_r
eee0: 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d  ef(P):(void)(P)-
eef0: 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a  >nRef++).#endif.
ef00: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
ef10: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
ef20: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
ef30: 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
ef40: 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
ef50: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
ef60: 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
ef70: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28  qlite3pager_ref(
ef80: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
ef90: 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
efa0: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
efb0: 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  );.  page_ref(pP
efc0: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
efd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
efe0: 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
eff0: 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
f000: 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
f010: 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
f020: 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
f030: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
f040: 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
f050: 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
f060: 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
f070: 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f   disk.  It is no
f080: 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79  t safe to modify
f090: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
f0a0: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
f0b0: 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a  l after.** the j
f0c0: 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
f0d0: 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20  synced.  If the 
f0e0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f0f0: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65  e is modified be
f100: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fore.** the jour
f110: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e  nal is synced an
f120: 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  d a power failur
f130: 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e  e occurs, the un
f140: 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a  synced journal.*
f150: 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20  * data would be 
f160: 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c  lost and we woul
f170: 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63  d be unable to c
f180: 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61  ompletely rollba
f190: 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
f1a0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74  se changes.  Dat
f1b0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
f1c0: 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a   would occur..**
f1d0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
f1e0: 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74  e also updates t
f1f0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
f200: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
f210: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28  he journal..** (
f220: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
f230: 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
f240: 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
f250: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
f260: 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20  rmation.).** If 
f270: 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73  the sync mode is
f280: 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73   FULL, two syncs
f290: 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69   will occur.  Fi
f2a0: 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  rst the whole jo
f2b0: 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63  urnal.** is sync
f2c0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65  ed, then the nRe
f2d0: 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
f2e0: 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e  ed, then a secon
f2f0: 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  d sync occurs..*
f300: 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
f310: 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65  ry databases, we
f320: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20   do not care if 
f330: 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  we are able to r
f340: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72  ollback.** after
f350: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
f360: 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  , so sync occurs
f370: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f380: 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
f390: 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f  needSync field o
f3a0: 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72  f every page cur
f3b0: 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20  rent held in.** 
f3c0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
f3d0: 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
f3e0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
f3f0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
f400: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f410: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
f420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
f430: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
f440: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
f450: 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
f460: 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
f470: 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
f480: 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
f490: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
f4a0: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
f4b0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
f4c0: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
f4d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f4e0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
f4f0: 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
f500: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
f510: 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67  ); // noSync mig
f520: 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e  ht be set if syn
f530: 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a  chronous.      *
f540: 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66  * was turned off
f550: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
f560: 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
f570: 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35  ed.  Ticket #615
f580: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
f590: 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
f5a0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
f5b0: 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  the pPager->nRec
f5c0: 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20   counter we are 
f5d0: 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20  keeping agrees. 
f5e0: 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
f5f0: 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  he nRec computed
f600: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
f610: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f620: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
f630: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 6a 53 7a         off_t jSz
f640: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
f650: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
f660: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
f670: 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
f680: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
f690: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
f6a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
f6b0: 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a  rnalOff==jSz );.
f6c0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
f6d0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
f6e0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
f6f0: 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
f700: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
f710: 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
f720: 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
f730: 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
f740: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
f750: 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
f760: 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
f770: 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
f780: 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
f790: 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
f7a0: 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
f7b0: 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
f7c0: 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
f7d0: 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20  or rollback. .  
f7e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f7f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
f800: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
f810: 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
f820: 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
f830: 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
f840: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f850: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
f860: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
f870: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
f880: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
f890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f8a0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
f8b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
f8c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
f8d0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
f8e0: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
f8f0: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
f900: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
f910: 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20  pPager->nRec);. 
f920: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
f930: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
f940: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
f950: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
f960: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f970: 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
f980: 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
f990: 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
f9a0: 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
f9b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f9c0: 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
f9d0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
f9e0: 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
f9f0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67  n rc;.      pPag
fa00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
fa10: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
fa20: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
fa30: 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
fa40: 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
fa50: 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
fa60: 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
fa70: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
fa80: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
fa90: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
faa0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
fab0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
fac0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
fad0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
fae0: 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
faf0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
fb00: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
fb10: 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
fb20: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
fb30: 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
fb40: 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
fb50: 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
fb60: 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
fb70: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
fb80: 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
fb90: 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
fba0: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
fbb0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
fbc0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
fbd0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
fbe0: 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
fbf0: 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
fc00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
fc10: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
fc20: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
fc30: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
fc40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fc50: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
fc60: 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
fc70: 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
fc80: 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
fc90: 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
fca0: 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
fcb0: 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
fcc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
fcd0: 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
fce0: 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
fcf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
fd00: 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
fd10: 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
fd20: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
fd30: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
fd40: 20 62 75 73 79 20 3d 20 31 3b 0a 0a 20 20 69 66   busy = 1;..  if
fd50: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
fd60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fd70: 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
fd80: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
fd90: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
fda0: 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
fdb0: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
fdc0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
fdd0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
fde0: 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
fdf0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
fe00: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
fe10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
fe20: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
fe30: 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
fe40: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
fe50: 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
fe60: 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
fe70: 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
fe80: 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
fe90: 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
fea0: 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
feb0: 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
fec0: 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
fed0: 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
fee0: 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
fef0: 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
ff00: 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
ff10: 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
ff20: 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
ff30: 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
ff40: 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
ff50: 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
ff60: 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
ff70: 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
ff80: 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
ff90: 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
ffa0: 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
ffb0: 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
ffc0: 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
ffd0: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
ffe0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
fff0: 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
10000 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
10010 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
10020 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
10030 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
10040 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
10050 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
10060 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
10070 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
10080 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
10090 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
100a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
100b0 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
100c0 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
100d0 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
100e0 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
100f0 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 64  ayback..  */.  d
10100 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  o {.    rc = sql
10110 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
10120 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
10130 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 77 68 69 6c  E_LOCK);.  }whil
10140 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
10150 53 59 20 26 26 20 0a 20 20 20 20 20 20 70 50 61  SY && .      pPa
10160 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
10170 72 20 26 26 20 0a 20 20 20 20 20 20 70 50 61 67  r && .      pPag
10180 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
10190 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20  ->xFunc && .    
101a0 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
101b0 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50  andler->xFunc(pP
101c0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
101d0 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b  er->pArg, busy++
101e0 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ).  );.  if( rc!
101f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10210 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
10220 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
10230 56 45 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c  VE;..  while( pL
10240 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
10250 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
10260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
10270 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
10280 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
10290 29 2a 28 6f 66 66 5f 74 29 70 50 61 67 65 72 2d  )*(off_t)pPager-
102a0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
102b0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
102c0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
102d0 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
102e0 20 36 29 3b 0a 20 20 20 20 54 52 41 43 45 32 28   6);.    TRACE2(
102f0 22 53 54 4f 52 45 20 70 61 67 65 20 25 64 5c 6e  "STORE page %d\n
10300 22 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ", pList->pgno);
10310 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10320 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
10330 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
10340 41 54 41 28 70 4c 69 73 74 29 2c 20 70 50 61 67  ATA(pList), pPag
10350 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
10360 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
10370 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
10380 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
10390 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  no, 0);.    if( 
103a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
103b0 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
103c0 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20   = 0;.    pList 
103d0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
103e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
103f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10400 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
10410 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
10420 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
10430 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
10440 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
10450 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
10460 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
10470 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
10480 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
10490 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
104a0 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
104b0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
104c0 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
104d0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c  er){.  PgHdr *p,
104e0 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
104f0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50   = 0;.  for(p=pP
10500 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
10510 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
10520 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20     if( p->dirty 
10530 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72  ){.      p->pDir
10540 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ty = pList;.    
10550 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20    pList = p;.   
10560 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10570 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
10580 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
10590 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
105a0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
105b0 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
105c0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
105d0 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
105e0 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
105f0 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
10600 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
10610 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
10620 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
10630 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
10640 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
10650 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
10660 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
10670 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
10680 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
10690 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
106a0 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
106b0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
106c0 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
106d0 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
106e0 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
106f0 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
10700 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
10710 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
10720 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
10730 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
10740 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
10750 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
10760 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
10770 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
10780 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
10790 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
107a0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
107b0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
107c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
107d0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
107e0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
107f0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
10800 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
10810 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
10820 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
10830 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
10840 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
10850 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
10860 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
10870 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
10880 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
10890 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
108a0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
108b0 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
108c0 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
108d0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
108e0 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
108f0 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
10900 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
10910 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
10920 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
10930 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
10940 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
10950 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
10960 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
10970 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
10980 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
10990 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
109a0 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
109b0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
109c0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
109d0 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65  e3pager_get(Page
109e0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
109f0 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50  pgno, void **ppP
10a00 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
10a10 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
10a20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
10a30 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
10a40 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
10a50 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
10a60 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
10a70 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
10a80 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  0 );.  *ppPage =
10a90 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
10aa0 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
10ab0 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
10ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
10ad0 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
10ae0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
10af0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
10b00 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
10b10 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
10b20 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
10b30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10b40 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
10b50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
10b60 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
10b70 29 7b 0a 20 20 20 20 69 6e 74 20 62 75 73 79 20  ){.    int busy 
10b80 3d 20 31 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  = 1;.    do {.  
10b90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10ba0 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
10bb0 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
10bc0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
10bd0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
10be0 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
10bf0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26  ->pBusyHandler &
10c00 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
10c10 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
10c20 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20  >xFunc && .     
10c30 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
10c40 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70  Handler->xFunc(p
10c50 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
10c60 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b  ler->pArg, busy+
10c70 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  +).    );.    if
10c80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10c90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10ca0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
10cb0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
10cc0 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20 20  GER_SHARED;..   
10cd0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
10ce0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
10cf0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
10d00 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
10d10 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
10d20 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
10d30 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
10d40 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
10d50 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
10d60 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
10d70 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
10d80 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
10d90 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
10da0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
10db0 26 26 0a 20 20 20 20 20 20 20 20 21 73 71 6c 69  &&.        !sqli
10dc0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
10dd0 65 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  edLock(&pPager->
10de0 66 64 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  fd) .    ){.    
10df0 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
10e00 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
10e10 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
10e20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10e30 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
10e40 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a 20  it is.       ** 
10e50 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
10e60 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
10e70 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
10e80 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
10e90 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  .       ** EXCLU
10ea0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
10eb0 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
10ec0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
10ed0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  n the.       ** 
10ee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
10ef0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
10f00 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
10f10 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
10f20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
10f30 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
10f40 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
10f50 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
10f60 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20  lling it .      
10f70 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
10f80 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20 42   ** .       ** B
10f90 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
10fa0 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
10fb0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
10fc0 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20  uested, the.    
10fd0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
10fe0 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
10ff0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
11000 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
11010 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62   to.       ** ob
11020 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58  tain it's own EX
11030 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
11040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11050 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e..       */.   
11060 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11070 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
11080 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
11090 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  CK);.       if( 
110a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
110b0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
110c0 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
110d0 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
110e0 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
110f0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
11100 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
11110 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11120 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
11130 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
11140 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20  R_EXCLUSIVE;..  
11150 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
11160 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
11170 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75  ding only.  Retu
11180 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  rn SQLITE_BUSY i
11190 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61  f.       ** we a
111a0 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  re unable to ope
111b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
111c0 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20  le. .       **. 
111d0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
111e0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
111f0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
11200 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
11210 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e.       ** jour
11220 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
11230 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68  r open unless th
11240 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
11250 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20  file holds.     
11260 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
11270 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
11280 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
11290 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
112a0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
112b0 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a  es opening the j
112c0 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61  ournal at the sa
112d0 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  me time..       
112e0 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73  */.       rc = s
112f0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
11300 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Only(pPager->zJo
11310 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
11320 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28  jfd);.       if(
11330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11340 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  {.         sqlit
11350 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
11360 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
11370 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
11380 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
11390 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
113a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
113b0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20  BUSY;.       }. 
113c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
113d0 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
113e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
113f0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
11400 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  ;.       pPager-
11410 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
11420 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
11430 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
11440 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
11450 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20  urnalHdr = 0;.. 
11460 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
11470 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
11480 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
11490 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
114a0 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  te.       ** loc
114b0 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
114c0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
114d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
114e0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
114f0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11500 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11520 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11530 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11540 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
11550 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
11560 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68  for page in cach
11570 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
11580 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
11590 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  er, pgno);.    i
115a0 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
115b0 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
115c0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
115d0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
115e0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
115f0 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
11600 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
11610 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
11620 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
11630 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
11640 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
11650 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  h;.    pPager->n
11660 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Miss++;.    if( 
11670 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
11680 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
11690 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
116a0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  0 || pPager->mem
116b0 44 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  Db ){.      /* C
116c0 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
116d0 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20   */.      pPg = 
116e0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
116f0 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
11700 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11710 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11730 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20  + sizeof(u32) + 
11740 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20  pPager->nExtra. 
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70               + p
11770 50 61 67 65 72 2d 3e 6d 65 6d 44 62 2a 73 69 7a  Pager->memDb*siz
11780 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
11790 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
117a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
117b0 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
117c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
117d0 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
117e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
117f0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
11800 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
11810 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20  GER_ERR_MEM;.   
11820 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11830 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
11840 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
11850 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Pg, 0, sizeof(*p
11860 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg));.      if( 
11870 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
11880 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
11890 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
118a0 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
118b0 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
118c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
118d0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
118e0 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
118f0 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
11900 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
11910 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
11920 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
11930 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
11940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
11950 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
11960 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
11970 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
11980 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  at does not.    
11990 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
119a0 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
119b0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
119c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
119d0 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
119e0 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20  irstSynced;..   
119f0 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c     /* If we coul
11a00 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
11a10 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
11a20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
11a30 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  ().      ** on t
11a40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11a50 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
11a60 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
11a70 69 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a  is is a.      **
11a80 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
11a90 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
11aa0 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
11ab0 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
11ac0 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  s.      ** it ca
11ad0 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20  n't be helped.. 
11ae0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
11af0 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
11b00 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
11b10 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
11b20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11b30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
11b40 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
11b50 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
11b60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11b70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
11b80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11b90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
11ba0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
11bb0 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
11bc0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
11bd0 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
11be0 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
11bf0 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
11c00 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  le. This is done
11c10 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d   to avoid ever m
11c20 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e  odifying a journ
11c30 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65 72 20  al..  ** header 
11c40 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64  that is involved
11c50 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
11c60 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
11c70 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65 61 64  ave..  ** alread
11c80 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
11c90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
11ca0 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64  in case the head
11cb0 65 72 20 69 73 0a 09 20 20 2a 2a 20 74 72 61 73  er is..  ** tras
11cc0 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
11cd0 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
11ce0 65 64 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ed)..          *
11cf0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  /.          pPag
11d00 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
11d10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11d20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11d30 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
11d40 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
11d50 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
11d60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
11d70 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
11d80 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
11d90 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
11da0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
11db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11dc0 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ERR;.          }
11dd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11de0 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
11df0 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d  >pFirst;.      }
11e00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11e10 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
11e20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
11e30 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  he page to the d
11e40 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
11e50 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20  it is dirty..   
11e60 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
11e70 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
11e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
11e90 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
11ea0 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  ;.        pPg->p
11eb0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
11ec0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
11ed0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50  ite_pagelist( pP
11ee0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  g );.        if(
11ef0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11f00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11f10 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
11f20 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
11f30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11f40 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
11f50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11f60 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
11f70 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  irty==0 );..    
11f80 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
11f90 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
11fa0 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
11fb0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
11fc0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  hen.      ** set
11fd0 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
11fe0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
11ff0 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
12000 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  the.      ** sql
12010 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ite_dont_rollbac
12020 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
12030 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
12040 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
12050 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  n..      ** It i
12060 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
12070 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
12080 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
12090 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
120a0 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
120b0 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61  reloaded at a la
120c0 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20  ter time but at 
120d0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f  that point we wo
120e0 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20  n't remember.   
120f0 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61     ** that is wa
12100 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
12110 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
12120 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
12130 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ges must.      *
12140 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
12150 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
12160 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
12170 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
12180 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
12190 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
121a0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
121b0 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
121c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
121d0 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
121e0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
121f0 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
12200 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ash table.      
12210 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  */.      unlinkP
12220 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
12230 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b  pPager->nOvfl++;
12240 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
12250 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
12260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
12270 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
12280 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
12290 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
122a0 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65    sqlite3CheckMe
122b0 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e  mory(pPager->aIn
122c0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29  Journal, pgno/8)
122d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
122e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
122f0 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pen );.      pPg
12300 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
12310 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
12320 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
12330 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
12340 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
12350 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nc = 0;.    }els
12360 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
12370 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
12380 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
12390 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
123a0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
123b0 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  tmt && (int)pgno
123c0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
123d0 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
123e0 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  && (pPager->aInS
123f0 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  tmt[pgno/8] & (1
12400 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20  <<(pgno&7)))!=0 
12410 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  ){.      page_ad
12420 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
12430 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
12440 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76        page_remov
12450 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
12460 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
12470 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
12480 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  .    pPg->nRef =
12490 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28   1;.    REFINFO(
124a0 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72  pPg);.    pPager
124b0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20  ->nRef++;.    h 
124c0 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e  = pager_hash(pgn
124d0 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  o);.    pPg->pNe
124e0 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
124f0 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70  >aHash[h];.    p
12500 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
12510 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
12520 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
12530 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12540 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
12550 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
12560 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
12570 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
12580 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
12590 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
125a0 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
125b0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
125c0 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
125d0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
125e0 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
125f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
12600 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
12610 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
12620 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
12630 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
12640 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f  _unref(PGHDR_TO_
12650 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20  DATA(pPg));.    
12660 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
12670 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
12680 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12690 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
126a0 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74  ger->dbSize<(int
126b0 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d  )pgno ){.      m
126c0 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
126d0 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
126e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
126f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12700 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 61   int rc;.      a
12710 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
12720 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  emDb==0 );.     
12730 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
12740 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
12750 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 70 50 61 67  o-1)*(off_t)pPag
12760 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
12770 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12780 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d  3OsRead(&pPager-
12790 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
127a0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
127b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
127c0 20 20 54 52 41 43 45 32 28 22 46 45 54 43 48 20    TRACE2("FETCH 
127d0 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d  page %d\n", pPg-
127e0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f  >pgno);.      CO
127f0 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
12800 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
12810 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
12820 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12840 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a 65    off_t fileSize
12850 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
12860 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
12870 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c  &pPager->fd,&fil
12880 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f  eSize)!=SQLITE_O
12890 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
128a0 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67   || fileSize>=pg
128b0 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  no*pPager->pageS
128c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
128d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
128e0 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
128f0 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20  A(pPg));.       
12900 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12910 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12920 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
12930 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
12940 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
12950 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
12960 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
12980 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
12990 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
129a0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
129b0 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a  pPager->nHit++;.
129c0 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
129d0 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
129e0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
129f0 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
12a00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12a10 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
12a20 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
12a30 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
12a40 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
12a50 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
12a60 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
12a70 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
12a80 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
12a90 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
12aa0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
12ab0 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
12ac0 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  so sqlite3pager_
12ad0 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  get().  The diff
12ae0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
12af0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
12b00 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nd sqlite3pager_
12b10 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  get() is that _g
12b20 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
12b30 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
12b40 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
12b50 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
12b60 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
12b70 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
12b80 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
12b90 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
12ba0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
12bb0 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
12bc0 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
12bd0 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
12be0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70 61  .void *sqlite3pa
12bf0 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
12c00 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
12c10 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
12c20 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
12c30 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
12c40 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
12c50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
12c60 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
12c70 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
12c80 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
12c90 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
12ca0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
12cb0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
12cc0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
12cd0 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
12ce0 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
12cf0 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  DATA(pPg);.}../*
12d00 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
12d10 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
12d20 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
12d30 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
12d40 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
12d50 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
12d60 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
12d70 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
12d80 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
12d90 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
12da0 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
12db0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
12dc0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
12dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
12de0 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
12df0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
12e00 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  unref(void *pDat
12e10 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
12e20 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  ;..  /* Decremen
12e30 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
12e40 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
12e50 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  age.  */.  pPg =
12e60 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
12e70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
12e80 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
12e90 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
12ea0 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
12eb0 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
12ec0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
12ed0 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
12ee0 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
12ef0 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
12f00 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
12f10 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
12f20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
12f30 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
12f40 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
12f50 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
12f60 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
12f70 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
12f80 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
12f90 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
12fa0 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
12fb0 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
12fc0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
12fd0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
12fe0 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
12ff0 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
13000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13010 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
13020 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
13030 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
13040 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
13050 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
13060 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
13070 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
13080 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
13090 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
130a0 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
130b0 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
130c0 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65  tor(pData, pPage
130d0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
130e0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
130f0 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
13100 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
13110 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
13120 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
13130 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13140 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
13150 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
13160 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13170 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
13180 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
13190 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  f==0 && !pPager-
131a0 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
131b0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
131c0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
131d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
131e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
131f0 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  te a journal fil
13200 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54  e for pPager.  T
13210 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65  here should alre
13220 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
13230 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56  D.** or EXCLUSIV
13240 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
13250 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e  tabase file when
13260 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13270 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
13280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
13290 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20  if everything.  
132a0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
132b0 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65  code and release
132c0 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f   the.** write lo
132d0 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  ck if anything g
132e0 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
132f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
13300 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
13310 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
13320 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
13330 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
13340 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13350 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
13360 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
13370 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13380 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
13390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
133a0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
133b0 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
133c0 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
133d0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
133e0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
133f0 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
13400 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
13410 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
13420 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
13430 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
13440 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
13450 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
13460 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
13470 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
13480 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13490 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
134a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
134b0 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65  nExclusive(pPage
134c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50  r->zJournal, &pP
134d0 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72  ager->jfd,pPager
134e0 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70  ->tempFile);.  p
134f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13500 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
13510 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
13520 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13530 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  lHdr = 0;.  if( 
13540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13550 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
13560 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
13570 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
13580 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
13590 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  .    sqlite3OsUn
135a0 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
135b0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
135c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
135d0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
135e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
135f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
13600 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50  OpenDirectory(pP
13610 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
13620 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
13630 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
13640 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50  alOpen = 1;.  pP
13650 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
13660 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  rted = 0;.  pPag
13670 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
13680 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61  ;.  pPager->alwa
13690 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
136a0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
136b0 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
136c0 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
136d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
136e0 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
136f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13700 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
13710 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
13720 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
13730 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
13740 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
13750 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75  ( pPager->stmtAu
13760 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51  toopen && rc==SQ
13770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
13780 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
13790 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61 67  _stmt_begin(pPag
137a0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
137b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
137c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
137d0 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
137e0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
137f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13800 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
13810 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ULL;.    }.  }. 
13820 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
13830 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
13840 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
13850 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
13860 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
13870 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
13880 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
13890 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
138a0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
138b0 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63  er_commit() is c
138c0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
138d0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
138e0 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
138f0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
13900 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69  3pager_close() i
13910 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
13920 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
13930 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
13940 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
13950 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
13960 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
13970 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
13980 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
13990 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
139a0 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
139b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
139c0 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
139d0 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
139e0 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
139f0 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
13a00 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
13a10 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
13a20 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
13a30 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
13a40 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
13a50 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
13a60 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
13a70 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
13a80 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
13a90 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
13aa0 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
13ab0 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
13ac0 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
13ad0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
13ae0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
13af0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
13b00 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
13b10 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
13b20 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
13b30 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
13b40 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
13b50 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
13b60 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
13b70 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
13b80 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
13b90 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
13ba0 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
13bb0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
13bc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
13bd0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
13be0 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
13bf0 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
13c00 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
13c10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
13c20 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70  er_begin(void *p
13c30 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
13c40 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
13c50 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
13c60 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
13c70 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
13c80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13c90 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
13ca0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
13cb0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
13cc0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
13cd0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13ce0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
13cf0 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
13d00 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
13d10 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
13d20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
13d30 44 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  Db ){.      pPag
13d40 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
13d50 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
13d60 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
13d70 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
13d80 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  dbSize;.    }els
13d90 65 7b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69  e{.#if 0.      i
13da0 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20  nt busy = 1;.   
13db0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
13dc0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
13dd0 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
13de0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
13df0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63        }while( rc
13e00 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
13e10 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67   .          pPag
13e20 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
13e30 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 70   && .          p
13e40 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
13e50 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20  ler->xFunc && . 
13e60 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
13e70 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78  >pBusyHandler->x
13e80 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75  Func(pPager->pBu
13e90 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c  syHandler->pArg,
13ea0 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20 20 29   busy++).      )
13eb0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
13ec0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
13ed0 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  k(&pPager->fd, R
13ee0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
13ef0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13f00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13f10 20 20 2f 2a 20 57 65 20 64 6f 20 6e 6f 74 20 63    /* We do not c
13f20 61 6c 6c 20 74 68 65 20 62 75 73 79 20 68 61 6e  all the busy han
13f30 64 6c 65 72 20 77 68 65 6e 20 77 65 20 66 61 69  dler when we fai
13f40 6c 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72  l to get a reser
13f50 76 65 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ved lock..      
13f60 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    ** The only re
13f70 61 73 6f 6e 20 77 65 20 6d 69 67 68 74 20 66 61  ason we might fa
13f80 69 6c 20 69 73 20 62 65 63 61 75 73 65 20 61 6e  il is because an
13f90 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
13fa0 20 68 6f 6c 64 69 6e 67 0a 20 20 20 20 20 20 20   holding.       
13fb0 20 2a 2a 20 74 68 65 20 72 65 73 65 72 76 65 64   ** the reserved
13fc0 20 6c 6f 63 6b 2e 20 20 42 75 74 20 74 68 65 20   lock.  But the 
13fd0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 77 69  other process wi
13fe0 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
13ff0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6c  o.        ** rel
14000 65 61 73 65 20 69 74 73 20 72 65 73 65 72 76 65  ease its reserve
14010 64 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 69  d lock until thi
14020 73 20 70 72 6f 63 65 73 73 20 72 65 6c 65 61 73  s process releas
14030 65 73 20 69 74 73 20 73 68 61 72 65 64 0a 20 20  es its shared.  
14040 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20        ** lock.  
14050 53 6f 20 77 65 20 6d 69 67 68 74 20 61 73 20 77  So we might as w
14060 65 6c 6c 20 66 61 69 6c 20 69 6e 20 74 68 69 73  ell fail in this
14070 20 70 72 6f 63 65 73 73 2c 20 6c 65 74 20 69 74   process, let it
14080 20 72 65 6c 65 61 73 65 0a 20 20 20 20 20 20 20   release.       
14090 20 2a 2a 20 69 74 73 20 73 68 61 72 65 64 20 6c   ** its shared l
140a0 6f 63 6b 20 73 6f 20 74 68 61 74 20 74 68 65 20  ock so that the 
140b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 61  other process ca
140c0 6e 20 63 6f 6d 6d 69 74 2e 0a 20 20 20 20 20 20  n commit..      
140d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
140e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
140f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
14100 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
14110 52 56 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67  RVED;.      pPag
14120 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
14130 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32   0;.      TRACE2
14140 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
14150 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
14160 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  h);.      if( pP
14170 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
14180 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
14190 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
141a0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
141b0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
141c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
141d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
141e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
141f0 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
14200 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
14210 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
14220 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
14230 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
14240 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
14250 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
14260 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
14270 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
14280 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
14290 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
142a0 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
142b0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
142c0 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
142d0 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
142e0 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
142f0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
14300 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
14310 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
14320 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
14330 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
14340 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
14350 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
14360 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
14370 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
14380 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
14390 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
143a0 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
143b0 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
143c0 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
143d0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
143e0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
143f0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
14400 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
14410 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
14420 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
14430 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
14440 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
14450 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
14460 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
14470 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
14480 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
14490 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
144a0 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
144b0 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
144c0 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
144d0 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
144e0 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
144f0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
14500 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
14510 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14520 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
14530 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
14540 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
14550 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
14560 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
14570 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
14580 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14590 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
145a0 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
145b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
145c0 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65  rMask ){ .    re
145d0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
145e0 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
145f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
14600 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
14610 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
14620 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
14630 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
14640 74 65 72 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  ter );..  /* Mar
14650 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
14660 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
14670 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
14680 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
14690 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
146a0 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
146b0 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
146c0 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20  */.  pPg->dirty 
146d0 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
146e0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
146f0 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61  g->inStmt || pPa
14700 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
14710 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
14720 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
14730 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
14740 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
14750 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
14760 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
14770 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
14780 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72  ds to be.  ** wr
14790 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
147a0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
147b0 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
147c0 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  nt journal.  ** 
147d0 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
147e0 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
147f0 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
14800 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
14810 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
14820 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
14830 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a  it does not..  *
14840 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
14850 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
14860 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20  _UNLOCK );.  rc 
14870 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
14880 65 67 69 6e 28 70 44 61 74 61 29 3b 0a 20 20 69  egin(pData);.  i
14890 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
148a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
148b0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
148c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
148d0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
148e0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
148f0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
14900 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
14910 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  al ){.    rc = p
14920 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
14930 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
14940 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14950 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14960 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
14970 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
14980 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  || !pPager->useJ
14990 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67  ournal );.  pPag
149a0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
149b0 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72   1;..  /* The tr
149c0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
149d0 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
149e0 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
149f0 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a 2a 20 45  VED or an.  ** E
14a00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
14a10 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
14a20 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
14a30 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
14a40 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 74 72 61   to.  ** the tra
14a50 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
14a60 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
14a70 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a  ere already..  *
14a80 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  /.  if( !pPg->in
14a90 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
14aa0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
14ab0 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 29  | pPager->memDb)
14ac0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e 74   ){.    if( (int
14ad0 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
14ae0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
14af0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
14b00 50 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73 61  Pg;.      u32 sa
14b10 76 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ved;.      if( p
14b20 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
14b30 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
14b40 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
14b50 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
14b60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 54  ager);.        T
14b70 52 41 43 45 32 28 22 4a 4f 55 52 4e 41 4c 20 70  RACE2("JOURNAL p
14b80 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  age %d\n", pPg->
14b90 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  pgno);.        a
14ba0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f  ssert( pHist->pO
14bb0 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rig==0 );.      
14bc0 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
14bd0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
14be0 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
14bf0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
14c00 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
14c10 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
14c20 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
14c30 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
14c40 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
14c50 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
14c60 7d 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69  }.        pPg->i
14c70 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
14c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14c90 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20     u32 cksum;.  
14ca0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
14cb0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
14cc0 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
14cd0 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
14ce0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 50  cksum(pPager, pP
14cf0 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b  g->pgno, pData);
14d00 0a 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d  .        saved =
14d10 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f   *(u32*)PGHDR_TO
14d20 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
14d30 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  er);.        sto
14d40 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20  re32bits(cksum, 
14d50 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
14d60 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
14d70 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70  szPg = pPager->p
14d80 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20  ageSize+8;.     
14d90 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
14da0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
14db0 34 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  4);.        rc =
14dc0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
14dd0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28  &pPager->jfd, &(
14de0 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34  (char*)pData)[-4
14df0 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20  ], szPg);.      
14e00 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14e10 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20  lOff += szPg;.  
14e20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f        TRACE3("JO
14e30 55 52 4e 41 4c 20 70 61 67 65 20 25 64 20 6e 65  URNAL page %d ne
14e40 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 20 70 50  edSync=%d\n", pP
14e50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
14e60 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20  edSync);.       
14e70 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
14e80 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
14e90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 75   0);.        *(u
14ea0 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
14eb0 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 20  RA(pPg, pPager) 
14ec0 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20  = saved;.       
14ed0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14ee0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
14ef0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
14f00 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
14f10 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
14f20 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
14f30 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20  R_ERR_FULL;.    
14f40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
14f50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14f60 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
14f70 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
14f80 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
14f90 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
14fa0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
14fb0 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
14fc0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
14fd0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
14fe0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
14ff0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
15000 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69  ;.        pPg->i
15010 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
15020 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
15030 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
15040 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
15050 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
15060 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
15070 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
15080 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
15090 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
150a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
150b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
150c0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
150d0 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
150e0 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
150f0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
15100 20 20 20 20 20 20 54 52 41 43 45 33 28 22 41 50        TRACE3("AP
15110 50 45 4e 44 20 70 61 67 65 20 25 64 20 6e 65 65  PEND page %d nee
15120 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67  dSync=%d\n", pPg
15130 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
15140 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20  dSync);.    }.  
15150 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
15160 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ync ){.      pPa
15170 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
15180 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
15190 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
151a0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
151b0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
151c0 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
151d0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
151e0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
151f0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
15200 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
15210 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  that.  ** the st
15220 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
15230 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
15240 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
15250 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
15260 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
15270 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
15280 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
15290 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
152a0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
152b0 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
152c0 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
152d0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
152e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
152f0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
15300 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
15310 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
15320 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69  gDbSize );.    i
15330 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
15340 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
15350 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
15360 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
15370 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
15380 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
15390 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
153a0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
153b0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
153c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
153d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48   );.      if( pH
153e0 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
153f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
15400 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
15410 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
15420 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
15430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15440 54 52 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55  TRACE2("STMT-JOU
15450 52 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c  RNAL page %d\n",
15460 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
15470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
15480 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70  ore32bits(pPg->p
15490 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20  gno, pPg, -4);. 
154a0 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
154b0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
154c0 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 72  gno, 7);.      r
154d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
154e0 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  te(&pPager->stfd
154f0 2c 20 28 28 63 68 61 72 2a 29 70 44 61 74 61 29  , ((char*)pData)
15500 2d 34 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  -4, pPager->page
15510 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 54  Size+4);.      T
15520 52 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE2("STMT-JOUR
15530 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20  NAL page %d\n", 
15540 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
15550 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
15560 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
15570 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
15580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15590 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
155a0 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
155b0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
155c0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
155d0 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
155e0 4c 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  L;.        retur
155f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
15600 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
15610 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73  NRec++;.      as
15620 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
15630 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
15640 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
15650 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
15660 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
15670 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  7);.    }.    pa
15680 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
15690 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ist(pPg);.  }.. 
156a0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
156b0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
156c0 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
156d0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
156e0 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  ze<(int)pPg->pgn
156f0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
15700 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
15710 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 70 50  gno;.    if( !pP
15720 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
15730 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
15740 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
15750 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
15760 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
15770 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
15780 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15790 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
157a0 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
157b0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
157c0 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
157d0 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
157e0 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  o sqlite3pager_w
157f0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
15800 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
15810 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
15820 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
15830 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
15840 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   page..*/.int sq
15850 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
15860 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61  teable(void *pDa
15870 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
15880 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
15890 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
158a0 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
158b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  ../*.** Replace 
158c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
158d0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74   single page wit
158e0 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  h the informatio
158f0 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a  n in the third.*
15900 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
15910 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
15920 6f 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20  overwrite(Pager 
15930 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
15940 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29  no, void *pData)
15950 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b  {.  void *pPage;
15960 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
15970 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
15980 67 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  get(pPager, pgno
15990 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
159a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
159b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
159c0 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
159d0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
159e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
159f0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67       memcpy(pPag
15a00 65 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  e, pData, pPager
15a10 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
15a20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61   }.    sqlite3pa
15a30 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
15a40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
15a50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  c;.}../*.** A ca
15a60 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
15a70 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
15a80 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
15a90 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
15aa0 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
15ab0 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
15ac0 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74  "pgno" back to t
15ad0 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
15ae0 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
15af0 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
15b00 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a  d as dirty..**.*
15b10 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
15b20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
15b30 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
15b40 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
15b50 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
15b60 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
15b70 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
15b80 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
15b90 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
15ba0 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
15bb0 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
15bc0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
15bd0 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
15be0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
15bf0 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
15c00 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
15c10 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
15c20 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
15c30 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
15c40 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
15c50 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
15c60 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
15c70 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
15c80 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
15c90 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
15ca0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
15cb0 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
15cc0 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
15cd0 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
15ce0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
15cf0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
15d00 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
15d10 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
15d20 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
15d30 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
15d40 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
15d50 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
15d60 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
15d70 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
15d80 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
15d90 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
15da0 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
15db0 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
15dc0 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
15dd0 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
15de0 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
15df0 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
15e00 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
15e10 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
15e20 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
15e30 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
15e40 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
15e50 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
15e60 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
15e70 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64  reused,.** the d
15e80 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72  ont_rollback() r
15e90 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
15ea0 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
15eb0 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  he page contains
15ec0 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74  .** critical dat
15ed0 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  a, we still need
15ee0 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67   to be sure it g
15ef0 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ets rolled back 
15f00 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74  in spite.** of t
15f10 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
15f20 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
15f30 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
15f40 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a  nt_write(Pager *
15f50 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
15f60 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
15f70 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
15f80 3e 6d 65 6d 44 62 20 29 20 72 65 74 75 72 6e 3b  >memDb ) return;
15f90 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
15fa0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
15fb0 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77  gno);.  pPg->alw
15fc0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
15fd0 0a 20 20 69 66 28 20 70 50 67 20 26 26 20 70 50  .  if( pPg && pP
15fe0 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
15ff0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
16000 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
16010 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
16020 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
16030 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
16040 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
16050 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
16060 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
16070 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
16080 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
16090 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
160a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
160b0 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
160c0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
160d0 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
160e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
160f0 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
16100 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
16110 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
16120 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
16130 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
16140 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
16150 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
16160 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
16170 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
16180 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
16190 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
161a0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
161b0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
161c0 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
161d0 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
161e0 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
161f0 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
16200 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
16210 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
16220 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
16230 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
16240 20 20 20 20 20 20 54 52 41 43 45 33 28 22 44 4f        TRACE3("DO
16250 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
16260 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c   of %d\n", pgno,
16270 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
16280 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
16290 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
162a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
162b0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
162c0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
162d0 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
162e0 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
162f0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
16300 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
16310 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
16320 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
16330 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
16340 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
16350 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
16360 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
16370 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
16380 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69   journal..*/.voi
16390 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  d sqlite3pager_d
163a0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69  ont_rollback(voi
163b0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
163c0 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
163d0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
163e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
163f0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
16400 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
16410 61 74 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate!=PAGER_EXCLU
16420 53 49 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e  SIVE || pPager->
16430 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
16440 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
16450 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
16460 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c  ck || pPager->al
16470 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
16480 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20  pPager->memDb ) 
16490 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
164a0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
164b0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
164c0 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
164d0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  bSize ){.    ass
164e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
164f0 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
16500 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
16510 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
16520 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
16530 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
16540 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
16550 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
16560 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
16570 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
16580 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
16590 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
165a0 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61  7);.      page_a
165b0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
165c0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
165d0 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c  TRACE3("DONT_ROL
165e0 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66  LBACK page %d of
165f0 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
16600 6f 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29  o, pPager->fd.h)
16610 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
16620 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
16630 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
16640 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
16650 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
16660 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
16670 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
16680 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
16690 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
166a0 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
166b0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
166c0 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  tmt!=0 );.    pP
166d0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
166e0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
166f0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
16700 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
16710 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
16720 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c    }.}.../*.** Cl
16730 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
16740 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
16750 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
16760 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
16770 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  st){.  sqliteFre
16780 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
16790 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
167a0 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
167b0 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
167c0 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
167d0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  = 0;.}../*.** Co
167e0 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
167f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16800 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
16810 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
16820 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
16830 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
16840 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
16850 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
16860 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
16870 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
16880 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
16890 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
168a0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
168b0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
168c0 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
168d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
168e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
168f0 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70  r *pPg;..  if( p
16900 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d  Pager->errMask==
16910 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29  PAGER_ERR_FULL )
16920 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16930 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
16940 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
16950 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16960 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
16970 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
16980 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
16990 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
169a0 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
169b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
169c0 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
169d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
169e0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
169f0 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
16a00 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
16a10 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16a20 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22  ;.  }.  TRACE2("
16a30 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50  COMMIT %d\n", pP
16a40 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69  ager->fd.h);.  i
16a50 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
16a60 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61   ){.    pPg = pa
16a70 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
16a80 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
16a90 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
16aa0 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69  ){.      clearHi
16ab0 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
16ac0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
16ad0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
16ae0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
16af0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
16b00 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
16b10 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
16b20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
16b30 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
16b40 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
16b50 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
16b60 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
16b70 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  UG.    for(pPg=p
16b80 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
16b90 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
16ba0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
16bb0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
16bc0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
16bd0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
16be0 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
16bf0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
16c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
16c10 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
16c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
16c30 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
16c40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
16c50 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
16c60 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
16c70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
16c80 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
16c90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16ca0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72   if( pPager->dir
16cb0 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20  tyCache==0 ){.  
16cc0 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20    /* Exit early 
16cd0 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74  (without doing t
16ce0 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e  he time-consumin
16cf0 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  g sqlite3OsSync(
16d00 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20  ) calls).    ** 
16d10 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
16d20 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
16d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16d40 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
16d50 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
16d60 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  ync==0 );.    rc
16d70 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
16d80 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
16d90 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
16da0 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
16db0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
16dc0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
16dd0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
16de0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
16df0 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ync(pPager, 0);.
16e00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16e10 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
16e20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
16e30 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75  }.  rc = pager_u
16e40 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
16e50 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  r);.  pPager->db
16e60 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
16e70 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75  urn rc;..  /* Ju
16e80 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79 74 68  mp here if anyth
16e90 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64  ing goes wrong d
16ea0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
16eb0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63   process..  */.c
16ec0 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 72  ommit_abort:.  r
16ed0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
16ee0 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
16ef0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
16f00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
16f10 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
16f20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
16f40 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
16f50 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
16f60 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
16f70 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
16f80 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
16f90 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
16fa0 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
16fb0 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
16fc0 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
16fd0 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
16fe0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16ff0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
17000 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
17010 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
17020 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
17030 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
17040 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45  protocol (SQLITE
17050 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e  _PROTOCOL) or un
17060 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
17070 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
17080 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
17090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
170a0 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
170b0 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
170c0 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
170d0 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
170e0 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
170f0 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
17100 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
17110 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
17120 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
17130 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
17140 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
17150 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
17160 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67  ger_rollback(Pag
17170 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17180 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28  nt rc;.  TRACE2(
17190 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
171a0 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
171b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
171c0 6d 44 62 20 29 7b 0a 20 20 20 20 50 67 48 64 72  mDb ){.    PgHdr
171d0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
171e0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20  Pager->pAll; p; 
171f0 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  p=p->pNextAll){.
17200 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
17210 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73  *pHist;.      as
17220 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73  sert( !p->always
17230 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
17240 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20    if( !p->dirty 
17250 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
17260 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
17270 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
17280 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72  p, pPager))->pOr
17290 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ig );.        as
172a0 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
172b0 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
172c0 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
172d0 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  pStmt );.       
172e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
172f0 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20   }..      pHist 
17300 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
17310 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  p, pPager);.    
17320 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
17330 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  ig ){.        me
17340 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
17350 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f  TA(p), pHist->pO
17360 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  rig, pPager->pag
17370 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
17380 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b  TRACE2("ROLLBACK
17390 2d 50 41 47 45 20 25 64 5c 6e 22 2c 20 70 2d 3e  -PAGE %d\n", p->
173a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pgno);.      }el
173b0 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43  se{.        TRAC
173c0 45 32 28 22 50 41 47 45 20 25 64 20 69 73 20 63  E2("PAGE %d is c
173d0 6c 65 61 6e 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  lean\n", p->pgno
173e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
173f0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
17400 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ist);.      p->d
17410 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
17420 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  p->inJournal = 0
17430 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d  ;.      p->inStm
17440 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
17450 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70  pPrevStmt = p->p
17460 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20  NextStmt = 0;.. 
17470 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
17480 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
17490 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
174a0 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f  einiter(PGHDR_TO
174b0 5f 44 41 54 41 28 70 29 2c 20 70 50 61 67 65 72  _DATA(p), pPager
174c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
174d0 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
174e0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  }.    pPager->pS
174f0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
17500 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
17510 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
17520 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e  ;.    memoryTrun
17530 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
17540 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
17550 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
17560 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
17570 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
17580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17590 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
175a0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
175b0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
175c0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
175d0 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
175e0 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
175f0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
17600 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75  e = -1;.    retu
17610 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
17620 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
17630 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  k!=0 && pPager->
17640 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45  errMask!=PAGER_E
17650 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  RR_FULL ){.    i
17660 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
17670 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
17680 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
17690 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
176a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
176b0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
176c0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
176d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
176e0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
176f0 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
17700 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
17710 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
17720 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20  Pager);.    rc2 
17730 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
17740 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
17750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
17770 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   rc2;.    }.  }e
17780 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
17790 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
177a0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
177b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
177c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
177d0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 70 50  _CORRUPT;.    pP
177e0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
177f0 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
17800 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  PT;.  }.  pPager
17810 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
17820 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17830 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
17840 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
17850 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
17860 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
17870 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
17880 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
17890 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
178a0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
178b0 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f  te3pager_isreado
178c0 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
178d0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
178e0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
178f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
17900 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
17910 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
17920 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
17930 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  nt *sqlite3pager
17940 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  _stats(Pager *pP
17950 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
17960 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d  int a[9];.  a[0]
17970 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
17980 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
17990 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
179a0 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
179b0 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
179c0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
179d0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
179e0 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
179f0 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61  er->errMask;.  a
17a00 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
17a10 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
17a20 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
17a30 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76  8] = pPager->nOv
17a40 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a  fl;.  return a;.
17a50 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
17a60 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62   statement rollb
17a70 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a  ack point..**.**
17a80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
17a90 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
17aa0 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74  ith the transact
17ab0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65  ion journal alre
17ac0 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20  ady.** open.  A 
17ad0 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  new statement jo
17ae0 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64  urnal is created
17af0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
17b00 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  d to rollback.**
17b10 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69   changes of a si
17b20 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  ngle SQL command
17b30 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72   within a larger
17b40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
17b50 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
17b60 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67  r_stmt_begin(Pag
17b70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17b80 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54  nt rc;.  char zT
17b90 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  emp[SQLITE_TEMPN
17ba0 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73  AME_SIZE];.  ass
17bb0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74  ert( !pPager->st
17bc0 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73  mtInUse );.  ass
17bd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
17be0 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43  ize>=0 );.  TRAC
17bf0 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25  E2("STMT-BEGIN %
17c00 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
17c10 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  .h);.  if( pPage
17c20 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
17c30 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
17c40 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
17c50 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
17c60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
17c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17c80 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  OK;.  }.  if( !p
17c90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
17ca0 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  en ){.    pPager
17cb0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
17cc0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
17cd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17ce0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17cf0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
17d00 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
17d10 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
17d20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
17d30 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
17d40 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d  Pager->aInStmt==
17d50 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
17d60 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
17d70 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
17d80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17d90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
17da0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17db0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
17dc0 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
17dd0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
17de0 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
17df0 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
17e00 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
17e10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
17e20 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67  tmtJSize == pPag
17e30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
17e40 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
17e50 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
17e60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
17e70 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  f;.  pPager->stm
17e80 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
17e90 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  dbSize;.  pPager
17ea0 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30  ->stmtHdrOff = 0
17eb0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
17ec0 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  Cksum = pPager->
17ed0 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28  cksumInit;.  if(
17ee0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70   !pPager->stmtOp
17ef0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
17f00 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
17f10 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61  temp(zTemp, &pPa
17f20 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
17f30 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
17f40 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
17f50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
17f60 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70  tOpen = 1;.    p
17f70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
17f80 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
17f90 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
17fa0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17fb0 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67  E_OK;. .stmt_beg
17fc0 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  in_failed:.  if(
17fd0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
17fe0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
17ff0 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  ee(pPager->aInSt
18000 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  mt);.    pPager-
18010 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
18020 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18030 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
18040 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
18050 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
18060 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65  stmt_commit(Page
18070 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
18080 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
18090 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  Use ){.    PgHdr
180a0 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
180b0 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
180c0 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50  COMMIT %d\n", pP
180d0 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20  ager->fd.h);.   
180e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
180f0 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  mDb ){.      sql
18100 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
18110 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
18120 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
18130 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72  Truncate(&pPager
18140 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20  ->stfd, 0); */. 
18150 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
18160 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
18170 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
18180 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
18190 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67     }.    for(pPg
181a0 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
181b0 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
181c0 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
181d0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
181e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
181f0 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
18200 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
18210 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
18220 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
18230 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
18240 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18250 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20  memDb ){.       
18260 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
18270 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
18280 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
18290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
182a0 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
182b0 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
182c0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
182d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
182e0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
182f0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
18300 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
18310 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
18320 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
18330 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
18340 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
18350 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18360 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74  ** Rollback a st
18370 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
18380 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
18390 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  t_rollback(Pager
183a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
183b0 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
183c0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
183d0 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
183e0 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  -ROLLBACK %d\n",
183f0 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
18400 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18410 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50  memDb ){.      P
18420 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
18430 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
18440 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
18450 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29  =pPg->pNextStmt)
18460 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
18470 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
18480 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
18490 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
184a0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
184b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
184c0 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
184d0 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
184e0 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
184f0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
18500 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
18510 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
18520 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
18530 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
18540 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18550 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
18560 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
18570 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f  Size;.      memo
18580 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
18590 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
185a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
185b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
185c0 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
185d0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
185e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61   }.    sqlite3pa
185f0 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
18600 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
18610 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18620 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
18630 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
18640 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
18650 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
18660 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
18670 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
18680 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
18690 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
186a0 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28  3pager_filename(
186b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
186c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
186d0 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
186e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
186f0 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
18700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
18710 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
18720 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e  qlite3pager_dirn
18730 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
18740 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
18750 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b  ger->zDirectory;
18760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18770 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
18780 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
18790 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
187a0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61   char *sqlite3pa
187b0 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28  ger_journalname(
187c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
187d0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
187e0 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
187f0 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
18800 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
18810 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18820 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28  pager_set_codec(
18830 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
18840 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  ,.  void (*xCode
18850 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
18860 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
18870 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
18880 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
18890 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
188a0 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
188b0 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a  pCodecArg;.}../*
188c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
188d0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
188e0 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61  crement the data
188f0 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
18900 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f  -counter,.** sto
18910 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f  red at byte 24 o
18920 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
18930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18940 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
18950 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
18960 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64 20  pPager){.  void 
18970 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72 20  *pPage;.  PgHdr 
18980 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
18990 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
189a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f   int rc;..  /* O
189b0 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
189c0 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
189d0 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ng. */.  rc = sq
189e0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
189f0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65  Pager, 1, &pPage
18a00 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18a10 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
18a20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
18a30 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
18a40 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
18a50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
18a60 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61  rn rc;..  /* Rea
18a70 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
18a80 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e 20  lue at byte 24. 
18a90 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44 41  */.  pPgHdr = DA
18aa0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61 67  TA_TO_PGHDR(pPag
18ab0 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75  e);.  change_cou
18ac0 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65 33  nter = retrieve3
18ad0 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32 34  2bits(pPgHdr, 24
18ae0 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  );..  /* Increme
18af0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
18b00 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
18b10 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
18b20 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65   24. */.  change
18b30 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73 74  _counter++;.  st
18b40 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e 67 65  ore32bits(change
18b50 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48 64 72  _counter, pPgHdr
18b60 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  , 24);..  /* Rel
18b70 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
18b80 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71  ference. */.  sq
18b90 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
18ba0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
18bb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18bc0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
18bd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
18be0 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
18bf0 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
18c00 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
18c10 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
18c20 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
18c30 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
18c40 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
18c50 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
18c60 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
18c70 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
18c80 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
18c90 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
18ca0 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
18cb0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
18cc0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
18cd0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
18ce0 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
18cf0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20  rnal is synced, 
18d00 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
18d10 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68  written.** to th
18d20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18d30 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
18d40 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68   file synced. Th
18d50 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
18d60 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20  t.** remains to 
18d70 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
18d80 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c  action is to del
18d90 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
18da0 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74  file (or.** mast
18db0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18dc0 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
18dd0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
18de0 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
18df0 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
18e00 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
18e10 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
18e20 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
18e30 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63 61  3pager_sync() ca
18e40 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ll..*/.int sqlit
18e50 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67  e3pager_sync(Pag
18e60 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
18e70 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
18e80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18e90 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
18ea0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
18eb0 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
18ec0 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
18ed0 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
18ee0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
18ef0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
18f00 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
18f10 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
18f20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18f30 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
18f40 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d   && !pPager->mem
18f50 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69  Db && pPager->di
18f60 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20  rtyCache ){.    
18f70 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
18f80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18f90 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a  journalOpen );..
18fa0 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74      /* If a mast
18fb0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18fc0 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79  name has already
18fd0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
18fe0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
18ff0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  nal file, then n
19000 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  o sync is requir
19010 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ed. This happens
19020 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20   when it is.    
19030 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e  ** written, then
19040 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69   the process fai
19050 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ls to upgrade fr
19060 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f  om a RESERVED to
19070 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
19080 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e  SIVE lock. The n
19090 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f  ext time the pro
190a0 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f  cess tries to co
190b0 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  mmit the.    ** 
190c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20  transaction the 
190d0 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61  m-j name will ha
190e0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
190f0 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
19100 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
19110 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20  >setMaster ){.  
19120 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
19130 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
19140 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
19150 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19160 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
19170 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
19180 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
19190 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
191a0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
191b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
191c0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
191d0 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
191e0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
191f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19200 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
19210 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  nc_exit;.    }..
19220 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
19230 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
19240 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19250 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
19260 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
19270 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
19280 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
19290 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
192a0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
192b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
192c0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20  to sync_exit;.. 
192d0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
192e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
192f0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
19300 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
19310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19320 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64  Sync(&pPager->fd
19330 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
19340 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
19350 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a  GER_SYNCED;.  }.
19360 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65  .sync_exit:.  re
19370 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
19380 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
19390 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
193a0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
193b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
193c0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
193d0 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f  the file lock fo
193e0 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
193f0 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  r..** The return
19400 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66   value is one of
19410 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44   NO_LOCK, SHARED
19420 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
19430 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47  LOCK,.** PENDING
19440 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53  _LOCK, or EXCLUS
19450 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74  IVE_LOCK..*/.int
19460 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
19470 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
19480 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 4f  Pager){.#ifdef O
19490 53 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e 20  S_TEST.  return 
194a0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c  pPager->fd->fd.l
194b0 6f 63 6b 74 79 70 65 3b 0a 23 65 6c 73 65 0a 20  ocktype;.#else. 
194c0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
194d0 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6e  fd.locktype;.#en
194e0 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  dif.}.#endif..#i
194f0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
19500 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
19510 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
19520 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
19530 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
19540 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
19550 74 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70  te3pager_refdump
19560 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
19570 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
19580 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
19590 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
195a0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
195b0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
195c0 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  f<=0 ) continue;
195d0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 41 47  .    printf("PAG
195e0 45 20 25 33 64 20 61 64 64 72 3d 30 78 25 30 38  E %3d addr=0x%08
195f0 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20  x nRef=%d\n", . 
19600 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c        pPg->pgno,
19610 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44   (int)PGHDR_TO_D
19620 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
19630 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
19640 69 66 0a                                         if.