/ Hex Artifact Content
Login

Artifact 1354e8f80889a8c967f4bc4ee2723485624eb6e7:


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: 32 20 32 30 30 34 2f 30 37 2f 32 32 20 30 31 3a  2 2004/07/22 01:
0360: 31 39 3a 33 35 20 64 72 68 20 45 78 70 20 24 0a  19:35 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 43 4f 44 45 43 28 70  );.      CODEC(p
8d90: 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67  Pager, zBuf, pPg
8da0: 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20  ->pgno, 2);.    
8db0: 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
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 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
e110: 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20 73  bSize<0 ){.    s
e120: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
e130: 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
e140: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
e150: 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
e160: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
e170: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
e180: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e190: 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28  }.  if( nPage>=(
e1a0: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
e1b0: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
e1c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e1d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
e1e0: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
e1f0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
e200: 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f   nPage;.    memo
e210: 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
e220: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  r);.    return S
e230: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e240: 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
e250: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
e260: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e270: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
e280: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
e290: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50  e3OsTruncate(&pP
e2a0: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
e2b0: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6f 66 66 5f  ->pageSize*(off_
e2c0: 74 29 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20  t)nPage);.  if( 
e2d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e2e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
e2f0: 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d  ize = nPage;.  }
e300: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e310: 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
e320: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
e330: 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
e340: 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
e350: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
e360: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
e370: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
e380: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
e390: 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
e3a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
e3b0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
e3c0: 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
e3d0: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
e3e0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
e3f0: 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
e400: 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
e410: 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
e420: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
e430: 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
e440: 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
e450: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
e460: 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
e470: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
e480: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e490: 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65  pager_close(Page
e4a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
e4b0: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
e4c0: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50 61 67  ;.  switch( pPag
e4d0: 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20  er->state ){.   
e4e0: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53 45   case PAGER_RESE
e4f0: 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50  RVED:.    case P
e500: 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20  AGER_SYNCED: .  
e510: 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58 43    case PAGER_EXC
e520: 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20  LUSIVE: {.      
e530: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
e540: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
e550: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
e560: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
e570: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
e580: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
e590: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
e5a0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
e5b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e5c0: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pen==0 );.      
e5d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e5e0: 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52   case PAGER_SHAR
e5f0: 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ED: {.      if( 
e600: 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
e610: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e620: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
e630: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
e640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e650: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e660: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
e670: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
e680: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
e690: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
e6a0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
e6b0: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
e6c0: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
e6d0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
e6e0: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
e6f0: 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
e700: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
e710: 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
e720: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
e730: 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
e740: 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
e750: 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
e760: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e770: 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
e780: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
e790: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
e7a0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
e7b0: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
e7c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
e7d0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64  lose(&pPager->fd
e7e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e7f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
e800: 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ==0 );.  /* Temp
e810: 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
e820: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
e830: 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
e840: 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
e850: 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
e860: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
e870: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
e880: 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20  );.  ** }.  */. 
e890: 20 43 4c 52 5f 50 41 47 45 52 28 70 50 61 67 65   CLR_PAGER(pPage
e8a0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
e8b0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d 28 63 68  ->zFilename!=(ch
e8c0: 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 20 29  ar*)&pPager[1] )
e8d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
e8e0: 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
e8f0: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ppen */.    sqli
e900: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
e910: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Filename);.    s
e920: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
e930: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
e940: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
e950: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b  er->zDirectory);
e960: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
e970: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
e980: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e990: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
e9a0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
e9b0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
e9c0: 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
e9d0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
e9e0: 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
e9f0: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
ea00: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
ea10: 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
ea20: 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
ea30: 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
ea40: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
ea50: 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
ea60: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
ea70: 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
ea80: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
ea90: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
eaa0: 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
eab0: 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
eac0: 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
ead0: 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
eae0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
eaf0: 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
eb00: 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
eb10: 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
eb20: 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
eb30: 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
eb40: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
eb50: 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
eb60: 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
eb70: 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
eb80: 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
eb90: 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
eba0: 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
ebb0: 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
ebc0: 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
ebd0: 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
ebe0: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
ebf0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
ec00: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
ec10: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
ec20: 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
ec30: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
ec40: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
ec50: 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
ec60: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
ec70: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
ec80: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
ec90: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
eca0: 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
ecb0: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
ecc0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
ecd0: 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
ece0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
ecf0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
ed00: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
ed10: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
ed20: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
ed30: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
ed40: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
ed50: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
ed60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ed70: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
ed80: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
ed90: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
eda0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
edb0: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
edc0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
edd0: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
ede0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
edf0: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
ee00: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
ee10: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
ee20: 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
ee30: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
ee40: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
ee50: 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
ee60: 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  g){.    if( pPg-
ee70: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
ee80: 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29    _page_ref(pPg)
ee90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eea0: 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a     pPg->nRef++;.
eeb0: 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50        REFINFO(pP
eec0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  g);.    }.  }.#e
eed0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
eee0: 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d  e_ref(P)   ((P)-
eef0: 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72  >nRef==0?_page_r
ef00: 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d  ef(P):(void)(P)-
ef10: 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a  >nRef++).#endif.
ef20: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
ef30: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
ef40: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
ef50: 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
ef60: 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
ef70: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
ef80: 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
ef90: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28  qlite3pager_ref(
efa0: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
efb0: 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
efc0: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
efd0: 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  );.  page_ref(pP
efe0: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
eff0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f000: 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
f010: 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
f020: 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
f030: 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
f040: 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
f050: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
f060: 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
f070: 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
f080: 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
f090: 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f   disk.  It is no
f0a0: 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79  t safe to modify
f0b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
f0c0: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
f0d0: 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a  l after.** the j
f0e0: 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
f0f0: 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20  synced.  If the 
f100: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f110: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65  e is modified be
f120: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fore.** the jour
f130: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e  nal is synced an
f140: 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  d a power failur
f150: 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e  e occurs, the un
f160: 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a  synced journal.*
f170: 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20  * data would be 
f180: 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c  lost and we woul
f190: 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63  d be unable to c
f1a0: 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61  ompletely rollba
f1b0: 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
f1c0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74  se changes.  Dat
f1d0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
f1e0: 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a   would occur..**
f1f0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
f200: 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74  e also updates t
f210: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
f220: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
f230: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28  he journal..** (
f240: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
f250: 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
f260: 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
f270: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
f280: 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20  rmation.).** If 
f290: 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73  the sync mode is
f2a0: 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73   FULL, two syncs
f2b0: 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69   will occur.  Fi
f2c0: 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  rst the whole jo
f2d0: 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63  urnal.** is sync
f2e0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65  ed, then the nRe
f2f0: 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
f300: 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e  ed, then a secon
f310: 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  d sync occurs..*
f320: 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
f330: 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65  ry databases, we
f340: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20   do not care if 
f350: 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  we are able to r
f360: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72  ollback.** after
f370: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
f380: 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  , so sync occurs
f390: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f3a0: 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
f3b0: 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f  needSync field o
f3c0: 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72  f every page cur
f3d0: 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20  rent held in.** 
f3e0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
f3f0: 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
f400: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
f410: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
f420: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f430: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
f440: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
f450: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
f460: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
f470: 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
f480: 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
f490: 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
f4a0: 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
f4b0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
f4c0: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
f4d0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
f4e0: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
f4f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f500: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
f510: 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
f520: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
f530: 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67  ); // noSync mig
f540: 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e  ht be set if syn
f550: 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a  chronous.      *
f560: 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66  * was turned off
f570: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
f580: 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
f590: 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35  ed.  Ticket #615
f5a0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
f5b0: 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
f5c0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
f5d0: 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  the pPager->nRec
f5e0: 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20   counter we are 
f5f0: 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20  keeping agrees. 
f600: 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
f610: 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  he nRec computed
f620: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
f630: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f640: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
f650: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 6a 53 7a         off_t jSz
f660: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
f670: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
f680: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
f690: 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
f6a0: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
f6b0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
f6c0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
f6d0: 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a  rnalOff==jSz );.
f6e0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
f6f0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
f700: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
f710: 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
f720: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
f730: 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
f740: 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
f750: 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
f760: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
f770: 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
f780: 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
f790: 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
f7a0: 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
f7b0: 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
f7c0: 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
f7d0: 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
f7e0: 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
f7f0: 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20  or rollback. .  
f800: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f810: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
f820: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
f830: 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
f840: 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
f850: 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
f860: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f870: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
f880: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
f890: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
f8a0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
f8b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f8c0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
f8d0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
f8e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
f8f0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
f900: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
f910: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
f920: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
f930: 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20  pPager->nRec);. 
f940: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
f950: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
f960: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
f970: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
f980: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f990: 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
f9a0: 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
f9b0: 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
f9c0: 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
f9d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f9e0: 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
f9f0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
fa00: 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
fa10: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67  n rc;.      pPag
fa20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
fa30: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
fa40: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
fa50: 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
fa60: 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
fa70: 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
fa80: 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
fa90: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
faa0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
fab0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
fac0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
fad0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
fae0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
faf0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
fb00: 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
fb10: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
fb20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
fb30: 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
fb40: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
fb50: 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
fb60: 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
fb70: 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
fb80: 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
fb90: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
fba0: 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
fbb0: 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
fbc0: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
fbd0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
fbe0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
fbf0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
fc00: 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
fc10: 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
fc20: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
fc30: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
fc40: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
fc50: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
fc60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fc70: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
fc80: 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
fc90: 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
fca0: 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
fcb0: 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
fcc0: 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
fcd0: 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
fce0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
fcf0: 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
fd00: 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
fd10: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
fd20: 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
fd30: 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
fd40: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
fd50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
fd60: 20 62 75 73 79 20 3d 20 31 3b 0a 0a 20 20 69 66   busy = 1;..  if
fd70: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
fd80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fd90: 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
fda0: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
fdb0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
fdc0: 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
fdd0: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
fde0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
fdf0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
fe00: 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
fe10: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
fe20: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
fe30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
fe40: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
fe50: 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
fe60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
fe70: 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
fe80: 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
fe90: 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
fea0: 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
feb0: 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
fec0: 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
fed0: 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
fee0: 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
fef0: 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
ff00: 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
ff10: 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
ff20: 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
ff30: 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
ff40: 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
ff50: 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
ff60: 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
ff70: 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
ff80: 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
ff90: 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
ffa0: 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
ffb0: 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
ffc0: 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
ffd0: 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
ffe0: 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
fff0: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
10000 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
10010 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
10020 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
10030 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
10040 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
10050 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
10060 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
10070 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
10080 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
10090 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
100a0 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
100b0 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
100c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
100d0 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
100e0 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
100f0 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
10100 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
10110 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 64  ayback..  */.  d
10120 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  o {.    rc = sql
10130 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
10140 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
10150 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 77 68 69 6c  E_LOCK);.  }whil
10160 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
10170 53 59 20 26 26 20 0a 20 20 20 20 20 20 70 50 61  SY && .      pPa
10180 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
10190 72 20 26 26 20 0a 20 20 20 20 20 20 70 50 61 67  r && .      pPag
101a0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
101b0 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20  ->xFunc && .    
101c0 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
101d0 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50  andler->xFunc(pP
101e0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
101f0 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b  er->pArg, busy++
10200 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ).  );.  if( rc!
10210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10220 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10230 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
10240 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
10250 56 45 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c  VE;..  while( pL
10260 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
10270 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
10280 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
10290 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
102a0 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
102b0 29 2a 28 6f 66 66 5f 74 29 70 50 61 67 65 72 2d  )*(off_t)pPager-
102c0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
102d0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
102e0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
102f0 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
10300 20 36 29 3b 0a 20 20 20 20 54 52 41 43 45 32 28   6);.    TRACE2(
10310 22 53 54 4f 52 45 20 70 61 67 65 20 25 64 5c 6e  "STORE page %d\n
10320 22 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ", pList->pgno);
10330 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10340 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
10350 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
10360 41 54 41 28 70 4c 69 73 74 29 2c 20 70 50 61 67  ATA(pList), pPag
10370 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
10380 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
10390 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
103a0 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
103b0 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  no, 0);.    if( 
103c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
103d0 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
103e0 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20   = 0;.    pList 
103f0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
10400 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10410 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10420 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
10430 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
10440 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
10450 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
10460 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
10470 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
10480 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
10490 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
104a0 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
104b0 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
104c0 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
104d0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
104e0 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
104f0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c  er){.  PgHdr *p,
10500 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
10510 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50   = 0;.  for(p=pP
10520 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
10530 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
10540 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20     if( p->dirty 
10550 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72  ){.      p->pDir
10560 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ty = pList;.    
10570 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20    pList = p;.   
10580 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10590 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
105a0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
105b0 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
105c0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
105d0 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
105e0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
105f0 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
10600 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
10610 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
10620 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
10630 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
10640 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
10650 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
10660 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
10670 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
10680 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
10690 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
106a0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
106b0 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
106c0 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
106d0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
106e0 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
106f0 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
10700 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
10710 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
10720 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
10730 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
10740 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
10750 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
10760 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
10770 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
10780 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
10790 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
107a0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
107b0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
107c0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
107d0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
107e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
107f0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
10800 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
10810 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
10820 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
10830 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
10840 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
10850 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
10860 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
10870 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
10880 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
10890 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
108a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
108b0 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
108c0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
108d0 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
108e0 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
108f0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
10900 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
10910 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
10920 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
10930 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
10940 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
10950 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
10960 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
10970 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
10980 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
10990 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
109a0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
109b0 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
109c0 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
109d0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
109e0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
109f0 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65  e3pager_get(Page
10a00 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
10a10 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50  pgno, void **ppP
10a20 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
10a30 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
10a40 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
10a50 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
10a60 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
10a70 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
10a80 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
10a90 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
10aa0 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  0 );.  *ppPage =
10ab0 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
10ac0 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
10ad0 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
10ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
10af0 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
10b00 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
10b10 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
10b20 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
10b30 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
10b40 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
10b50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10b60 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
10b70 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
10b80 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
10b90 29 7b 0a 20 20 20 20 69 6e 74 20 62 75 73 79 20  ){.    int busy 
10ba0 3d 20 31 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  = 1;.    do {.  
10bb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10bc0 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
10bd0 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
10be0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
10bf0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
10c00 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
10c10 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26  ->pBusyHandler &
10c20 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
10c30 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
10c40 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20  >xFunc && .     
10c50 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
10c60 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70  Handler->xFunc(p
10c70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
10c80 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b  ler->pArg, busy+
10c90 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  +).    );.    if
10ca0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10cb0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10cc0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
10cd0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
10ce0 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20 20  GER_SHARED;..   
10cf0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
10d00 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
10d10 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
10d20 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
10d30 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
10d40 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
10d50 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
10d60 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
10d70 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
10d80 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
10d90 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
10da0 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
10db0 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
10dc0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
10dd0 26 26 0a 20 20 20 20 20 20 20 20 21 73 71 6c 69  &&.        !sqli
10de0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
10df0 65 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  edLock(&pPager->
10e00 66 64 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  fd) .    ){.    
10e10 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
10e20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
10e30 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
10e40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10e50 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
10e60 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a 20  it is.       ** 
10e70 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
10e80 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
10e90 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
10ea0 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
10eb0 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  .       ** EXCLU
10ec0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
10ed0 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
10ee0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
10ef0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  n the.       ** 
10f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
10f10 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
10f20 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
10f30 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
10f40 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
10f50 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
10f60 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
10f70 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
10f80 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20  lling it .      
10f90 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
10fa0 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20 42   ** .       ** B
10fb0 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
10fc0 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
10fd0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
10fe0 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20  uested, the.    
10ff0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
11000 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
11010 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
11020 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
11030 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62   to.       ** ob
11040 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58  tain it's own EX
11050 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
11060 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11070 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e..       */.   
11080 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11090 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
110a0 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
110b0 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  CK);.       if( 
110c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
110d0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
110e0 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
110f0 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
11100 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
11110 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
11120 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
11130 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11140 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
11150 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
11160 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20  R_EXCLUSIVE;..  
11170 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
11180 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
11190 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75  ding only.  Retu
111a0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  rn SQLITE_BUSY i
111b0 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61  f.       ** we a
111c0 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  re unable to ope
111d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
111e0 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20  le. .       **. 
111f0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
11200 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
11210 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
11220 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
11230 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e.       ** jour
11240 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
11250 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68  r open unless th
11260 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
11270 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20  file holds.     
11280 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
11290 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
112a0 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
112b0 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
112c0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
112d0 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a  es opening the j
112e0 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61  ournal at the sa
112f0 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  me time..       
11300 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73  */.       rc = s
11310 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
11320 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Only(pPager->zJo
11330 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
11340 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28  jfd);.       if(
11350 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11360 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  {.         sqlit
11370 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
11380 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
11390 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
113a0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
113b0 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
113c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
113d0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20  BUSY;.       }. 
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 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
11400 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
11410 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
11420 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  ;.       pPager-
11430 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
11440 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
11450 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
11460 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
11470 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20  urnalHdr = 0;.. 
11480 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
11490 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
114a0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
114b0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
114c0 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  te.       ** loc
114d0 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
114e0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
114f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11500 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
11510 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11520 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11560 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
11570 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
11580 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68  for page in cach
11590 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
115a0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
115b0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  er, pgno);.    i
115c0 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
115d0 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
115e0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
115f0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
11600 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
11610 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
11620 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
11630 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
11640 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
11650 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
11660 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
11670 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  h;.    pPager->n
11680 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Miss++;.    if( 
11690 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
116a0 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
116b0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
116c0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  0 || pPager->mem
116d0 44 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  Db ){.      /* C
116e0 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
116f0 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20   */.      pPg = 
11700 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
11710 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
11720 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11730 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20  + sizeof(u32) + 
11760 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20  pPager->nExtra. 
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70               + p
11790 50 61 67 65 72 2d 3e 6d 65 6d 44 62 2a 73 69 7a  Pager->memDb*siz
117a0 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
117b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
117c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
117d0 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
117e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
117f0 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
11800 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
11810 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
11820 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
11830 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20  GER_ERR_MEM;.   
11840 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11850 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
11860 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
11870 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Pg, 0, sizeof(*p
11880 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg));.      if( 
11890 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
118a0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
118b0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
118c0 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
118d0 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
118e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
118f0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
11900 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
11910 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
11920 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
11930 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
11940 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
11950 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
11960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
11970 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
11980 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
11990 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
119a0 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  at does not.    
119b0 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
119c0 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
119d0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
119e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
119f0 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
11a00 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20  irstSynced;..   
11a10 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c     /* If we coul
11a20 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
11a30 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
11a40 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
11a50 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  ().      ** on t
11a60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11a70 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
11a80 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
11a90 69 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a  is is a.      **
11aa0 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
11ab0 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
11ac0 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
11ad0 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
11ae0 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  s.      ** it ca
11af0 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20  n't be helped.. 
11b00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
11b10 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
11b20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
11b30 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
11b40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11b50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
11b60 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
11b70 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
11b80 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11b90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
11ba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11bb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
11bc0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
11bd0 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
11be0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
11bf0 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
11c00 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
11c10 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
11c20 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  le. This is done
11c30 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d   to avoid ever m
11c40 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e  odifying a journ
11c50 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65 72 20  al..  ** header 
11c60 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64  that is involved
11c70 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
11c80 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
11c90 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65 61 64  ave..  ** alread
11ca0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
11cb0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
11cc0 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64  in case the head
11cd0 65 72 20 69 73 0a 09 20 20 2a 2a 20 74 72 61 73  er is..  ** tras
11ce0 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
11cf0 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
11d00 65 64 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ed)..          *
11d10 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  /.          pPag
11d20 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
11d30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11d40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11d50 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
11d60 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
11d70 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
11d80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
11d90 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
11da0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
11db0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
11dc0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
11dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11de0 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ERR;.          }
11df0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11e00 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
11e10 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d  >pFirst;.      }
11e20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11e30 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
11e40 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
11e50 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  he page to the d
11e60 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
11e70 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20  it is dirty..   
11e80 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
11e90 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
11ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
11eb0 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
11ec0 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  ;.        pPg->p
11ed0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
11ee0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
11ef0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50  ite_pagelist( pP
11f00 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  g );.        if(
11f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11f20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11f30 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
11f40 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
11f50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11f60 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
11f70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11f80 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
11f90 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  irty==0 );..    
11fa0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
11fb0 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
11fc0 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
11fd0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
11fe0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  hen.      ** set
11ff0 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
12000 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
12010 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
12020 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  the.      ** sql
12030 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ite_dont_rollbac
12040 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
12050 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
12060 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
12070 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  n..      ** It i
12080 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
12090 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
120a0 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
120b0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
120c0 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
120d0 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61  reloaded at a la
120e0 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20  ter time but at 
120f0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f  that point we wo
12100 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20  n't remember.   
12110 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61     ** that is wa
12120 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
12130 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
12140 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
12150 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ges must.      *
12160 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
12170 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
12180 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
12190 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
121a0 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
121b0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
121c0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
121d0 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
121e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
121f0 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
12200 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
12210 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
12220 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ash table.      
12230 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  */.      unlinkP
12240 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
12250 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b  pPager->nOvfl++;
12260 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
12270 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
12280 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
12290 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
122a0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
122b0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
122c0 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65    sqlite3CheckMe
122d0 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e  mory(pPager->aIn
122e0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29  Journal, pgno/8)
122f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12300 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12310 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pen );.      pPg
12320 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
12330 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
12340 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
12350 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
12360 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
12370 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nc = 0;.    }els
12380 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
12390 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
123a0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
123b0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
123c0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
123d0 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  tmt && (int)pgno
123e0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
123f0 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
12400 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  && (pPager->aInS
12410 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  tmt[pgno/8] & (1
12420 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20  <<(pgno&7)))!=0 
12430 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  ){.      page_ad
12440 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
12450 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
12460 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76        page_remov
12470 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
12480 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
12490 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
124a0 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  .    pPg->nRef =
124b0 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28   1;.    REFINFO(
124c0 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72  pPg);.    pPager
124d0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20  ->nRef++;.    h 
124e0 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e  = pager_hash(pgn
124f0 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  o);.    pPg->pNe
12500 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
12510 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70  >aHash[h];.    p
12520 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
12530 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
12540 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
12550 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12560 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
12570 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
12580 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
12590 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
125a0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
125b0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
125c0 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
125d0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
125e0 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
125f0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
12600 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
12610 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
12620 7a 65 3c 30 20 29 20 73 71 6c 69 74 65 33 70 61  ze<0 ) sqlite3pa
12630 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
12640 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
12650 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
12660 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12670 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
12680 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
12690 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
126a0 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
126b0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
126c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
126d0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
126e0 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a  ze<(int)pgno ){.
126f0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
12700 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
12710 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
12720 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
12730 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
12740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12750 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
12760 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
12770 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
12780 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66  d, (pgno-1)*(off
12790 5f 74 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  _t)pPager->pageS
127a0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
127b0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26   sqlite3OsRead(&
127c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
127d0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
127e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
127f0 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  );.      TRACE2(
12800 22 46 45 54 43 48 20 70 61 67 65 20 25 64 5c 6e  "FETCH page %d\n
12810 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ", pPg->pgno);. 
12820 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
12830 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
12840 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  (pPg), pPg->pgno
12850 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 3);.      if( 
12860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12870 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66  .        off_t f
12880 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ileSize;.       
12890 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
128a0 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
128b0 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53  fd,&fileSize)!=S
128c0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
128d0 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53          || fileS
128e0 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72  ize>=pgno*pPager
128f0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
12900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
12910 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52  ager_unref(PGHDR
12920 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a  _TO_DATA(pPg));.
12930 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12940 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   rc;.        }el
12950 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
12960 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
12970 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
12980 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
12990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
129a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
129b0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
129c0 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
129d0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
129e0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
129f0 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f  Hit++;.    page_
12a00 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
12a10 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f  *ppPage = PGHDR_
12a20 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
12a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
12a50 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
12a60 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
12a70 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
12a80 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
12a90 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
12aa0 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
12ab0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12ac0 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
12ad0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
12ae0 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
12af0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
12b00 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54  3pager_get().  T
12b10 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
12b20 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
12b30 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
12b40 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20  3pager_get() is 
12b50 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
12b60 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
12b70 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
12b80 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
12b90 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
12ba0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
12bb0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
12bc0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
12bd0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
12be0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
12bf0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
12c00 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
12c10 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
12c20 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75  lite3pager_looku
12c30 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
12c40 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
12c50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
12c60 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
12c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
12c80 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  o!=0 );.  if( pP
12c90 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
12ca0 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
12cb0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
12cc0 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70  0;.  }.  pPg = p
12cd0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
12ce0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
12cf0 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
12d00 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
12d10 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg);.  return PG
12d20 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
12d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
12d40 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
12d50 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
12d60 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
12d70 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
12d80 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
12d90 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
12da0 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
12db0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
12dc0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
12dd0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
12de0 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
12df0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
12e00 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
12e10 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
12e20 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
12e30 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69  3pager_unref(voi
12e40 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
12e50 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44  dr *pPg;..  /* D
12e60 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
12e70 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
12e80 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
12e90 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f    pPg = DATA_TO_
12ea0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
12eb0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
12ec0 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
12ed0 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
12ee0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
12ef0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
12f00 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
12f10 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
12f20 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
12f30 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
12f40 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
12f50 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
12f60 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
12f70 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
12f80 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
12f90 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
12fa0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
12fb0 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
12fc0 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
12fd0 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
12fe0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
12ff0 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
13000 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
13010 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
13020 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
13030 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
13040 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
13050 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
13060 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
13070 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70  needSync==0 && p
13080 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
13090 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ced==0 ){.      
130a0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
130b0 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20  nced = pPg;.    
130c0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
130d0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
130e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
130f0 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
13100 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
13110 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
13120 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
13130 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
13140 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
13150 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
13160 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
13170 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
13180 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
13190 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
131a0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
131b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
131c0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
131d0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
131e0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
131f0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
13200 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
13210 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13220 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
13230 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
13240 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
13250 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
13260 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
13270 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
13280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13290 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
132a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
132b0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
132c0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
132d0 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
132e0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
132f0 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
13300 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
13310 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
13320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13330 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
13340 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
13350 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
13360 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
13370 6d 65 6d 44 62 20 29 3b 0a 20 20 61 73 73 65 72  memDb );.  asser
13380 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
13390 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
133a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
133b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
133c0 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
133d0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
133e0 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74 65  rnal );.  sqlite
133f0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
13400 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
13410 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
13420 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
13430 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
13440 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
13450 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
13460 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13470 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
13480 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
13490 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
134a0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
134b0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
134c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
134d0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
134e0 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
134f0 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
13500 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
13510 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  ,pPager->tempFil
13520 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  e);.  pPager->jo
13530 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13540 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
13550 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
13560 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
13570 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
13590 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
135a0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
135b0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
135c0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  al = 0;.    sqli
135d0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
135e0 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
135f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
13600 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
13610 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
13620 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71  urn rc;.  }.  sq
13630 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
13640 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  tory(pPager->zDi
13650 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72  rectory, &pPager
13660 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72  ->jfd);.  pPager
13670 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
13680 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
13690 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
136a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
136b0 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
136c0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
136d0 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
136e0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
136f0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
13700 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
13710 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
13720 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
13730 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
13740 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
13750 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
13760 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
13770 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
13780 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
13790 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
137a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
137b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
137c0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
137d0 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
137e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
137f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
13800 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
13810 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
13820 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13830 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13840 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
13850 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
13860 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  c;  .}../*.** Ac
13870 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
13880 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
13890 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
138a0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
138b0 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
138c0 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
138d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
138e0 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
138f0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
13900 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
13910 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73  er_rollback() is
13920 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
13930 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
13940 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
13950 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
13960 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73  pager_unref() is
13970 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76   called to on ev
13980 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ery outstanding 
13990 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
139a0 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
139b0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
139c0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
139d0 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66  any open page of
139e0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
139f0 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20   file.  Nothing 
13a00 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68  changes about th
13a10 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75  e page - it is u
13a20 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a  sed merely to.**
13a30 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74   acquire a point
13a40 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
13a50 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73  structure and as
13a60 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72   proof that ther
13a70 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20  e is.** already 
13a80 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
13a90 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
13aa0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61  ** The second pa
13ab0 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
13ac0 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  s how much space
13ad0 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73   in bytes to res
13ae0 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61  erve for a.** ma
13af0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13b00 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74  e-name at the st
13b10 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
13b20 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72  al when it is cr
13b30 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  eated..**.** A j
13b40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
13b50 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73  pened if this is
13b60 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
13b70 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70   file.  For temp
13b80 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20  orary.** files, 
13b90 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74  the opening of t
13ba0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13bb0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
13bc0 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a  l there is an.**
13bd0 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
13be0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
13bf0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rnal..**.** If t
13c00 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
13c10 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20  lready reserved 
13c20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69  for writing, thi
13c30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13c40 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
13c50 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28  ite3pager_begin(
13c60 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
13c70 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
13c80 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
13c90 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
13ca0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
13cb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13cc0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
13cd0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
13ce0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13cf0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
13d00 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
13d10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
13d20 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
13d30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13d40 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
13d50 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
13d60 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
13d70 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
13d80 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
13d90 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
13da0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
13db0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
13dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13dd0 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20  int busy = 1;.  
13de0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
13df0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
13e00 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
13e10 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
13e20 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72  .      }while( r
13e30 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
13e40 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  & .          pPa
13e50 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
13e60 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  r && .          
13e70 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
13e80 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a  dler->xFunc && .
13e90 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
13ea0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
13eb0 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42  xFunc(pPager->pB
13ec0 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67  usyHandler->pArg
13ed0 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20 20  , busy++).      
13ee0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13ef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13f00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13f20 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
13f30 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
13f40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
13f50 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
13f60 20 20 20 54 52 41 43 45 32 28 22 54 52 41 4e 53     TRACE2("TRANS
13f70 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 70 50  ACTION %d\n", pP
13f80 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20  ager->fd.h);.   
13f90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
13fa0 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
13fb0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
13fc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
13fd0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
13fe0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
13ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
14000 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14010 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
14020 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
14030 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
14040 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
14050 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
14060 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
14070 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
14080 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
14090 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
140a0 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
140b0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
140c0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
140d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
140e0 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
140f0 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
14100 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
14110 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
14120 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
14130 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
14140 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
14150 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
14160 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
14170 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
14180 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
14190 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
141a0 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
141b0 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
141c0 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
141d0 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
141e0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
141f0 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
14200 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
14210 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
14220 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14230 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
14240 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
14250 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
14260 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
14270 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
14280 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
14290 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
142a0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
142b0 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
142c0 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
142d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
142e0 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
142f0 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
14300 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
14310 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67  () or sqlite3pag
14320 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f  er_rollback() to
14330 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e  .** reset..*/.in
14340 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  t sqlite3pager_w
14350 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61  rite(void *pData
14360 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
14370 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
14380 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
14390 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
143a0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
143b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
143c0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
143d0 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
143e0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29  Pager->errMask )
143f0 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  { .    return pa
14400 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
14410 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
14420 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
14430 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14440 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
14450 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
14460 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
14470 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
14480 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
14490 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
144a0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
144b0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
144c0 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
144d0 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
144e0 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50   away..  */.  pP
144f0 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
14500 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
14510 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74  al && (pPg->inSt
14520 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  mt || pPager->st
14530 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  mtInUse==0) ){. 
14540 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
14550 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 72  Cache = 1;.    r
14560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14570 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
14580 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
14590 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
145a0 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
145b0 65 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74  e.  ** written t
145c0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
145d0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
145e0 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
145f0 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68  nal.  ** or both
14600 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73  ..  **.  ** Firs
14610 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
14620 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
14630 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
14640 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61  ts and.  ** crea
14650 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
14660 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
14670 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
14680 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
14690 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
146a0 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  e3pager_begin(pD
146b0 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ata);.  if( rc!=
146c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
146d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
146e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
146f0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
14700 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28  ESERVED );.  if(
14710 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
14720 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
14730 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >useJournal ){. 
14740 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
14750 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
14760 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
14770 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
14780 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
14790 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
147a0 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
147b0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
147c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  );.  pPager->dir
147d0 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20  tyCache = 1;..  
147e0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
147f0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
14800 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
14810 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
14820 61 6e 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  an.  ** EXCLUSIV
14830 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
14840 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
14850 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
14860 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 2a  rent page to.  *
14870 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
14880 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
14890 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
148a0 65 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eady..  */.  if(
148b0 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
148c0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65   && (pPager->use
148d0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
148e0 72 2d 3e 6d 65 6d 44 62 29 20 29 7b 0a 20 20 20  r->memDb) ){.   
148f0 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
14900 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
14910 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
14920 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20     int szPg;.   
14930 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20     u32 saved;.  
14940 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14950 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20  memDb ){.       
14960 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
14970 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
14980 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
14990 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22          TRACE2("
149a0 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25 64 5c  JOURNAL page %d\
149b0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  n", pPg->pgno);.
149c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
149d0 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
149e0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
149f0 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65  ->pOrig = sqlite
14a00 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
14a10 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
14a20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
14a30 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
14a40 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
14a50 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f  t->pOrig, PGHDR_
14a60 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
14a70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
14a80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14a90 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
14aa0 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  l = 1;.      }el
14ab0 73 65 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20  se{.        u32 
14ac0 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
14ad0 73 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d  sum(pPager, pPg-
14ae0 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20  >pgno, pData);. 
14af0 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
14b00 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
14b10 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
14b20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  );.        store
14b30 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50  32bits(cksum, pP
14b40 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
14b50 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  ize);.        sz
14b60 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg = pPager->pag
14b70 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20  eSize+8;.       
14b80 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67   store32bits(pPg
14b90 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29  ->pgno, pPg, -4)
14ba0 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28  ;.        CODEC(
14bb0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
14bc0 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
14bd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14be0 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
14bf0 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a  r->jfd, &((char*
14c00 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50  )pData)[-4], szP
14c10 67 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  g);.        pPag
14c20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
14c30 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  = szPg;.        
14c40 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20  TRACE3("JOURNAL 
14c50 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
14c60 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e  =%d\n", pPg->pgn
14c70 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
14c80 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
14c90 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
14ca0 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  pPg->pgno, 0);. 
14cb0 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47         *(u32*)PG
14cc0 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
14cd0 2c 20 70 50 61 67 65 72 29 20 3d 20 73 61 76 65  , pPager) = save
14ce0 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  d;.        if( r
14cf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14d00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14d10 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
14d20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
14d30 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
14d40 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
14d50 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  FULL;.          
14d60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14d70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
14d80 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
14d90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14da0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
14db0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
14dc0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
14dd0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
14de0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
14df0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  );.        pPg->
14e00 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
14e10 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
14e20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
14e30 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  al = 1;.        
14e40 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
14e50 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20  InUse ){.       
14e60 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
14e70 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
14e80 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
14e90 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  &7);.          p
14ea0 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
14eb0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20  list(pPg);.     
14ec0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
14ee0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
14ef0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
14f00 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
14f10 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
14f20 54 52 41 43 45 33 28 22 41 50 50 45 4e 44 20 70  TRACE3("APPEND p
14f30 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
14f40 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
14f50 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
14f60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14f70 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
14f80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
14f90 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
14fa0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
14fb0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
14fc0 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
14fd0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
14fe0 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68  t in it,.  ** th
14ff0 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
15000 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
15010 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
15020 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
15030 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
15040 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
15050 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
15060 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
15070 61 6c 20 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 69  al format.  ** i
15080 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
15090 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
150a0 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
150b0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
150c0 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70  >stmtInUse && !p
150d0 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69  Pg->inStmt && (i
150e0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
150f0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
15100 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
15110 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
15120 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
15130 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
15140 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
15150 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
15160 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
15170 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
15180 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
15190 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
151a0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30   pHist->pStmt==0
151b0 20 29 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   );.      pHist-
151c0 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  >pStmt = sqliteM
151d0 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
151e0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
151f0 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
15200 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
15210 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
15220 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
15230 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
15240 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
15250 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32    }.      TRACE2
15260 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 70  ("STMT-JOURNAL p
15270 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  age %d\n", pPg->
15280 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pgno);.    }else
15290 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 33 32 62  {.      store32b
152a0 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  its(pPg->pgno, p
152b0 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 43  Pg, -4);.      C
152c0 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
152d0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
152e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
152f0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
15300 61 67 65 72 2d 3e 73 74 66 64 2c 20 28 28 63 68  ager->stfd, ((ch
15310 61 72 2a 29 70 44 61 74 61 29 2d 34 2c 20 70 50  ar*)pData)-4, pP
15320 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
15330 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  );.      TRACE2(
15340 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 70 61  "STMT-JOURNAL pa
15350 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  ge %d\n", pPg->p
15360 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  gno);.      CODE
15370 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
15380 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a   pPg->pgno, 0);.
15390 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
153a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
153b0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
153c0 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
153d0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
153e0 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
153f0 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20  ER_ERR_FULL;.   
15400 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
15420 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
15430 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15440 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
15450 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  =0 );.      pPag
15460 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
15470 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
15480 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
15490 20 20 7d 0a 20 20 20 20 70 61 67 65 5f 61 64 64    }.    page_add
154a0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
154b0 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  g);.  }..  /* Up
154c0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
154d0 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
154e0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  n..  */.  if( pP
154f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
15500 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  t)pPg->pgno ){. 
15510 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
15520 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
15530 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
15540 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d  memDb && pPager-
15550 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47  >dbSize==PENDING
15560 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
15570 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
15580 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b  pPager->dbSize++
15590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
155a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
155b0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
155c0 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
155d0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
155e0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
155f0 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
15600 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
15610 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
15620 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
15630 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
15640 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
15650 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
15660 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
15670 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65  ager_iswriteable
15680 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
15690 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
156a0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
156b0 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  a);.  return pPg
156c0 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->dirty;.}../*.*
156d0 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f  * Replace the co
156e0 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c  ntent of a singl
156f0 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  e page with the 
15700 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
15710 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75  he third.** argu
15720 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
15730 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72  ite3pager_overwr
15740 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
15750 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
15760 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f  id *pData){.  vo
15770 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  id *pPage;.  int
15780 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
15790 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
157a0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61  ager, pgno, &pPa
157b0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
157c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
157d0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
157e0 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
157f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
15810 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44 61  emcpy(pPage, pDa
15820 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
15830 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
15840 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
15850 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  ref(pPage);.  }.
15860 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15870 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
15880 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
15890 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
158a0 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
158b0 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
158c0 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
158d0 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22  n on page "pgno"
158e0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
158f0 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
15900 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
15910 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
15920 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  irty..**.** The 
15930 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
15940 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
15950 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
15960 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
15970 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
15980 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
15990 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
159a0 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
159b0 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
159c0 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
159d0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
159e0 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
159f0 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
15a00 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
15a10 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
15a20 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
15a30 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77  rollback() below
15a40 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62  , more than doub
15a50 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20  le the speed.** 
15a60 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20  of large INSERT 
15a70 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71  operations and q
15a80 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
15a90 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45  ed of large DELE
15aa0 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  TEs..**.** When 
15ab0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15ac0 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20  called, set the 
15ad0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
15ae0 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20  lag to true..** 
15af0 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
15b00 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
15b10 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
15b20 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
15b30 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
15b40 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
15b50 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
15b60 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
15b70 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
15b80 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
15b90 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
15ba0 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
15bb0 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
15bc0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
15bd0 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
15be0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
15bf0 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
15c00 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
15c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
15c20 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
15c30 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
15c40 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
15c50 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
15c60 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
15c70 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15c80 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
15c90 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f  ,.** the dont_ro
15ca0 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
15cb0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
15cc0 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
15cd0 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72  e contains.** cr
15ce0 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
15cf0 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
15d00 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f   sure it gets ro
15d10 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
15d20 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e  te.** of the don
15d30 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  t_rollback() cal
15d40 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
15d50 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69  e3pager_dont_wri
15d60 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
15d70 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
15d80 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
15d90 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
15da0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50   ) return;..  pP
15db0 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
15dc0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
15dd0 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
15de0 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28  lback = 1;.  if(
15df0 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72   pPg && pPg->dir
15e00 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ty ){.    if( pP
15e10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
15e20 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
15e30 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
15e40 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
15e50 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
15e60 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
15e70 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
15e80 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
15e90 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
15ea0 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
15eb0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
15ec0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
15ed0 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
15ee0 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
15ef0 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
15f00 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
15f10 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
15f20 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
15f30 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
15f40 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
15f50 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
15f60 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
15f70 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
15f80 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
15f90 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
15fa0 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
15fb0 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
15fc0 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
15fd0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
15fe0 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
15ff0 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
16000 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
16010 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
16020 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
16030 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
16040 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
16050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16060 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49  TRACE3("DONT_WRI
16070 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
16080 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  \n", pgno, pPage
16090 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20 20  r->fd.h);.      
160a0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
160b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
160c0 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
160d0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
160e0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
160f0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
16100 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
16110 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
16120 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
16130 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
16140 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
16150 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
16160 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
16170 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
16180 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
16190 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
161a0 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  al..*/.void sqli
161b0 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
161c0 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61  llback(void *pDa
161d0 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
161e0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
161f0 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
16200 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
16210 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20  >pPager;..  if( 
16220 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
16230 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
16240 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
16250 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72  lOpen==0 ) retur
16260 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  n;.  if( pPg->al
16270 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
16280 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
16290 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
162a0 2d 3e 6d 65 6d 44 62 20 29 20 72 65 74 75 72 6e  ->memDb ) return
162b0 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  ;.  if( !pPg->in
162c0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
162d0 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
162e0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
162f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16300 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
16310 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l!=0 );.    pPag
16320 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
16330 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
16340 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
16350 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
16360 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  nal = 1;.    if(
16370 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
16380 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  se ){.      pPag
16390 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
163a0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
163b0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
163c0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
163d0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
163e0 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 33      }.    TRACE3
163f0 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  ("DONT_ROLLBACK 
16400 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
16410 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 61  , pPg->pgno, pPa
16420 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 7d 0a  ger->fd.h);.  }.
16430 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
16440 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d  mtInUse && !pPg-
16450 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  >inStmt && (int)
16460 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
16470 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20  r->stmtSize ){. 
16480 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
16490 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
164a0 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
164b0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
164c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
164d0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
164e0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
164f0 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
16500 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
16510 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61  >pgno&7);.    pa
16520 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
16530 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a  ist(pPg);.  }.}.
16540 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  ../*.** Clear a 
16550 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a  PgHistory block.
16560 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
16570 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69  learHistory(PgHi
16580 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20  story *pHist){. 
16590 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
165a0 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
165b0 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
165c0 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e  Stmt);.  pHist->
165d0 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69  pOrig = 0;.  pHi
165e0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d  st->pStmt = 0;.}
165f0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
16600 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
16610 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
16620 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
16630 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
16640 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
16650 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
16660 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
16670 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
16680 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
16690 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
166a0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
166b0 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
166c0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
166d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
166e0 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  er_commit(Pager 
166f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
16700 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
16710 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
16720 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f  >errMask==PAGER_
16730 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
16740 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
16750 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
16760 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
16770 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16780 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
16790 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ULL;.    }.    r
167a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
167b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
167c0 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
167d0 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
167e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
167f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
16800 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
16810 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
16820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16830 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
16840 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54    TRACE2("COMMIT
16850 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
16860 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61  fd.h);.  if( pPa
16870 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
16880 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
16890 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
168a0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77  s(pPager);.    w
168b0 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20  hile( pPg ){.   
168c0 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
168d0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
168e0 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20  g, pPager));.   
168f0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
16900 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
16910 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
16920 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
16930 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
16940 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
16950 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
16960 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
16970 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69  pDirty;.    }.#i
16980 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
16990 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
169a0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
169b0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
169c0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
169d0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
169e0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
169f0 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
16a00 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
16a10 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
16a20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
16a30 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
16a40 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
16a50 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
16a60 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
16a70 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
16a80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
16a90 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
16aa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16ab0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
16ac0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
16ad0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==0 ){.    /* E
16ae0 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f  xit early (witho
16af0 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d  ut doing the tim
16b00 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69  e-consuming sqli
16b10 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c  te3OsSync() call
16b20 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  s).    ** if the
16b30 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
16b40 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
16b50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
16b60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16b70 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  ger->needSync==0
16b80 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
16b90 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
16ba0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
16bb0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
16bc0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
16bd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
16be0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16bf0 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
16c00 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50  te3pager_sync(pP
16c10 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  ager, 0);.  if( 
16c20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16c30 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  .    goto commit
16c40 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63  _abort;.  }.  rc
16c50 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
16c60 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
16c70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
16c80 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   -1;.  return rc
16c90 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
16ca0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
16cb0 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20  es wrong during 
16cc0 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
16cd0 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f  ss..  */.commit_
16ce0 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71  abort:.  rc = sq
16cf0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
16d00 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ack(pPager);.  i
16d10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16d20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
16d30 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20  ITE_FULL;.  }.  
16d40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16d50 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
16d60 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
16d70 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
16d80 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
16d90 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
16da0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
16db0 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
16dc0 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
16dd0 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
16de0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
16df0 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
16e00 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
16e10 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
16e20 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
16e30 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
16e40 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
16e50 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
16e60 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ol (SQLITE_PROTO
16e70 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73  COL) or unless s
16e80 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
16e90 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20  cess is writing 
16ea0 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a  trash into the j
16eb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c  ournal file (SQL
16ec0 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a  ITE_CORRUPT) or.
16ed0 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f  ** unless a prio
16ee0 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  r malloc() faile
16ef0 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  d (SQLITE_NOMEM)
16f00 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
16f10 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72  rror.** codes ar
16f20 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61  e returned for a
16f30 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f  ll these occasio
16f40 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  ns.  Otherwise,.
16f50 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
16f60 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
16f70 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
16f80 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
16f90 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
16fa0 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42  .  TRACE2("ROLLB
16fb0 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ACK %d\n", pPage
16fc0 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20  r->fd.h);.  if( 
16fd0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
16fe0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
16ff0 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d     for(p=pPager-
17000 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
17010 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
17020 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
17030 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17040 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  !p->alwaysRollba
17050 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
17060 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  !p->dirty ){.   
17070 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
17080 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
17090 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
170a0 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a  ger))->pOrig );.
170b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
170c0 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
170d0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
170e0 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20  pPager))->pStmt 
170f0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
17100 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nue;.      }..  
17110 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
17120 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
17130 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
17140 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
17150 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
17160 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
17170 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70   pHist->pOrig, p
17180 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
17190 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32  ;.        TRACE2
171a0 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20  ("ROLLBACK-PAGE 
171b0 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b  %d\n", p->pgno);
171c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
171d0 20 20 20 20 20 20 54 52 41 43 45 32 28 22 50 41        TRACE2("PA
171e0 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 5c 6e  GE %d is clean\n
171f0 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  ", p->pgno);.   
17200 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
17210 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
17220 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
17230 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
17240 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
17250 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b    p->inStmt = 0;
17260 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53  .      p->pPrevS
17270 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74  tmt = p->pNextSt
17280 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
17290 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
172a0 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
172b0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
172c0 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  r(PGHDR_TO_DATA(
172d0 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  p), pPager->page
172e0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
172f0 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20       .    }.    
17300 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
17310 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
17320 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
17330 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20  origDbSize;.    
17340 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
17350 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
17360 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
17370 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
17380 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
17390 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
173a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
173b0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
173c0 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
173d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
173e0 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
173f0 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
17400 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
17410 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
17420 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
17430 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
17440 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26  er->errMask!=0 &
17450 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  & pPager->errMas
17460 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  k!=PAGER_ERR_FUL
17470 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
17480 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
17490 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
174a0 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
174b0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
174c0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61   }.    return pa
174d0 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
174e0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
174f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
17500 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
17510 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
17520 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f   rc = pager_relo
17530 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
17540 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  ;.    rc2 = page
17550 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
17560 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
17570 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17580 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
17590 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
175a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
175b0 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
175c0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
175d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
175e0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
175f0 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  PT;.    pPager->
17600 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
17610 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20  _ERR_CORRUPT;.  
17620 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
17630 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ze = -1;.  retur
17640 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
17650 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
17660 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17670 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
17680 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
17690 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
176a0 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
176b0 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
176c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
176d0 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61  er_isreadonly(Pa
176e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
176f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
17700 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
17710 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
17720 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
17730 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
17740 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
17750 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73  lite3pager_stats
17760 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17770 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
17780 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61  9];.  a[0] = pPa
17790 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31  ger->nRef;.  a[1
177a0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ] = pPager->nPag
177b0 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67  e;.  a[2] = pPag
177c0 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b  er->mxPage;.  a[
177d0 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
177e0 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50  ize;.  a[4] = pP
177f0 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
17800 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
17810 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20  rMask;.  a[6] = 
17820 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20  pPager->nHit;.  
17830 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[7] = pPager->n
17840 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70  Miss;.  a[8] = p
17850 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20  Pager->nOvfl;.  
17860 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a  return a;.}../*.
17870 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
17880 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
17890 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
178a0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
178b0 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
178c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
178d0 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
178e0 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
178f0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
17900 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
17910 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
17920 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
17930 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
17940 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
17950 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
17960 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
17970 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
17980 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  _begin(Pager *pP
17990 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
179a0 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
179b0 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
179c0 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ZE];.  assert( !
179d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
179e0 65 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53  e );.  TRACE2("S
179f0 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c  TMT-BEGIN %d\n",
17a00 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
17a10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
17a20 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
17a30 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
17a40 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
17a50 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
17a60 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74  >dbSize;.    ret
17a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17a80 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
17a90 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
17aa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
17ab0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20  tAutoopen = 1;. 
17ac0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17ad0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
17ae0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
17af0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67  alOpen );.  pPag
17b00 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71  er->aInStmt = sq
17b10 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
17b20 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
17b30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
17b40 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a  ->aInStmt==0 ){.
17b50 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63      sqlite3OsLoc
17b60 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  k(&pPager->fd, S
17b70 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
17b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
17b90 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  OMEM;.  }.#ifnde
17ba0 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20  f NDEBUG.  rc = 
17bb0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
17bc0 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
17bd0 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69  &pPager->stmtJSi
17be0 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
17bf0 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
17c00 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74  failed;.  assert
17c10 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  ( pPager->stmtJS
17c20 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a  ize == pPager->j
17c30 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e  ournalOff );.#en
17c40 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  dif.  pPager->st
17c50 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
17c60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
17c70 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
17c80 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
17c90 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
17ca0 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
17cb0 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
17cc0 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
17cd0 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
17ce0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
17cf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17d00 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
17d10 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e  zTemp, &pPager->
17d20 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  stfd);.    if( r
17d30 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
17d40 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
17d50 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
17d60 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
17d70 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
17d80 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
17d90 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
17da0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17db0 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
17dc0 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
17dd0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
17de0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
17df0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
17e00 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
17e10 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
17e20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17e30 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
17e40 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
17e50 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
17e60 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
17e70 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
17e80 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
17e90 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
17ea0 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52  , *pNext;.    TR
17eb0 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE2("STMT-COMMI
17ec0 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  T %d\n", pPager-
17ed0 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20  >fd.h);.    if( 
17ee0 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
17ef0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
17f00 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73  sSeek(&pPager->s
17f10 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f  tfd, 0);.      /
17f20 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  * sqlite3OsTrunc
17f30 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ate(&pPager->stf
17f40 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  d, 0); */.      
17f50 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
17f60 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20  er->aInStmt );. 
17f70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
17f80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
17f90 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
17fa0 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
17fb0 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
17fc0 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
17fd0 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20  NextStmt;.      
17fe0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53  assert( pPg->inS
17ff0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67  tmt );.      pPg
18000 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
18010 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
18020 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
18030 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
18040 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
18050 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
18060 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
18070 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
18080 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
18090 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
180a0 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
180b0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
180c0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
180d0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
180e0 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
180f0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
18100 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
18110 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
18120 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
18130 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
18140 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18150 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
18160 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
18170 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
18180 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c  e3pager_stmt_rol
18190 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
181a0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
181b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
181c0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54  mtInUse ){.    T
181d0 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
181e0 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67  BACK %d\n", pPag
181f0 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69  er->fd.h);.    i
18200 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
18210 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
18220 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  *pPg;.      for(
18230 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
18240 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  t; pPg; pPg=pPg-
18250 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
18260 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
18270 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
18280 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
18290 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
182a0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
182b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
182c0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
182d0 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d  Pg), pHist->pStm
182e0 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t, pPager->pageS
182f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
18300 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
18310 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
18320 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
18330 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
18340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
18350 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
18360 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
18370 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  .      memoryTru
18380 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
18390 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
183a0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
183b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
183c0 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
183d0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
183e0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
183f0 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65  tmt_commit(pPage
18400 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
18410 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18420 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
18430 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
18440 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18450 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18460 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
18470 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18480 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
18490 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
184a0 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  r_filename(Pager
184b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
184c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
184d0 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
184e0 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
184f0 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
18500 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
18510 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
18520 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50  3pager_dirname(P
18530 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
18540 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18550 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
18560 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18570 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
18580 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18590 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
185a0 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a   *sqlite3pager_j
185b0 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
185c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
185d0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
185e0 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rnal;.}../*.** S
185f0 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
18600 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
18610 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
18620 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61  _set_codec(.  Pa
18630 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
18640 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f  oid (*xCodec)(vo
18650 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
18660 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
18670 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
18680 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
18690 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
186a0 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
186b0 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  cArg;.}../*.** T
186c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
186d0 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
186e0 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
186f0 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
18700 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
18710 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
18720 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
18730 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
18740 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
18750 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
18760 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67  r){.  void *pPag
18770 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  e;.  PgHdr *pPgH
18780 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
18790 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
187a0 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70  rc;..  /* Open p
187b0 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
187c0 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
187d0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
187e0 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
187f0 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , 1, &pPage);.  
18800 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18810 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
18820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
18830 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
18840 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18850 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
18860 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
18870 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
18880 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  t byte 24. */.  
18890 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f  pPgHdr = DATA_TO
188a0 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20  _PGHDR(pPage);. 
188b0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
188c0 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
188d0 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20  (pPgHdr, 24);.. 
188e0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
188f0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
18900 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
18910 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
18920 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
18930 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32  ter++;.  store32
18940 62 69 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e  bits(change_coun
18950 74 65 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29  ter, pPgHdr, 24)
18960 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  ;..  /* Release 
18970 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
18980 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ce. */.  sqlite3
18990 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
189a0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
189b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
189c0 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
189d0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
189e0 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
189f0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
18a00 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
18a10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18a20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
18a30 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
18a40 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
18a50 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
18a60 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
18a70 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
18a80 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
18a90 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
18aa0 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
18ab0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
18ac0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
18ad0 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
18ae0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
18af0 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
18b00 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
18b10 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
18b20 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
18b30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18b40 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
18b50 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
18b60 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
18b70 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
18b80 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
18b90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
18ba0 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
18bb0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
18bc0 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
18bd0 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
18be0 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
18bf0 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
18c00 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
18c10 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
18c20 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65  o an sqlite3page
18c30 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a  r_sync() call..*
18c40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
18c50 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  er_sync(Pager *p
18c60 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
18c70 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
18c80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18c90 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  K;..  /* If this
18ca0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
18cb0 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
18cc0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
18cd0 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
18ce0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
18cf0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
18d00 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
18d10 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
18d20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
18d30 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
18d40 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26  pPager->memDb &&
18d50 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
18d60 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
18d70 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
18d80 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
18d90 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f  alOpen );..    /
18da0 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
18db0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
18dc0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
18dd0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
18de0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
18df0 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
18e00 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
18e10 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
18e20 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
18e30 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
18e40 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
18e50 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
18e60 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
18e70 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
18e80 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
18e90 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
18ea0 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
18eb0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
18ec0 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
18ed0 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
18ee0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
18ef0 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
18f00 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
18f10 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
18f20 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
18f30 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
18f40 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
18f50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18f60 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
18f70 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
18f80 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
18f90 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
18fa0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18fb0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
18fc0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
18fd0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
18fe0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19000 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
19010 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  it;.    }..    /
19020 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
19030 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
19040 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
19050 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
19060 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
19070 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
19080 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
19090 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
190a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
190b0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
190c0 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
190d0 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
190e0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
190f0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
19100 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
19110 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
19120 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
19130 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d    }..    pPager-
19140 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
19150 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63  YNCED;.  }..sync
19160 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20  _exit:.  return 
19170 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
19180 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
19190 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
191a0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
191b0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
191c0 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66  t state of the f
191d0 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65  ile lock for the
191e0 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
191f0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
19200 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c  e is one of NO_L
19210 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  OCK, SHARED_LOCK
19220 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c  , RESERVED_LOCK,
19230 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  .** PENDING_LOCK
19240 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  , or EXCLUSIVE_L
19250 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  OCK..*/.int sqli
19260 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61  te3pager_locksta
19270 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
19280 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53  ){.#ifdef OS_TES
19290 54 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  T.  return pPage
192a0 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79  r->fd->fd.lockty
192b0 70 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  pe;.#else.  retu
192c0 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c 6f  rn pPager->fd.lo
192d0 63 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 7d  cktype;.#endif.}
192e0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
192f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
19300 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
19310 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
19320 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
19330 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
19340 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
19350 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
19360 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
19370 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
19380 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
19390 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
193a0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
193b0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
193c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
193d0 70 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  printf("PAGE %3d
193e0 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65   addr=0x%08x nRe
193f0 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
19400 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74   pPg->pgno, (int
19410 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
19420 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
19430 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a        .  }.}.#endif.