/ Hex Artifact Content
Login

Artifact f42526a134d56f5ee4b4217211dd36b3c8f00963:


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 33  : pager.c,v 1.13
0350: 33 20 32 30 30 34 2f 30 36 2f 32 31 20 31 38 3a  3 2004/06/21 18:
0360: 31 34 3a 34 37 20 64 72 68 20 45 78 70 20 24 0a  14:47 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 53 51 4c 49 54 45 5f 50 41  /.  /* SQLITE_PA
1760: 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66  GE_SIZE 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: 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68  P) ((void*)&((ch
1c80: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 53  ar*)(&(P)[1]))[S
1c90: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d  QLITE_PAGE_SIZE]
1ca0: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
1cb0: 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20  TO_HIST(P,PGR)  
1cc0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  \.            ((
1cd0: 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68  PgHistory*)&((ch
1ce0: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28  ar*)(&(P)[1]))[(
1cf0: 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28  PGR)->pageSize+(
1d00: 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a  PGR)->nExtra])..
1d10: 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f  /*.** How big to
1d20: 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
1d30: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  able used for lo
1d40: 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79  cating in-memory
1d50: 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67   pages.** by pag
1d60: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65  e number..*/.#de
1d70: 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32  fine N_PG_HASH 2
1d80: 30 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20  048../*.** Hash 
1d90: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f  a page number.*/
1da0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68  .#define pager_h
1db0: 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28  ash(PN)  ((PN)&(
1dc0: 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f  N_PG_HASH-1))../
1dd0: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
1de0: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
1df0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1e00: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1e10: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
1e20: 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  r {.  char *zFil
1e30: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
1e40: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1e50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1e60: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
1e70: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1e80: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
1e90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
1ea0: 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72   char *zDirector
1eb0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
1ec0: 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64  Directory hold d
1ed0: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
1ee0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f  nal files */.  O
1ef0: 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20  sFile fd, jfd;  
1f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1f10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
1f20: 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  or database and 
1f30: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46  journal */.  OsF
1f40: 69 6c 65 20 73 74 66 64 3b 20 20 20 20 20 20 20  ile stfd;       
1f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1f60: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
1f70: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
1f80: 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e 74  bjournal*/.  int
1f90: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
1fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1fb0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1fc0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
1fd0: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
1fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
1ff0: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
2000: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
2010: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2030: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
2040: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
2050: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
2060: 20 20 6f 66 66 5f 74 20 73 74 6d 74 4a 53 69 7a    off_t stmtJSiz
2070: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2080: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
2090: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
20a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
20d0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
20e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
20f0: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2110: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
2120: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
2130: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
2140: 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20  int stmtNRec;   
2150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2160: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
2170: 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72   in stmt subjour
2180: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  nal */.  int nEx
2190: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
21a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
21b0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
21c0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
21d0: 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ge */.  void (*x
21e0: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
21f0: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
2200: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2210: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
2220: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2230: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
2240: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
2250: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
2260: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
2270: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
2280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2290: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
22a0: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
22b0: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22d0: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
22e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
22f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2320: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2330: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2340: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2360: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2370: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
2380: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
2390: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
23a0: 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f  ss, nOvfl;     /
23b0: 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69  * Cache hits, mi
23c0: 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f  ssing, and LRU o
23d0: 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 76 6f  verflows */.  vo
23e0: 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
23f0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
2400: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
2410: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
2420: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
2430: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
2440: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
2450: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
2460: 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  () */.  u8 journ
2470: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
2480: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
2490: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
24a0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
24b0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
24c0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
24d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
24e0: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
24f0: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2500: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2520: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2530: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2540: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
2550: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2560: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2570: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
2580: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
2590: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b0: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
25c0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
25d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
25e0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
25f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2600: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
2610: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
2620: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
2630: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2650: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
2660: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
2670: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
2680: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2690: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
26a0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
26b0: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
26c0: 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b  s */.  u8 state;
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
26f0: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
2700: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
2710: 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20    u8 errMask;   
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2730: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
2740: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
2750: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
2760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2770: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
2780: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2790: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
27a0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
27b0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
27c0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
27d0: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ase */.  u8 need
27e0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
27f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2800: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
2810: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
2820: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
2830: 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  yCache;         
2840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2850: 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76  cached pages hav
2860: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
2870: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
2880: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
2890: 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  sable dont_rollb
28a0: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
28b0: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
28c0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
28d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
28e0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
28f0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61 49   I/O */.  u8 *aI
2900: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
2910: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2920: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2930: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2940: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
2950: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
2960: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2970: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2980: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2990: 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20  .  int nMaster; 
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
29c0: 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  s to reserve for
29d0: 20 6d 61 73 74 65 72 20 6a 2e 70 20 2a 2f 0a 20   master j.p */. 
29e0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
29f0: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
2a00: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
2a10: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
2a20: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
2a30: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
2a40: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
2a50: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
2a60: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
2a70: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
2a80: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
2a90: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
2aa0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
2ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ac0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
2ad0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
2ae0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
2af0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
2b00: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
2b10: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
2b20: 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  nal */.  PgHdr *
2b30: 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d  aHash[N_PG_HASH]
2b40: 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ;    /* Hash tab
2b50: 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e  le to map page n
2b60: 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a  umber to PgHdr *
2b70: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  /.};../*.** Thes
2b80: 65 20 61 72 65 20 62 69 74 73 20 74 68 61 74 20  e are bits that 
2b90: 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61  can be set in Pa
2ba0: 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a  ger.errMask..*/.
2bb0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
2bc0: 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20  R_FULL     0x01 
2bd0: 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66 61   /* a write() fa
2be0: 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  iled */.#define 
2bf0: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20  PAGER_ERR_MEM   
2c00: 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c     0x02  /* mall
2c10: 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23  oc() failed */.#
2c20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
2c30: 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20  _LOCK     0x04  
2c40: 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  /* error in the 
2c50: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
2c60: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
2c70: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30  R_ERR_CORRUPT  0
2c80: 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65  x08  /* database
2c90: 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   or journal corr
2ca0: 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e  uption */.#defin
2cb0: 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  e PAGER_ERR_DISK
2cc0: 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67 65       0x10  /* ge
2cd0: 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65  neral disk I/O e
2ce0: 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64 20  rror - bad hard 
2cf0: 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  drive? */../*.**
2d00: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
2d10: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
2d20: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
2d30: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
2d40: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
2d50: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
2d60: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
2d70: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
2d80: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
2d90: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
2da0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
2db0: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
2dc0: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
2dd0: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
2de0: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
2df0: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
2e00: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
2e10: 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65   begin.** writte
2e20: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
2e30: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
2e40: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
2e50: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
2e60: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
2e70: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
2e80: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
2e90: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
2ea0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
2eb0: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
2ec0: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
2ed0: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
2ee0: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
2ef0: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
2f00: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
2f10: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
2f20: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
2f30: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
2f40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
2f50: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
2f60: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
2f70: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
2f80: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
2f90: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
2fa0: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
2fb0: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
2fc0: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
2fd0: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
2fe0: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 53  number and the S
2ff0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20  QLITE_PAGE_SIZE 
3000: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
3010: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
3020: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
3030: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
3040: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
3050: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
3060: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
3070: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
3080: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
3090: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
30a0: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
30b0: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
30c0: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
30d0: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
30e0: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
30f0: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
3100: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
3110: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
3120: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
3130: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
3140: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
3150: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
3160: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
3170: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
3180: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
3190: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
31a0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
31b0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
31c0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
31d0: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
31e0: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
31f0: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
3200: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
3210: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
3220: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
3230: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
3240: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
3250: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
3260: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
3270: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
3280: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
3290: 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61  r and of each pa
32a0: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
32b0: 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  l is determined.
32c0: 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ** by the follow
32d0: 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23  ing macros..*/.#
32e0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
32f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 32  DR_SZ(pPager) (2
3300: 34 20 2b 20 28 70 50 61 67 65 72 29 2d 3e 6e 4d  4 + (pPager)->nM
3310: 61 73 74 65 72 29 0a 23 64 65 66 69 6e 65 20 4a  aster).#define J
3320: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
3330: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
3340: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
3350: 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65  ./*.** Enable re
3360: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72  ference count tr
3370: 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75  acking (for debu
3380: 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a  gging) here:.*/.
3390: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
33a0: 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  ST.  int pager3_
33b0: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
33c0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
33d0: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
33e0: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
33f0: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
3400: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
3410: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
3420: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
3430: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  printf(.       "
3440: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
3450: 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c  =0x%08x nRef=%d\
3460: 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67  n",.       p->pg
3470: 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54  no, (int)PGHDR_T
3480: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
3490: 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e  ef.    );.    cn
34a0: 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68  t++;   /* Someth
34b0: 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65  ing to set a bre
34c0: 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20  akpoint on */.  
34d0: 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e  }.# define REFIN
34e0: 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66  FO(X)  pager_ref
34f0: 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20  info(X).#else.# 
3500: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
3510: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
3520: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
3530: 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67  teger from the g
3540: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
3550: 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65  ptor.  Store the
3560: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74   integer.** that
3570: 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65   is read in *pRe
3580: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
3590: 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
35a0: 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e  ng worked, or an
35b0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
35c0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
35d0: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c   wrong..**.** Al
35e0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
35f0: 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62  red on disk as b
3600: 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74  ig-endian..*/.st
3610: 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62  atic int read32b
3620: 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20  its(OsFile *fd, 
3630: 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33  u32 *pRes){.  u3
3640: 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b  2 res;.  int rc;
3650: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
3660: 73 52 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20  sRead(fd, &res, 
3670: 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20  sizeof(res));.  
3680: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3690: 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  K ){.    unsigne
36a0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
36b0: 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65    memcpy(ac, &re
36c0: 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d  s, 4);.    res =
36d0: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
36e0: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
36f0: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
3700: 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72  .  }.  *pRes = r
3710: 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  es;.  return rc;
3720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
3730: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
3740: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
3750: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
3760: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
3770: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
3780: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
3790: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
37a0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
37b0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
37c0: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
37d0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
37e0: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
37f0: 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  ;.  ac[0] = (val
3800: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
3810: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
3820: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
3830: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
3840: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
3850: 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72 65 74  al & 0xff;.  ret
3860: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
3870: 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d  te(fd, ac, 4);.}
3880: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
3890: 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  e 32-bit integer
38a0: 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20   'val' into the 
38b0: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
38c0: 62 79 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a  by page header.*
38d0: 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65 74 20  * 'p' at offset 
38e0: 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61  'offset'..*/.sta
38f0: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32  tic void store32
3900: 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67  bits(u32 val, Pg
3910: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
3920: 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  et){.  unsigned 
3930: 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d  char *ac;.  ac =
3940: 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61   &((unsigned cha
3950: 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
3960: 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  (p))[offset];.  
3970: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
3980: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
3990: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
39a0: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
39b0: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
39c0: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
39d0: 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
39e0: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
39f0: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
3a00: 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68  'offset' from th
3a10: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
3a20: 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61  d by.** page hea
3a30: 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74  der 'p'..*/.stat
3a40: 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65 33  ic u32 retrieve3
3a50: 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20  2bits(PgHdr *p, 
3a60: 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75  int offset){.  u
3a70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63  nsigned char *ac
3a80: 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69  ;.  ac = &((unsi
3a90: 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52  gned char*)PGHDR
3aa0: 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66  _TO_DATA(p))[off
3ab0: 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28  set];.  return (
3ac0: 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63  ac[0]<<24) | (ac
3ad0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32  [1]<<16) | (ac[2
3ae0: 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d  ]<<8) | ac[3];.}
3af0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
3b00: 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
3b10: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3b20: 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72   into an appropr
3b30: 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f  ate.** return co
3b40: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
3b50: 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  t pager_errcode(
3b60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
3b70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
3b80: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
3b90: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
3ba0: 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20  GER_ERR_LOCK )  
3bb0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
3bc0: 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50  OTOCOL;.  if( pP
3bd0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
3be0: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29  PAGER_ERR_DISK )
3bf0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3c00: 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61  IOERR;.  if( pPa
3c10: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
3c20: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20  AGER_ERR_FULL ) 
3c30: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
3c40: 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ULL;.  if( pPage
3c50: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
3c60: 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20  ER_ERR_MEM )    
3c70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
3c80: 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  EM;.  if( pPager
3c90: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
3ca0: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20  R_ERR_CORRUPT ) 
3cb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
3cc0: 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  UPT;.  return rc
3cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
3ce0: 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20  r remove a page 
3cf0: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
3d00: 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20   all pages that 
3d10: 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74  are in the.** st
3d20: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
3d30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
3d40: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
3d50: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
3d60: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
3d70: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61  ly in.** the sta
3d80: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
3d90: 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20   This helps the 
3da0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
3db0: 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f  t_commit().** ro
3dc0: 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66  utine run MUCH f
3dd0: 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  aster for the co
3de0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
3df0: 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a  there are many.*
3e00: 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72  * pages in memor
3e10: 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77  y but only a few
3e20: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
3e30: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
3e40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
3e50: 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
3e60: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
3e70: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
3e80: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
3e90: 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d    if( pPg->inStm
3ea0: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  t ) return;.  as
3eb0: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76  sert( pPg->pPrev
3ec0: 53 74 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Stmt==0 && pPg->
3ed0: 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a  pNextStmt==0 );.
3ee0: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
3ef0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
3f00: 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  er->pStmt ){.   
3f10: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e   pPager->pStmt->
3f20: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b  pPrevStmt = pPg;
3f30: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
3f40: 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e  tStmt = pPager->
3f50: 70 53 74 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d  pStmt;.  pPager-
3f60: 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  >pStmt = pPg;.  
3f70: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pPg->inStmt = 1;
3f80: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
3f90: 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
3fa0: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
3fb0: 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50  *pPg){.  if( !pP
3fc0: 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75  g->inStmt ) retu
3fd0: 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  rn;.  if( pPg->p
3fe0: 50 72 65 76 53 74 6d 74 20 29 7b 0a 20 20 20 20  PrevStmt ){.    
3ff0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72  assert( pPg->pPr
4000: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
4010: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
4020: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
4030: 65 78 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  extStmt = pPg->p
4040: 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  NextStmt;.  }els
4050: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
4060: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d  Pg->pPager->pStm
4070: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
4080: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  g->pPager->pStmt
4090: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
40a0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  t;.  }.  if( pPg
40b0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20  ->pNextStmt ){. 
40c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
40d0: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
40e0: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
40f0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
4100: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
4110: 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d  ->pPrevStmt;.  }
4120: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  .  pPg->pNextStm
4130: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50  t = 0;.  pPg->pP
4140: 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  revStmt = 0;.  p
4150: 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
4160: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
4170: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
4180: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
4190: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
41a0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
41b0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
41c0: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
41d0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
41e0: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
41f0: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
4200: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4210: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65  PgHdr *p = pPage
4220: 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68  r->aHash[pager_h
4230: 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68  ash(pgno)];.  wh
4240: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
4250: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
4260: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
4270: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
4280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
4290: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
42a0: 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  d clear the in-m
42b0: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
42c0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
42d0: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
42e0: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
42f0: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
4300: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
4310: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
4320: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
4330: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
4340: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
4350: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
4360: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
4370: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
4380: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
4390: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
43a0: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
43b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
43c0: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
43d0: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d  Next;.  for(pPg=
43e0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
43f0: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
4400: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
4410: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
4420: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
4430: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69   }.  pPager->pFi
4440: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
4450: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
4460: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
4470: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Last = 0;.  pPag
4480: 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20  er->pAll = 0;.  
4490: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
44a0: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
44b0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
44c0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
44d0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
44e0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
44f0: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
4500: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
4510: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
4520: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55    }.  sqlite3OsU
4530: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
4540: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70  d, NO_LOCK);.  p
4550: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
4560: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70  AGER_UNLOCK;.  p
4570: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
4580: 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52  -1;.  pPager->nR
4590: 65 66 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ef = 0;.  assert
45a0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
45b0: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  lOpen==0 );.}../
45c0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
45d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
45e0: 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  , the pager has 
45f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4600: 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52   open and.** a R
4610: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
4620: 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
4630: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
4640: 20 72 6f 75 74 69 6e 65 20 72 65 6c 65 61 73 65   routine release
4650: 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
4660: 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69  e lock and acqui
4670: 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  res a SHARED loc
4680: 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  k in its place. 
4690: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   The journal.** 
46a0: 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
46b0: 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a  and closed..**.*
46c0: 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72  * TODO: Consider
46d0: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75   keeping the jou
46e0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66  rnal file open f
46f0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
4700: 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20  abases..** This 
4710: 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
4720: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
4730: 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20  ment on windows 
4740: 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  where opening.**
4750: 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78   a file is an ex
4760: 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
4770: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4780: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
4790: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
47a0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
47b0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
47c0: 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 69  er->memDb );.  i
47d0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
47e0: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
47f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4800: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73  LITE_OK;.  }.  s
4810: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
4820: 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
4830: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
4840: 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  tmtOpen ){.    s
4850: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
4860: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
4870: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
4880: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  en = 0;.  }.  if
4890: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
48a0: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
48b0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
48c0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70  ger->jfd);.    p
48d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
48e0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  en = 0;.    sqli
48f0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
4900: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
4910: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
4920: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
4930: 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
4940: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
4950: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
4960: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
4970: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
4980: 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  l){.      pPg->i
4990: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
49a0: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
49b0: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
49c0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
49d0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
49e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
49f0: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
4a00: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
4a10: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  nal==0 );.  }.  
4a20: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
4a30: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  &pPager->fd, SHA
4a40: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61  RED_LOCK);.  pPa
4a50: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
4a60: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 72 65 74  ER_SHARED;.  ret
4a70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4a80: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
4a90: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
4aa0: 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61  cksum for the pa
4ab0: 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a  ge of data..**.*
4ac0: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
4ad0: 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20  real checksum.  
4ae0: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
4af0: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
4b00: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
4b10: 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ial value and th
4b20: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  e page number.  
4b30: 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20  We experimented 
4b40: 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73  with.** a checks
4b50: 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  um of the entire
4b60: 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20   data, but that 
4b70: 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  was found to be 
4b80: 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20  too slow..**.** 
4b90: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
4ba0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f  ge number is sto
4bb0: 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e  red at the begin
4bc0: 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64  ning of data and
4bd0: 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d  .** the checksum
4be0: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
4bf0: 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20  e end.  This is 
4c00: 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a  important.  If j
4c10: 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70  ournal.** corrup
4c20: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
4c30: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
4c40: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
4c50: 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20  ely scenario.** 
4c60: 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
4c70: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
4c80: 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
4c90: 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20  be changed.  It 
4ca0: 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20  is.** much less 
4cb0: 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
4cc0: 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
4cd0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4ce0: 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
4cf0: 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
4d00: 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
4d10: 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
4d20: 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
4d30: 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
4d40: 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
4d50: 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
4d60: 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
4d70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d  ion..**.** FIX M
4d80: 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64  E:  Consider add
4d90: 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20  ing every 200th 
4da0: 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20  (or so) byte of 
4db0: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a  the data to the.
4dc0: 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68  ** checksum.  Th
4dd0: 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67  at way if a sing
4de0: 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20  le page spans 3 
4df0: 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63  or more disk sec
4e00: 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79  tors and.** only
4e10: 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74   the middle sect
4e20: 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77  or is corrupt, w
4e30: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76  e will still hav
4e40: 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a  e a reasonable.*
4e50: 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c  * chance of fail
4e60: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
4e70: 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74   and thus detect
4e80: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e  ing the problem.
4e90: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
4ea0: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
4eb0: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
4ec0: 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  gno, const char 
4ed0: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
4ee0: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
4ef0: 6b 73 75 6d 49 6e 69 74 20 2b 20 70 67 6e 6f 3b  ksumInit + pgno;
4f00: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
4f10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
4f20: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
4f30: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
4f40: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
4f50: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
4f60: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
4f70: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
4f80: 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d  .** If useCksum=
4f90: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
4fa0: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
4fb0: 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e  t use checksums.
4fc0: 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61    Checksums.** a
4fd0: 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73  re not used in s
4fe0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
4ff0: 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d  s because statem
5000: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20  ent journals do 
5010: 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73  not.** need to s
5020: 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69  urvive power fai
5030: 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lures..*/.static
5040: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
5050: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67  ack_one_page(Pag
5060: 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69  er *pPager, OsFi
5070: 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65  le *jfd, int use
5080: 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63  Cksum){.  int rc
5090: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
50c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
50d0: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
50e0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
50f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
5100: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
5110: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
5120: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
5150: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
5160: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44  cking */.  u8 aD
5170: 61 74 61 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f  ata[SQLITE_PAGE_
5180: 53 49 5a 45 5d 3b 20 20 20 2f 2a 20 53 74 6f 72  SIZE];   /* Stor
5190: 65 20 64 61 74 61 20 68 65 72 65 20 2a 2f 0a 0a  e data here */..
51a0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
51b0: 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20  s(jfd, &pgno);. 
51c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
51d0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
51e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
51f0: 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61  Read(jfd, &aData
5200: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
5210: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
5220: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5230: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  n rc;..  /* Sani
5240: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
5250: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
5260: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
5270: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
5280: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
5290: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
52a0: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
52b0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
52c0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
52d0: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
52e0: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
52f0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5300: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
5310: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
5320: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
5330: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
5340: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
5350: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
5360: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
5370: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
5380: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
5390: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
53a0: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
53b0: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
53c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
53d0: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b  .  }.  if( useCk
53e0: 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sum ){.    rc = 
53f0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
5400: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
5410: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5420: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63  .    if( pager_c
5430: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e  ksum(pPager, pgn
5440: 6f 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  o, aData)!=cksum
5450: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
5460: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
5470: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
5480: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
5490: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
54a0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
54b0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
54c0: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
54d0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
54e0: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
54f0: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
5500: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
5510: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
5520: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
5530: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
5540: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
5550: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
5560: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
5570: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
5580: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
5590: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
55a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 49 58 20 4d  .  **.  ** FIX M
55b0: 45 3a 20 49 64 65 61 6c 6c 79 20 74 68 65 20 70  E: Ideally the p
55c0: 61 67 65 20 77 6f 75 6c 64 20 6f 6e 6c 79 20 62  age would only b
55d0: 65 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  e left marked di
55e0: 72 74 79 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  rty when the.  *
55f0: 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  * pager is in RE
5600: 53 45 52 56 45 44 20 73 74 61 74 65 20 69 66 20  SERVED state if 
5610: 69 74 20 77 61 73 20 64 69 72 74 79 20 77 68 65  it was dirty whe
5620: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
5630: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
5640: 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 0a  n was started. .
5650: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
5660: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
5670: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
5680: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
5690: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
56a0: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
56b0: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
56c0: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
56d0: 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 70   dirty..  */.  p
56e0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
56f0: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
5700: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5710: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
5720: 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67  EXCLUSIVE || pPg
5730: 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22 50 4c   );.  TRACE2("PL
5740: 41 59 42 41 43 4b 20 70 61 67 65 20 25 64 5c 6e  AYBACK page %d\n
5750: 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  ", pgno);.  if( 
5760: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
5770: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
5780: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  {.    sqlite3OsS
5790: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
57a0: 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74   (pgno-1)*(off_t
57b0: 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  )SQLITE_PAGE_SIZ
57c0: 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  E);.    rc = sql
57d0: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
57e0: 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20  ger->fd, aData, 
57f0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
5800: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
5810: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
5820: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
5830: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  e rolled back th
5840: 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
5850: 63 65 70 74 20 66 6f 72 20 70 61 67 65 0a 20 20  cept for page.  
5860: 20 20 2a 2a 20 31 20 77 68 69 63 68 20 69 73 20    ** 1 which is 
5870: 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
5880: 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
5890: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
58a0: 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 61 63 74  abase.    ** act
58b0: 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
58c0: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
58d0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
58e0: 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67  ef==0 || pPg->pg
58f0: 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 70 44 61  no==1 );.    pDa
5900: 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ta = PGHDR_TO_DA
5910: 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d  TA(pPg);.    mem
5920: 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61  cpy(pData, aData
5930: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
5940: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
5950: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
5960: 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45   ){  /*** FIX ME
5970: 3a 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62  :  Should this b
5980: 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a  e xReinit? ***/.
5990: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
59a0: 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c  estructor(pData,
59b0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
59c0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
59d0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
59e0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
59f0: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64   ){.      pPg->d
5a00: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
5a10: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
5a20: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 4f 44  0;.    }.    COD
5a30: 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
5a40: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
5a50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
5a70: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
5a80: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
5a90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5aa0: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
5ab0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
5ac0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
5ad0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5ae0: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
5af0: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
5b00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5b10: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
5b20: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
5b30: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
5b40: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
5b50: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
5b60: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
5b70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5b80: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
5b90: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
5ba0: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
5bb0: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
5bc0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
5bd0: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
5be0: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
5bf0: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
5c00: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
5c10: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
5c20: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
5c30: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
5c40: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
5c50: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
5c60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
5c70: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
5c80: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
5c90: 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74  _delmaster(const
5ca0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
5cb0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
5cc0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
5cd0: 3b 0a 20 20 4f 73 46 69 6c 65 20 6d 61 73 74 65  ;.  OsFile maste
5ce0: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  r;.  char *zMast
5cf0: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
5d00: 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
5d10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5d20: 65 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 6e 4d 61  e */.  off_t nMa
5d30: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
5d40: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
5d50: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5d60: 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  */..  /* Open th
5d70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5d80: 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c   file exclusivel
5d90: 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f  y in case some o
5da0: 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a  ther process.  *
5db0: 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69  * is running thi
5dc0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20  s routine also. 
5dd0: 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65  Not that it make
5de0: 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65  s too much diffe
5df0: 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65  rence..  */.  me
5e00: 6d 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30 2c  mset(&master, 0,
5e10: 20 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29 29   sizeof(master))
5e20: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
5e30: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
5e40: 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72  zMaster, &master
5e50: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
5e60: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
5e70: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
5e80: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
5e90: 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
5ea0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61 73  3OsFileSize(&mas
5eb0: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
5ec0: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
5ed0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
5ee0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
5ef0: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
5f00: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
5f10: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
5f20: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
5f30: 72 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 6e 4d  rPtr;.    int nM
5f40: 61 73 74 65 72 50 74 72 3b 20 20 20 2f 2a 20 4e  asterPtr;   /* N
5f50: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
5f60: 6c 6c 6f 63 61 74 65 64 20 61 74 20 7a 4d 61 73  llocated at zMas
5f70: 74 65 72 50 74 72 20 2a 2f 0a 0a 20 20 20 20 2f  terPtr */..    /
5f80: 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
5f90: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5fa0: 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
5fb0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
5fc0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c     ** sqliteMall
5fd0: 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
5fe0: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
5ff0: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 0a 20  urnal. .    **. 
6000: 20 20 20 2a 2a 20 41 6c 73 6f 20 61 6c 6c 6f 63     ** Also alloc
6010: 61 74 65 20 61 6e 20 65 78 74 72 61 20 28 73 74  ate an extra (st
6020: 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 2b 31 29  rlen(zMaster)+1)
6030: 20 62 79 74 65 73 2e 20 54 68 69 73 20 73 70 61   bytes. This spa
6040: 63 65 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a  ce is used.    *
6050: 2a 20 74 6f 20 6c 6f 61 64 20 61 20 6d 61 73 74  * to load a mast
6060: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
6070: 61 6d 65 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74  ame from some ot
6080: 68 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  her journal file
6090: 20 74 6f 0a 20 20 20 20 2a 2a 20 63 68 65 63 6b   to.    ** check
60a0: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
60b0: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
60c0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
60d0: 2f 0a 20 20 20 20 6e 4d 61 73 74 65 72 50 74 72  /.    nMasterPtr
60e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
60f0: 72 29 20 2b 20 31 3b 0a 20 20 20 20 7a 4d 61 73  r) + 1;.    zMas
6100: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
6110: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
6120: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
6130: 29 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 3b 0a  ) + nMasterPtr;.
6140: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
6150: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
6160: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6170: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  EM;.      goto d
6180: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
6190: 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50    }.    zMasterP
61a0: 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
61b0: 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
61c0: 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73  nal];.    rc = s
61d0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 6d 61  qlite3OsRead(&ma
61e0: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
61f0: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
6200: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  rnal);.    if( r
6210: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
6220: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
6230: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
6240: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
6250: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
6260: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
6270: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
6280: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
6290: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
62a0: 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c  eExists(zJournal
62b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
62c0: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
62d0: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
62e0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
62f0: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
6300: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
6310: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
6320: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
6330: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
6340: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
6350: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
6360: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
6370: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
6380: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6390: 20 20 20 20 4f 73 46 69 6c 65 20 6a 6f 75 72 6e      OsFile journ
63a0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  al;.        int 
63b0: 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20 20 20  nMaster;.       
63c0: 20 6f 66 66 5f 74 20 6a 73 7a 3b 0a 0a 20 20 20   off_t jsz;..   
63d0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f 75       memset(&jou
63e0: 72 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  rnal, 0, sizeof(
63f0: 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20 20  journal));.     
6400: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6410: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a  sOpenReadOnly(zJ
6420: 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c  ournal, &journal
6430: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
6440: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6450: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6460: 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61  3OsClose(&journa
6470: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  l);.          go
6480: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
6490: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09 2f 2a  ;.        }.../*
64a0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69   Check if the fi
64b0: 6c 65 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  le is big enough
64c0: 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
64d0: 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a   file.        **
64e0: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 69 72   with the requir
64f0: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
6500: 6c 20 6e 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20  l name. If not, 
6510: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 20 20 20  ignore it..     
6520: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
6530: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
6540: 53 69 7a 65 28 26 6a 6f 75 72 6e 61 6c 2c 20 26  Size(&journal, &
6550: 6a 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jsz);.        if
6560: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6570: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6580: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75  ite3OsClose(&jou
6590: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  rnal);.         
65a0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
65b0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
65c0: 20 20 20 20 20 20 20 69 66 28 20 6a 73 7a 3c 28         if( jsz<(
65d0: 32 35 2b 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65  25+strlen(zMaste
65e0: 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r)) ){.         
65f0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
6600: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
6610: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6630: 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65   .        /* See
6640: 6b 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 69  k to the point i
6650: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  n the journal wh
6660: 65 72 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ere the master j
6670: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 20 20  ournal name.    
6680: 20 20 20 20 2a 2a 20 69 73 20 73 74 6f 72 65 64      ** is stored
6690: 2e 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  . Read the maste
66a0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
66b0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
66c0: 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ned.        ** f
66d0: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 20 20 20 20  rom malloc..    
66e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
66f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
6700: 6b 28 26 6a 6f 75 72 6e 61 6c 2c 20 32 30 29 3b  k(&journal, 20);
6710: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
6720: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
6730: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
6740: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
6750: 61 64 33 32 62 69 74 73 28 26 6a 6f 75 72 6e 61  ad32bits(&journa
6760: 6c 2c 20 28 75 33 32 2a 29 26 6e 4d 61 73 74 65  l, (u32*)&nMaste
6770: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
6780: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6790: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
67a0: 75 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ut;.        if( 
67b0: 6e 4d 61 73 74 65 72 3e 3d 6e 4d 61 73 74 65 72  nMaster>=nMaster
67c0: 50 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Ptr ){.         
67d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
67e0: 65 61 64 28 26 6a 6f 75 72 6e 61 6c 2c 20 7a 4d  ead(&journal, zM
67f0: 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
6800: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rPtr);.         
6810: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6820: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
6830: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
6840: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
6850: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
6860: 7a 4d 61 73 74 65 72 50 74 72 5b 6e 4d 61 73 74  zMasterPtr[nMast
6870: 65 72 50 74 72 2d 31 5d 3d 3d 27 5c 30 27 20 26  erPtr-1]=='\0' &
6880: 26 20 21 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  & !strcmp(zMaste
6890: 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 20 29  rPtr, zMaster) )
68a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
68b0: 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
68c0: 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
68d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
68e0: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
68f0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
6900: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
6910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6920: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6930: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
6940: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
6950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
6960: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
6970: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
6980: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
6990: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
69a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
69b0: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
69c0: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
69d0: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
69e0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
69f0: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
6a00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6a10: 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20  *.** Make every 
6a20: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
6a30: 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61  e agree with wha
6a40: 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49  t is on disk.  I
6a50: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a  n other words,.*
6a60: 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73  * reread the dis
6a70: 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  k to reset the s
6a80: 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68  tate of the cach
6a90: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
6aa0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
6ab0: 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  after a rollback
6ac0: 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f   in which some o
6ad0: 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68  f the dirty cach
6ae0: 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e  e.** pages had n
6af0: 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
6b00: 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20  n out to disk.  
6b10: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20  We need to roll 
6b20: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68  back the.** cach
6b30: 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  e content and th
6b40: 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
6b50: 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72   do that is to r
6b60: 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f  eread the old co
6b70: 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72  ntent.** back fr
6b80: 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a  om the disk..*/.
6b90: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
6ba0: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61  _reload_cache(Pa
6bb0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
6bc0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
6bd0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6be0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
6bf0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
6c00: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
6c10: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
6c20: 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  [SQLITE_PAGE_SIZ
6c30: 45 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67  E];.    if( !pPg
6c40: 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e  ->dirty ) contin
6c50: 75 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74  ue;.    if( (int
6c60: 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
6c70: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
6c80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6c90: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
6ca0: 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  >fd, SQLITE_PAGE
6cb0: 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 28 70 50  _SIZE*(off_t)(pP
6cc0: 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20  g->pgno-1));.   
6cd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6ce0: 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66  sRead(&pPager->f
6cf0: 64 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f  d, zBuf, SQLITE_
6d00: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
6d10: 20 20 54 52 41 43 45 32 28 22 52 45 46 45 54 43    TRACE2("REFETC
6d20: 48 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  H page %d\n", pP
6d30: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
6d40: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42  CODEC(pPager, zB
6d50: 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32  uf, pPg->pgno, 2
6d60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
6d70: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c  ) break;.    }el
6d80: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
6d90: 28 7a 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  (zBuf, 0, SQLITE
6da0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
6db0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
6dc0: 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  nRef==0 || memcm
6dd0: 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f  p(zBuf, PGHDR_TO
6de0: 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49  _DATA(pPg), SQLI
6df0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 7b  TE_PAGE_SIZE) ){
6e00: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47  .      memcpy(PG
6e10: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
6e20: 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50  , zBuf, SQLITE_P
6e30: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
6e40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
6e50: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
6e60: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
6e70: 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
6e80: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
6e90: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
6ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6eb0: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
6ec0: 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
6ed0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
6ee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6ef0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
6f00: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  = 0;.    pPg->di
6f10: 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  rty = 0;.  }.  r
6f20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
6f30: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
6f40: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
6f50: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
6f60: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
6f70: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
6f80: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
6f90: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
6fa0: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
6fb0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6fc0: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
6fd0: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
6fe0: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
6ff0: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
7000: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
7010: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
7020: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
7030: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
7040: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
7050: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
7060: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
7070: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
7080: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
7090: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
70a0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
70b0: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
70c0: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
70d0: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
70e0: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
70f0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
7100: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
7110: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
7120: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
7130: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
7140: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
7150: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
7160: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
7170: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
7180: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
7190: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
71a0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
71b0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
71c0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
71d0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
71e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
71f0: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
7200: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
7210: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
7220: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
7230: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
7240: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
7250: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
7260: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
7270: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
7280: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
7290: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
72a0: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
72b0: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
72c0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
72d0: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
72e0: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
72f0: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
7300: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
7310: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
7320: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
7330: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
7340: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
7350: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
7360: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
7370: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
7380: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
7390: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
73a0: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
73b0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
73c0: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
73d0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
73e0: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
73f0: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
7400: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
7410: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
7420: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
7430: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
7440: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
7450: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
7460: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
7470: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
7480: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
7490: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
74a0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
74b0: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
74c0: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
74d0: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
74e0: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
74f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
7500: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
7510: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
7520: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
7530: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
7540: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
7550: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
7560: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
7570: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
7580: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
7590: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
75a0: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
75b0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
75c0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
75d0: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
75e0: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
75f0: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
7600: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
7610: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
7620: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
7630: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
7640: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
7650: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
7660: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
7670: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
7680: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
7690: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
76a0: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
76b0: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
76c0: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
76d0: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
76e0: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
76f0: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
7700: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
7710: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
7720: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
7730: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
7740: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
7750: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
7760: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
7770: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
7780: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
7790: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
77a0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
77b0: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
77c0: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
77d0: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
77e0: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
77f0: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
7800: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
7810: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
7820: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
7830: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
7840: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
7850: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
7860: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
7870: 69 6c 65 20 74 68 65 6e 20 74 68 65 20 64 61 74  ile then the dat
7880: 61 62 61 73 65 20 77 69 6c 6c 20 6c 69 6b 65 6c  abase will likel
7890: 79 20 61 6c 72 65 61 64 79 20 62 65 0a 2a 2a 20  y already be.** 
78a0: 63 6f 72 72 75 70 74 65 64 2c 20 73 6f 20 74 68  corrupted, so th
78b0: 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  e PAGER_ERR_CORR
78c0: 55 50 54 20 62 69 74 20 69 73 20 73 65 74 20 69  UPT bit is set i
78d0: 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  n pPager->errMas
78e0: 6b 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  k.** and SQLITE_
78f0: 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
7900: 6e 65 64 2e 20 20 49 66 20 69 74 20 61 6c 6c 20  ned.  If it all 
7910: 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74 68 69 73  works, then this
7920: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
7930: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
7940: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
7950: 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
7960: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 75  r *pPager, int u
7970: 73 65 4a 6f 75 72 6e 61 6c 53 69 7a 65 29 7b 0a  seJournalSize){.
7980: 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20    off_t szJ;    
7990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
79a0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
79b0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
79c0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
79e0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
79f0: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
7a00: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
7a30: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
7a40: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
7a50: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
7a60: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
7a70: 67 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ges */.  unsigne
7a80: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
7a90: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
7aa0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
7ab0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
7ac0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
7ad0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
7ae0: 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
7af0: 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ine */.  int nMa
7b00: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
7b10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7b20: 79 74 65 73 20 69 6e 20 74 68 65 20 6e 61 6d 65  ytes in the name
7b30: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
7b40: 61 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  al */.  char *zM
7b50: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
7b60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
7b70: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
7b80: 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20  if any */..  /* 
7b90: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
7ba0: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
7bb0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
7bc0: 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
7bd0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
7be0: 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
7bf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
7c00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
7c10: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  .  sqlite3OsSeek
7c20: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  (&pPager->jfd, 0
7c30: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7c40: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
7c50: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
7c60: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7c70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
7c80: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
7c90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
7ca0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
7cb0: 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 63 6f 6e  too small to con
7cc0: 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65 20  tain a complete 
7cd0: 68 65 61 64 65 72 2c 0a 20 20 2a 2a 20 69 74 20  header,.  ** it 
7ce0: 6d 75 73 74 20 6d 65 61 6e 20 74 68 61 74 20 74  must mean that t
7cf0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
7d00: 63 72 65 61 74 65 64 20 74 68 65 20 6a 6f 75 72  created the jour
7d10: 6e 61 6c 20 77 61 73 20 6a 75 73 74 0a 20 20 2a  nal was just.  *
7d20: 2a 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 20 77  * beginning to w
7d30: 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
7d40: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 64 69   file when it di
7d50: 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  ed.  In that cas
7d60: 65 2c 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  e,.  ** the data
7d70: 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
7d80: 20 68 61 76 65 20 73 74 69 6c 6c 20 62 65 65 6e   have still been
7d90: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 63 68   completely unch
7da0: 61 6e 67 65 64 2e 0a 20 20 2a 2a 20 4e 6f 74 68  anged..  ** Noth
7db0: 69 6e 67 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ing needs to be 
7dc0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 57 65  rolled back.  We
7dd0: 20 63 61 6e 20 73 61 66 65 6c 79 20 69 67 6e 6f   can safely igno
7de0: 72 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  re this journal.
7df0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 4a 20  .  */.  if( szJ 
7e00: 3c 20 32 34 20 29 7b 0a 20 20 20 20 67 6f 74 6f  < 24 ){.    goto
7e10: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
7e20: 20 7d 0a 0a 20 20 2f 2a 20 28 31 29 20 52 65 61   }..  /* (1) Rea
7e30: 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  d the beginning 
7e40: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
7e50: 6e 64 20 76 65 72 69 66 79 20 74 68 65 20 6d 61  nd verify the ma
7e60: 67 69 63 20 73 74 72 69 6e 67 0a 20 20 2a 2a 20  gic string.  ** 
7e70: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
7e80: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
7e90: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
7ea0: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
7eb0: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
7ec0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a  izeof(aMagic));.
7ed0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7ee0: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
7ef0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
7f00: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
7f10: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ic))!=0 ){.    r
7f20: 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  c = SQLITE_PROTO
7f30: 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  COL;.    goto en
7f40: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
7f50: 0a 20 20 2f 2a 20 28 32 29 20 52 65 61 64 20 74  .  /* (2) Read t
7f60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
7f70: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
7f80: 20 6a 6f 75 72 6e 61 6c 2e 20 20 2a 2f 0a 20 20   journal.  */.  
7f90: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7fa0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75  &pPager->jfd, (u
7fb0: 33 32 2a 29 26 6e 52 65 63 29 3b 0a 20 20 69 66  32*)&nRec);.  if
7fc0: 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
7fd0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 69 66 28 20  playback;.  if( 
7fe0: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
7ff0: 20 7c 7c 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69   || useJournalSi
8000: 7a 65 20 29 7b 0a 20 20 20 20 6e 52 65 63 20 3d  ze ){.    nRec =
8010: 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f   (szJ - JOURNAL_
8020: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
8030: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
8040: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
8050: 20 28 33 29 20 52 65 61 64 20 74 68 65 20 69 6e   (3) Read the in
8060: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
8070: 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  the sanity check
8080: 73 75 6d 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  sum */.  rc = re
8090: 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72  ad32bits(&pPager
80a0: 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
80b0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66  cksumInit);.  if
80c0: 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
80d0: 70 6c 61 79 62 61 63 6b 3b 0a 0a 20 20 2f 2a 20  playback;..  /* 
80e0: 28 34 29 20 52 65 61 64 20 74 68 65 20 6e 75 6d  (4) Read the num
80f0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
8100: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8110: 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 0a 20  e prior to the. 
8120: 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65   ** start of the
8130: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
8140: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
8150: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
8160: 26 6d 78 50 67 29 3b 0a 20 20 69 66 28 20 72 63  &mxPg);.  if( rc
8170: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8180: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
8190: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
81a0: 28 35 29 20 61 6e 64 20 28 36 29 3a 20 43 68 65  (5) and (6): Che
81b0: 63 6b 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a  ck if a master j
81c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
81d0: 70 65 63 69 66 69 65 64 2e 20 49 66 20 6f 6e 65  pecified. If one
81e0: 20 69 73 0a 20 20 2a 2a 20 73 70 65 63 69 66 69   is.  ** specifi
81f0: 65 64 2c 20 6f 6e 6c 79 20 70 72 6f 63 65 65 64  ed, only proceed
8200: 20 77 69 74 68 20 74 68 65 20 70 6c 61 79 62 61   with the playba
8210: 63 6b 20 69 66 20 69 74 20 73 74 69 6c 6c 20 65  ck if it still e
8220: 78 69 73 74 73 2e 20 2a 2f 0a 20 20 72 63 20 3d  xists. */.  rc =
8230: 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61   read32bits(&pPa
8240: 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 4d 61 73 74  ger->jfd, &nMast
8250: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  er);.  if( rc ) 
8260: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
8270: 6b 3b 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72  k;.  if( nMaster
8280: 3e 30 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  >0 ){.    zMaste
8290: 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r = sqliteMalloc
82a0: 28 6e 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69  (nMaster);.    i
82b0: 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20  f( !zMaster ){. 
82c0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
82d0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
82e0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
82f0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
8300: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
8310: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
8320: 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 3b 0a 20  ter, nMaster);. 
8330: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8340: 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72  E_OK || (zMaster
8350: 5b 30 5d 20 26 26 20 21 73 71 6c 69 74 65 33 4f  [0] && !sqlite3O
8360: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
8370: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 67  ter)) ){.      g
8380: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
8390: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
83a0: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
83b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
83c0: 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e  k to it's origin
83d0: 61 6c 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73  al size */.  ass
83e0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
83f0: 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50  gDbSize==0 || pP
8400: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
8410: 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 72 63 20 3d  ==mxPg );.  rc =
8420: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
8430: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
8440: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
8450: 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a 20  *(off_t)mxPg);. 
8460: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8470: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
8480: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
8490: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
84a0: 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20 2f  e = mxPg;.  .  /
84b0: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
84c0: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
84d0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
84e0: 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
84f0: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
8500: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63   for(i=0; i<nRec
8510: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
8520: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
8530: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
8540: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31   &pPager->jfd, 1
8550: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8560: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8570: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8580: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
8590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
85a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
85b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
85c0: 0a 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74  .  /* Pages that
85d0: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
85e0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
85f0: 6c 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63  l but never sync
8600: 65 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f  ed.  ** where no
8610: 74 20 72 65 73 74 6f 72 65 64 20 62 79 20 74 68  t restored by th
8620: 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57  e loop above.  W
8630: 65 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72  e have to restor
8640: 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67  e those.  ** pag
8650: 65 73 20 62 79 20 72 65 61 64 69 6e 67 20 74 68  es by reading th
8660: 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  em back from the
8670: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
8680: 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  se..  */.  if( r
8690: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
86a0: 20 20 20 20 70 61 67 65 72 5f 72 65 6c 6f 61 64      pager_reload
86b0: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
86c0: 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63    }..end_playbac
86d0: 6b 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  k:.  if( zMaster
86e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
86f0: 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
8700: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
8710: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
8720: 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20  eturn true,.    
8730: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
8740: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
8750: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
8760: 75 72 6e 61 6c 2e 20 49 66 20 65 72 72 6f 72 73  urnal. If errors
8770: 20 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 64   .    ** occur d
8780: 75 72 69 6e 67 20 74 68 69 73 20 70 72 6f 63 65  uring this proce
8790: 73 73 2c 20 69 67 6e 6f 72 65 20 74 68 65 6d 2e  ss, ignore them.
87a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
87b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
87c0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 64 65 6c  .      pager_del
87d0: 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b  master(zMaster);
87e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
87f0: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
8800: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
8810: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
8820: 2a 20 46 49 58 20 4d 45 3a 20 57 65 20 73 68 6f  * FIX ME: We sho
8830: 75 6c 64 6e 27 74 20 64 65 6c 65 74 65 20 74 68  uldn't delete th
8840: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 61 6e 20  e journal if an 
8850: 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 64 75  error occured du
8860: 72 69 6e 67 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  ring.    ** roll
8870: 62 61 63 6b 2e 20 49 74 20 6d 61 79 20 68 61 76  back. It may hav
8880: 65 20 62 65 65 6e 20 61 20 74 72 61 6e 73 69 65  e been a transie
8890: 6e 74 20 65 72 72 6f 72 20 61 6e 64 20 74 68 65  nt error and the
88a0: 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 0a 20 20   rollback may.  
88b0: 20 20 2a 2a 20 73 75 63 63 65 65 64 20 6e 65 78    ** succeed nex
88c0: 74 20 74 69 6d 65 20 69 74 20 69 73 20 61 74 74  t time it is att
88d0: 65 6d 70 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  empted..    */. 
88e0: 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65     pager_unwrite
88f0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
8900: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
8910: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
8920: 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ORRUPT;.    rc =
8930: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
8940: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
8950: 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
8960: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
8970: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8980: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
8990: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
89a0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
89b0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
89c0: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
89d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
89e0: 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
89f0: 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
8a00: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
8a10: 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
8a20: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
8a30: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
8a40: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
8a50: 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
8a60: 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
8a70: 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
8a80: 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
8a90: 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
8aa0: 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
8ab0: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
8ac0: 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
8ad0: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
8ae0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
8af0: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
8b00: 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
8b10: 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
8b20: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
8b30: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
8b40: 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
8b50: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
8b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8b70: 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
8b80: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
8b90: 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20  ){.  off_t szJ; 
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8bb0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
8bc0: 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
8bd0: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
8be0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8bf0: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
8c00: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
8c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8c20: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
8c30: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 72  int rc;..  /* Tr
8c40: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
8c50: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
8c60: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
8c70: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
8c80: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50  e3OsTruncate(&pP
8c90: 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
8ca0: 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f  _PAGE_SIZE*(off_
8cb0: 74 29 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  t)pPager->stmtSi
8cc0: 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  ze);.  pPager->d
8cd0: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
8ce0: 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  stmtSize;..  /* 
8cf0: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
8d00: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
8d10: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
8d20: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
8d30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8d40: 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50  >stmtInUse && pP
8d50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
8d60: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  n );.  sqlite3Os
8d70: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74  Seek(&pPager->st
8d80: 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d  fd, 0);.  nRec =
8d90: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
8da0: 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
8db0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
8dc0: 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
8dd0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
8de0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
8df0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
8e00: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
8e10: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8e20: 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
8e30: 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
8e40: 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
8e50: 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
8e60: 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
8e70: 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
8e80: 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
8e90: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
8ea0: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nRec-1; i>=0; i-
8eb0: 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  -){.    rc = pag
8ec0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
8ed0: 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
8ee0: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
8ef0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
8f00: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
8f10: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8f20: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
8f30: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
8f40: 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
8f50: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 70 61 67  out how many pag
8f60: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  es need to be co
8f70: 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
8f80: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
8f90: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
8fa0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
8fb0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
8fc0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  , pPager->stmtJS
8fd0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
8fe0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8ff0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
9000: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  layback;.  }.  r
9010: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
9020: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a  eSize(&pPager->j
9030: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
9040: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9050: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  {.    goto end_s
9060: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
9070: 7d 0a 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20  }.  nRec = (szJ 
9080: 2d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  - pPager->stmtJS
9090: 69 7a 65 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  ize)/JOURNAL_PG_
90a0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 66 6f  SZ(pPager);.  fo
90b0: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
90c0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
90d0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
90e0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
90f0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31   &pPager->jfd, 1
9100: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
9110: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9120: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
9130: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
9140: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
9150: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
9160: 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f 73 74 6d 74  .  }.  .end_stmt
9170: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
9180: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9190: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
91a0: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
91b0: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  RR_CORRUPT;.    
91c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
91d0: 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  UPT;.  }.  retur
91e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
91f0: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
9200: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
9210: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
9220: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
9230: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
9240: 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62  number is the ab
9250: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
9260: 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d  the mxPage param
9270: 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61  eter..** If mxPa
9280: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
9290: 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20  the noSync flag 
92a0: 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f  is also set.  no
92b0: 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a  Sync bypasses.**
92c0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
92d0: 33 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20  3OsSync().  The 
92e0: 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20  pager runs much 
92f0: 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79  faster with noSy
9300: 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66  nc on,.** but if
9310: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
9320: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
9330: 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72   there is an abr
9340: 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61  upt power .** fa
9350: 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62  ilure, the datab
9360: 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ase file might b
9370: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
9380: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a  onsistent and.**
9390: 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74   unrepairable st
93a0: 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ate.  .*/.void s
93b0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
93c0: 63 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  cachesize(Pager 
93d0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
93e0: 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
93f0: 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ge>=0 ){.    pPa
9400: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
9410: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
9420: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9430: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
9440: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 0a  >needSync = 0; .
9450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
9460: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
9470: 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d  .    mxPage = -m
9480: 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28  xPage;.  }.  if(
9490: 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
94a0: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
94b0: 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d   = mxPage;.  }.}
94c0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
94d0: 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
94e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
94f0: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
9500: 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
9510: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
9520: 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
9530: 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
9540: 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
9550: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
9560: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
9570: 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
9580: 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
9590: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
95a0: 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
95b0: 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
95c0: 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
95d0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
95e0: 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
95f0: 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
9600: 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
9610: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
9620: 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
9630: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
9640: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
9650: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
9660: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
9670: 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
9680: 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
9690: 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
96a0: 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
96b0: 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
96c0: 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
96d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
96e0: 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
96f0: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
9700: 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
9710: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
9720: 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
9730: 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
9740: 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
9750: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
9760: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
9770: 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
9780: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
9790: 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
97a0: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
97b0: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
97c0: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
97e0: 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
97f0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
9800: 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
9810: 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
9820: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
9830: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9840: 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
9850: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
9860: 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
9870: 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
9880: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
9890: 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
98a0: 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
98b0: 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
98c0: 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
98d0: 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
98f0: 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
9900: 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
9910: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
9920: 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
9930: 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
9940: 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
9950: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
9960: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
9970: 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
9980: 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
9990: 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
99a0: 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
99b0: 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
99c0: 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LL=3..*/.void sq
99d0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 73  lite3pager_set_s
99e0: 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61 67 65  afety_level(Page
99f0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
9a00: 65 76 65 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d  evel){.  pPager-
9a10: 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
9a20: 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
9a30: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
9a40: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
9a50: 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
9a60: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69  r->tempFile;.  i
9a70: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
9a80: 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
9a90: 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Sync = 0;.}../*.
9aa0: 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
9ab0: 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ary file.  Write
9ac0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
9ad0: 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65   file into zName
9ae0: 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20  .** (zName must 
9af0: 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49  be at least SQLI
9b00: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
9b10: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57   bytes long.)  W
9b20: 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65  rite.** the file
9b30: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
9b40: 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
9b50: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
9b60: 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
9b70: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
9b80: 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a  f we fail..**.**
9b90: 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
9ba0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
9bb0: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
9bc0: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a  file when it is.
9bd0: 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ** closed..*/.st
9be0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
9bf0: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63  pager_opentemp(c
9c00: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69  har *zFile, OsFi
9c10: 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63  le *fd){.  int c
9c20: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
9c30: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d  ;.  do{.    cnt-
9c40: 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  -;.    sqlite3Os
9c50: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69  TempFileName(zFi
9c60: 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  le);.    rc = sq
9c70: 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
9c80: 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20  sive(zFile, fd, 
9c90: 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e  1);.  }while( cn
9ca0: 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54  t>0 && rc!=SQLIT
9cb0: 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
9cc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
9cd0: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
9ce0: 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20  cache and put a 
9cf0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
9d00: 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70  age cache in *pp
9d10: 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69  Pager..** The fi
9d20: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  le to be cached 
9d30: 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20  need not exist. 
9d40: 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
9d50: 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a   locked until.**
9d60: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
9d70: 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
9d80: 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c  get() and is onl
9d90: 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69  y held open unti
9da0: 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  l the.** last pa
9db0: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75  ge is released u
9dc0: 73 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65  sing sqlite3page
9dd0: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a  r_unref()..**.**
9de0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
9df0: 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
9e00: 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
9e10: 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
9e20: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
9e30: 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
9e40: 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65   be cached.  The
9e50: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
9e60: 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
9e70: 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69  ically when it i
9e80: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
9e90: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
9ea0: 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70  en(.  Pager **pp
9eb0: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
9ec0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
9ed0: 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
9ee0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
9ef0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
9f00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
9f10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
9f20: 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  open */.  int mx
9f30: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
9f40: 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72     /* Max number
9f50: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61   of in-memory ca
9f60: 63 68 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  che pages */.  i
9f70: 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
9f80: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
9f90: 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
9fa0: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
9fb0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  page */.  int us
9fc0: 65 4a 6f 75 72 6e 61 6c 2c 20 20 20 20 20 20 20  eJournal,       
9fd0: 20 20 20 2f 2a 20 54 52 55 45 20 74 6f 20 75 73     /* TRUE to us
9fe0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
9ff0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
a000: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 20 2a 70 42  e */.  void  *pB
a010: 75 73 79 48 61 6e 64 6c 65 72 20 20 20 20 20 20  usyHandler      
a020: 2f 2a 20 42 75 73 79 20 63 61 6c 6c 62 61 63 6b  /* Busy callback
a030: 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a   */.){.  Pager *
a040: 70 50 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a  pPager;.  char *
a050: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
a060: 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e  0;.  int nameLen
a070: 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20  ;.  OsFile fd;. 
a080: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a090: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
a0a0: 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
a0b0: 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  ;.  int memDb = 
a0c0: 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  0;.  int readOnl
a0d0: 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 54  y = 0;.  char zT
a0e0: 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  emp[SQLITE_TEMPN
a0f0: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70  AME_SIZE];..  *p
a100: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d 65  pPager = 0;.  me
a110: 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a  mset(&fd, 0, siz
a120: 65 6f 66 28 66 64 29 29 3b 0a 20 20 69 66 28 20  eof(fd));.  if( 
a130: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
a140: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
a150: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a160: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
a170: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
a180: 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28  me[0] ){.    if(
a190: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
a1a0: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
a1b0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
a1c0: 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c  = 1;.      zFull
a1d0: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
a1e0: 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20  eStrDup("");.   
a1f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
a200: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
a210: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
a220: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
a230: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
a240: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
a250: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
a260: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
a270: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
a280: 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rite(zFullPathna
a290: 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e  me, &fd, &readOn
a2a0: 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ly);.      }.   
a2b0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
a2c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
a2d0: 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70  r_opentemp(zTemp
a2e0: 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c  , &fd);.    zFil
a2f0: 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20  ename = zTemp;. 
a300: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
a310: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
a320: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
a330: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  me);.    if( rc=
a340: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a350: 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
a360: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
a370: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
a380: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a390: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
a3a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
a3b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
a3c0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
a3d0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
a3e0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
a3f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
a400: 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73   }.  nameLen = s
a410: 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e  trlen(zFullPathn
a420: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  ame);.  pPager =
a430: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
a440: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
a450: 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20   nameLen*3 + 30 
a460: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  );.  if( pPager=
a470: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
a480: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
a490: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
a4a0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
a4b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4c0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 45 54  NOMEM;.  }.  SET
a4d0: 5f 50 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a  _PAGER(pPager);.
a4e0: 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
a4f0: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
a500: 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
a510: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20  r->zDirectory = 
a520: 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  &pPager->zFilena
a530: 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  me[nameLen+1];. 
a540: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
a550: 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69  l = &pPager->zDi
a560: 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b  rectory[nameLen+
a570: 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  1];.  strcpy(pPa
a580: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
a590: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
a5a0: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
a5b0: 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75  >zDirectory, zFu
a5c0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 66  llPathname);.  f
a5d0: 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e  or(i=nameLen; i>
a5e0: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
a5f0: 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
a600: 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
a610: 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
a620: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
a630: 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  0;.  strcpy(pPag
a640: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46  er->zJournal, zF
a650: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
a660: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
a670: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
a680: 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
a690: 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20  urnal[nameLen], 
a6a0: 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70  "-journal");.  p
a6b0: 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a  Pager->fd = fd;.
a6c0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
a6d0: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61  lOpen = 0;.  pPa
a6e0: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
a6f0: 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  = useJournal && 
a700: 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  !memDb;.  pPager
a710: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
a720: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
a730: 55 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Use = 0;.  pPage
a740: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70  r->nRef = 0;.  p
a750: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
a760: 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65  memDb-1;.  pPage
a770: 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51  r->pageSize = SQ
a780: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  LITE_PAGE_SIZE;.
a790: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
a7a0: 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ze = 0;.  pPager
a7b0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
a7c0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
a7d0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a7e0: 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e  mxPage = mxPage>
a7f0: 35 20 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b  5 ? mxPage : 10;
a800: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
a810: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
a820: 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  .  pPager->errMa
a830: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  sk = 0;.  pPager
a840: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
a850: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
a860: 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
a870: 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
a880: 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
a890: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
a8a0: 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
a8b0: 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
a8c0: 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75  ->tempFile || !u
a8d0: 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
a8e0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
a8f0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
a900: 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70  tSynced = 0;.  p
a910: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
a920: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ;.  pPager->nExt
a930: 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70  ra = nExtra;.  p
a940: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
a950: 6c 65 72 20 3d 20 28 42 75 73 79 48 61 6e 64 6c  ler = (BusyHandl
a960: 65 72 20 2a 29 70 42 75 73 79 48 61 6e 64 6c 65  er *)pBusyHandle
a970: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  r;.  memset(pPag
a980: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
a990: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
a9a0: 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72  sh));.  *ppPager
a9b0: 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
a9c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a9d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
a9e0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
a9f0: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
aa00: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
aa10: 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
aa20: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
aa30: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
aa40: 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
aa50: 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
aa60: 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
aa70: 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
aa80: 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
aa90: 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
aaa0: 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
aab0: 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
aac0: 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
aad0: 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
aae0: 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
aaf0: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e  e3pager_close().
ab00: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
ab10: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
ab20: 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67 65  d by sqlite3page
ab30: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  r_unref()..*/.vo
ab40: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
ab50: 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50  set_destructor(P
ab60: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
ab70: 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64  id (*xDesc)(void
ab80: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
ab90: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
aba0: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
abb0: 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
abc0: 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
abd0: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
abe0: 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
abf0: 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
ac00: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
ac10: 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
ac20: 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
ac30: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
ac40: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
ac50: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
ac60: 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
ac70: 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
ac80: 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
ac90: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
aca0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
acb0: 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
acc0: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
acd0: 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
ace0: 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
acf0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72  lite3pager_set_r
ad00: 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
ad10: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
ad20: 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74  einit)(void*,int
ad30: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
ad40: 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
ad50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
ad60: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
ad70: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
ad80: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
ad90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
ada0: 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20   pPager..*/.int 
adb0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
adc0: 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
add0: 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e  ager){.  off_t n
ade0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
adf0: 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
ae00: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
ae10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
ae20: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
ae30: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
ae40: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
ae50: 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c  er->fd, &n)!=SQL
ae60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
ae70: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
ae80: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b   PAGER_ERR_DISK;
ae90: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
aea0: 20 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45   }.  n /= SQLITE
aeb0: 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66  _PAGE_SIZE;.  if
aec0: 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
aed0: 20 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   && n==PENDING_B
aee0: 59 54 45 2f 53 51 4c 49 54 45 5f 50 41 47 45 5f  YTE/SQLITE_PAGE_
aef0: 53 49 5a 45 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  SIZE ){.    n++;
af00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
af10: 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
af20: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50  UNLOCK ){.    pP
af30: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
af40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
af50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
af60: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
af70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
af80: 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 2c  cJournal(Pager*,
af90: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a   const char*);..
afa0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
afb0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
afc0: 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
afd0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
afe0: 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
aff0: 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
b000: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
b010: 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
b020: 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
b030: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
b040: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
b050: 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
b060: 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
b070: 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
b080: 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
b090: 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
b0a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
b0b0: 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
b0c0: 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
b0d0: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
b0e0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
b0f0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
b100: 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
b110: 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
b120: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
b130: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
b140: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
b150: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
b160: 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
b170: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
b180: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
b190: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
b1a0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
b1b0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
b1c0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
b1d0: 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
b1e0: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
b1f0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
b200: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
b210: 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
b220: 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
b230: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
b240: 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
b250: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
b260: 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
b270: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
b280: 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
b290: 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
b2a0: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
b2b0: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
b2c0: 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
b2d0: 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
b2e0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
b2f0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
b300: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
b310: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
b320: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
b330: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
b340: 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
b350: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
b360: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
b370: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
b380: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
b390: 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50   = pager_hash(pP
b3a0: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
b3b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
b3c0: 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20  ash[h]==pPg );. 
b3d0: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
b3e0: 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
b3f0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Hash;.  }.  pPg-
b400: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
b410: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
b420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
b430: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
b440: 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e  o truncate an in
b450: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
b460: 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c  .  Delete.** all
b470: 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e   pages whose pgn
b480: 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  o is larger than
b490: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
b4a0: 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
b4b0: 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ced..** Referenc
b4c0: 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
b4d0: 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
b4e0: 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
b4f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
b500: 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61  emoryTruncate(Pa
b510: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
b520: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
b530: 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
b540: 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
b550: 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
b560: 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
b570: 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
b580: 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
b590: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
b5a0: 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
b5b0: 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
b5c0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
b5d0: 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
b5e0: 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
b5f0: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
b600: 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
b610: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
b620: 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
b630: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
b640: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
b650: 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
b660: 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  ll;.      unlink
b670: 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
b680: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
b690: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
b6a0: 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
b6b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e   }.}../*.** Trun
b6c0: 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
b6d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
b6e0: 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
b6f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
b700: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
b710: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
b720: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
b730: 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
b740: 3e 64 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20  >dbSize<0 ){.   
b750: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
b760: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
b770: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
b780: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
b790: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
b7a0: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
b7b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
b7c0: 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
b7d0: 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  =(unsigned)pPage
b7e0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
b7f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b800: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  K;.  }.  if( pPa
b810: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
b820: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
b830: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
b840: 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
b850: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
b860: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
b870: 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
b880: 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
b890: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b8a0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
b8b0: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
b8c0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
b8d0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  e(&pPager->fd, S
b8e0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
b8f0: 28 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a 20  (off_t)nPage);. 
b900: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b910: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
b920: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
b930: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b940: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
b950: 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
b960: 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
b970: 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
b980: 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
b990: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
b9a0: 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
b9b0: 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
b9c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
b9d0: 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
b9e0: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
b9f0: 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
ba00: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
ba10: 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
ba20: 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
ba30: 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
ba40: 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
ba50: 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
ba60: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
ba70: 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
ba80: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
ba90: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
baa0: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
bab0: 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  edump..*/.int sq
bac0: 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
bad0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bae0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
baf0: 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28  pNext;.  switch(
bb00: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29   pPager->state )
bb10: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
bb20: 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63  _RESERVED:.    c
bb30: 61 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ase PAGER_SYNCED
bb40: 3a 20 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  : .    case PAGE
bb50: 52 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20  R_EXCLUSIVE: {. 
bb60: 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
bb70: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
bb80: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
bb90: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
bba0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
bbb0: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
bbc0: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
bbd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
bbe0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
bbf0: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
bc00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bc10: 7d 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  }.    case PAGER
bc20: 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20  _SHARED: {.     
bc30: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
bc40: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mDb ){.        s
bc50: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
bc60: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
bc70: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
bc80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bc90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
bca0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
bcb0: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ing */.      bre
bcc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
bcd0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
bce0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
bcf0: 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e  Next){.#ifndef N
bd00: 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 50  DEBUG.    if( pP
bd10: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
bd20: 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
bd30: 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
bd40: 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
bd50: 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
bd60: 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
bd70: 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
bd80: 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
bd90: 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
bda0: 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
bdb0: 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
bdc0: 6e 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20 3d  ndif.    pNext =
bdd0: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
bde0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
bdf0: 50 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Pg);.  }.  sqlit
be00: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
be10: 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65 72 74  r->fd);.  assert
be20: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
be30: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a  lOpen==0 );.  /*
be40: 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
be50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
be60: 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
be70: 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
be80: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
be90: 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
bea0: 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
beb0: 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
bec0: 20 2a 2f 0a 20 20 43 4c 52 5f 50 41 47 45 52 28   */.  CLR_PAGER(
bed0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
bee0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
bef0: 21 3d 28 63 68 61 72 2a 29 26 70 50 61 67 65 72  !=(char*)&pPager
bf00: 5b 31 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [1] ){.    asser
bf10: 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  t( 0 );  /* Cann
bf20: 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  ot happen */.   
bf30: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
bf40: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
bf50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
bf60: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
bf70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
bf80: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
bf90: 6f 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ory);.  }.  sqli
bfa0: 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
bfb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bfc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
bfd0: 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
bfe0: 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
bff0: 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
c000: 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65  Pgno sqlite3page
c010: 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69  r_pagenumber(voi
c020: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
c030: 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f  dr *p = DATA_TO_
c040: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
c050: 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
c060: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
c070: 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
c080: 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
c090: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
c0a0: 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
c0b0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
c0c0: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
c0d0: 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
c0e0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
c0f0: 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
c100: 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
c110: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
c120: 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
c130: 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
c140: 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
c150: 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
c160: 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
c170: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
c180: 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
c190: 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
c1a0: 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
c1b0: 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
c1c0: 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
c1d0: 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
c1e0: 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
c1f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
c200: 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
c210: 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
c220: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
c230: 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
c240: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
c250: 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
c260: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
c270: 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
c280: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
c290: 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
c2a0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
c2b0: 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
c2c0: 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
c2d0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
c2e0: 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
c2f0: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
c300: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
c310: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
c320: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
c330: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
c340: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
c350: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
c360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c370: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
c380: 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
c390: 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
c3a0: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
c3b0: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
c3c0: 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
c3d0: 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
c3e0: 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
c3f0: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
c400: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
c410: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
c420: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
c430: 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
c440: 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
c450: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
c460: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
c470: 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 76 6f  TEST.  static vo
c480: 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
c490: 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
c4a0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
c4b0: 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
c4c0: 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
c4d0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
c4e0: 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e  f++;.      REFIN
c4f0: 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  FO(pPg);.    }. 
c500: 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
c510: 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20  e page_ref(P)   
c520: 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70  ((P)->nRef==0?_p
c530: 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64  age_ref(P):(void
c540: 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65  )(P)->nRef++).#e
c550: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
c560: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
c570: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
c580: 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
c590: 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
c5a0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
c5b0: 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
c5c0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
c5d0: 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61  _ref(void *pData
c5e0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
c5f0: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
c600: 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72  pData);.  page_r
c610: 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
c620: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c630: 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
c640: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65  ournal.  In othe
c650: 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
c660: 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
c670: 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
c680: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
c690: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
c6a0: 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
c6b0: 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
c6c0: 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20  he.** disk.  It 
c6d0: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d  is not safe to m
c6e0: 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e  odify the origin
c6f0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
c700: 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20   until after.** 
c710: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
c720: 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66  been synced.  If
c730: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
c740: 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69  tabase is modifi
c750: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
c760: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
c770: 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66  ed and a power f
c780: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74  ailure occurs, t
c790: 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72  he unsynced jour
c7a0: 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c  nal.** data woul
c7b0: 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65  d be lost and we
c7c0: 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65   would be unable
c7d0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72   to completely r
c7e0: 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64  ollback the.** d
c7f0: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
c800: 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
c810: 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75  ption would occu
c820: 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  r..** .** This r
c830: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61  outine also upda
c840: 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65  tes the nRec fie
c850: 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ld in the header
c860: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
c870: 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74  .** (See comment
c880: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70  s on the pager_p
c890: 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
c8a0: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
c8b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a   information.).*
c8c0: 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f  * If the sync mo
c8d0: 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20  de is FULL, two 
c8e0: 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72  syncs will occur
c8f0: 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f  .  First the who
c900: 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73  le journal.** is
c910: 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68   synced, then th
c920: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
c930: 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20  updated, then a 
c940: 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75  second sync occu
c950: 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  rs..**.** For te
c960: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
c970: 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  s, we do not car
c980: 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
c990: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
c9a0: 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  after a power fa
c9b0: 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f  ilure, so sync o
c9c0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ccurs..**.** Thi
c9d0: 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
c9e0: 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
c9f0: 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
ca00: 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
ca10: 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
ca20: 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
ca30: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
ca40: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
ca50: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 50 67   *zMaster){.  Pg
ca60: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
ca70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ca80: 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
ca90: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
caa0: 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
cab0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
cac0: 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
cad0: 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
cae0: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
caf0: 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
cb00: 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
cb10: 79 6e 63 20 7c 7c 20 7a 4d 61 73 74 65 72 20 29  ync || zMaster )
cb20: 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
cb30: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
cb40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
cb50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
cb60: 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   );.      /* ass
cb70: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
cb80: 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e  Sync ); // noSyn
cb90: 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69  c might be set i
cba0: 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  f synchronous.  
cbb0: 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65      ** was turne
cbc0: 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20  d off after the 
cbd0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
cbe0: 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74  started.  Ticket
cbf0: 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66   #615 */.#ifndef
cc00: 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
cc10: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
cc20: 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d  sure the pPager-
cc30: 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65  >nRec counter we
cc40: 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72   are keeping agr
cc50: 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ees.        ** w
cc60: 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d  ith the nRec com
cc70: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  puted from the s
cc80: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
cc90: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
cca0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   */.        off_
ccb0: 74 20 68 64 72 53 7a 2c 20 70 67 53 7a 2c 20 6a  t hdrSz, pgSz, j
ccc0: 53 7a 3b 0a 20 20 20 20 20 20 20 20 68 64 72 53  Sz;.        hdrS
ccd0: 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  z = JOURNAL_HDR_
cce0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
ccf0: 20 20 20 20 70 67 53 7a 20 3d 20 4a 4f 55 52 4e      pgSz = JOURN
cd00: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
cd10: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
cd20: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
cd30: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
cd40: 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
cd50: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
cd60: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
cd70: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
cd80: 63 2a 70 67 53 7a 2b 68 64 72 53 7a 3d 3d 6a 53  c*pgSz+hdrSz==jS
cd90: 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
cda0: 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
cdb0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
cdc0: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
cdd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
cde0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  e header */.    
cdf0: 20 20 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20      off_t szJ;. 
ce00: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
ce10: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
ce20: 20 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28           TRACE2(
ce30: 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
ce40: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
ce50: 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 20 20 20  fd.h);.         
ce60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
ce70: 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
ce80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
ce90: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
cea0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
ceb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
cec0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
ced0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
cee0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
cef0: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
cf00: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
cf10: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
cf20: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
cf30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
cf40: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
cf50: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6d 61  e name of the ma
cf60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
cf70: 65 20 69 66 20 6f 6e 65 20 69 73 20 73 70 65 63  e if one is spec
cf80: 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ified */.       
cf90: 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a   if( zMaster ){.
cfa0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
cfb0: 28 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  ( strlen(zMaster
cfc0: 29 3c 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65  )<pPager->nMaste
cfd0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  r );.          r
cfe0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
cff0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
d000: 32 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  20);.          i
d010: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d020: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  c;.          rc 
d030: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
d040: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  (&pPager->jfd, z
d050: 4d 61 73 74 65 72 2c 20 73 74 72 6c 65 6e 28 7a  Master, strlen(z
d060: 4d 61 73 74 65 72 29 2b 31 29 3b 0a 20 20 20 20  Master)+1);.    
d070: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
d080: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
d090: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 7a 4a    }..        szJ
d0a0: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
d0b0: 5a 28 70 50 61 67 65 72 29 20 2b 20 20 70 50 61  Z(pPager) +  pPa
d0c0: 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41  ger->nRec*JOURNA
d0d0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
d0e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d0f0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
d100: 6a 66 64 2c 20 73 7a 4a 29 3b 0a 20 20 20 20 20  jfd, szJ);.     
d110: 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28   }.      TRACE2(
d120: 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
d130: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
d140: 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 72 63 20  fd.h);.      rc 
d150: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
d160: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
d170: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
d180: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d190: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
d1a0: 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
d1b0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
d1c0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
d1d0: 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
d1e0: 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
d1f0: 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
d200: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
d210: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
d220: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
d230: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
d240: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
d250: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
d260: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
d270: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
d280: 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
d290: 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
d2a0: 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
d2b0: 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
d2c0: 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
d2d0: 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
d2e0: 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
d2f0: 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
d300: 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
d310: 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
d320: 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
d330: 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
d340: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
d350: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
d360: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
d370: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
d380: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
d390: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
d3a0: 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
d3b0: 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e  Synced==pPager->
d3c0: 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
d3d0: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
d3e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
d3f0: 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
d400: 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
d410: 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
d420: 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
d430: 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
d440: 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
d450: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
d460: 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68  file and mark th
d470: 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65  em all.** as cle
d480: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
d490: 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
d4a0: 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
d4b0: 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
d4c0: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
d4d0: 0a 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b  .  int busy = 1;
d4e0: 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
d4f0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d500: 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
d510: 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
d520: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
d530: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
d540: 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
d550: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
d560: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
d570: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
d580: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
d590: 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
d5a0: 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
d5b0: 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
d5c0: 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
d5d0: 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
d5e0: 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
d5f0: 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
d600: 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
d610: 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
d620: 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
d630: 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
d640: 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
d650: 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
d660: 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
d670: 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
d680: 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
d690: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d6a0: 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
d6b0: 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
d6c0: 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
d6d0: 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
d6e0: 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
d6f0: 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
d700: 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
d710: 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
d720: 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
d730: 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
d740: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
d750: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
d760: 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
d770: 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
d780: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
d790: 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
d7a0: 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
d7b0: 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
d7c0: 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
d7d0: 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
d7e0: 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
d7f0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
d800: 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
d810: 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
d820: 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
d830: 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
d840: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
d850: 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
d860: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
d870: 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
d880: 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
d890: 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  */.  do {.    rc
d8a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
d8b0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  (&pPager->fd, EX
d8c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
d8d0: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
d8e0: 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20  ITE_BUSY && .   
d8f0: 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
d900: 48 61 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20  Handler && .    
d910: 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
d920: 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26  andler->xFunc &&
d930: 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
d940: 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46  pBusyHandler->xF
d950: 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73  unc(pPager->pBus
d960: 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20  yHandler->pArg, 
d970: 62 75 73 79 2b 2b 29 0a 20 20 29 3b 0a 20 20 69  busy++).  );.  i
d980: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d990: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d9a0: 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
d9b0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
d9c0: 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 77 68 69  XCLUSIVE;..  whi
d9d0: 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  le( pList ){.   
d9e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
d9f0: 64 69 72 74 79 20 29 3b 0a 20 20 20 20 73 71 6c  dirty );.    sql
da00: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
da10: 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e  er->fd, (pList->
da20: 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53  pgno-1)*(off_t)S
da30: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
da40: 3b 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67  ;.    CODEC(pPag
da50: 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
da60: 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
da70: 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 54  >pgno, 6);.    T
da80: 52 41 43 45 32 28 22 53 54 4f 52 45 20 70 61 67  RACE2("STORE pag
da90: 65 20 25 64 5c 6e 22 2c 20 70 4c 69 73 74 2d 3e  e %d\n", pList->
daa0: 70 67 6e 6f 29 3b 0a 20 20 20 20 72 63 20 3d 20  pgno);.    rc = 
dab0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
dac0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
dad0: 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
dae0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
daf0: 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70  ZE);.    CODEC(p
db00: 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
db10: 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
db20: 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  st->pgno, 0);.  
db30: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
db40: 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d  n rc;.    pList-
db50: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
db60: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
db70: 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  Dirty;.  }.  ret
db80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
db90: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20  ../*.** Collect 
dba0: 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65  every dirty page
dbb0: 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69   into a dirty li
dbc0: 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  st and.** return
dbd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
dbe0: 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c  e head of that l
dbf0: 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20  ist.  All pages 
dc00: 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64  are.** collected
dc10: 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
dc20: 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a  e still in use..
dc30: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
dc40: 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64  *pager_get_all_d
dc50: 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72  irty_pages(Pager
dc60: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
dc70: 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20  dr *p, *pList;. 
dc80: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f   pList = 0;.  fo
dc90: 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
dca0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
dcb0: 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ll){.    if( p->
dcc0: 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  dirty ){.      p
dcd0: 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74  ->pDirty = pList
dce0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
dcf0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  p;.    }.  }.  r
dd00: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
dd10: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
dd20: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  page..**.** A re
dd30: 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
dd40: 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61  isk file is obta
dd50: 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  ined when the fi
dd60: 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75  rst page is acqu
dd70: 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72  ired. .** This r
dd80: 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70  ead lock is drop
dd90: 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ped when the las
dda0: 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
ddb0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74  ed..**.** A _get
ddc0: 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
ddd0: 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
dde0: 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
ddf0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
de00: 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
de10: 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
de20: 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
de30: 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
de40: 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
de50: 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
de60: 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
de70: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
de80: 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
de90: 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
dea0: 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
deb0: 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
dec0: 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
ded0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
dee0: 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
def0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
df00: 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
df10: 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
df20: 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
df30: 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
df40: 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
df50: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
df60: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
df70: 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
df80: 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
df90: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61  e also sqlite3pa
dfa0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42  ger_lookup().  B
dfb0: 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
dfc0: 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61   and _lookup() a
dfd0: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
dfe0: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
dff0: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
e000: 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
e010: 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
e020: 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
e030: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
e040: 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
e050: 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
e060: 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75   _lookup().** ju
e070: 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
e080: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
e090: 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
e0a0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
e0b0: 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
e0c0: 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
e0d0: 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
e0e0: 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
e0f0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
e100: 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29   Since _lookup()
e110: 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
e120: 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
e130: 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
e140: 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
e150: 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
e160: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
e170: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
e180: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
e190: 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67   **ppPage){.  Pg
e1a0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
e1b0: 72 63 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  rc;..  /* Make s
e1c0: 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20  ure we have not 
e1d0: 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c  hit any critical
e1e0: 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20   errors..  */ . 
e1f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
e200: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e210: 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70 70  pgno!=0 );.  *pp
e220: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
e230: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
e240: 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55  & ~(PAGER_ERR_FU
e250: 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LL) ){.    retur
e260: 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
e270: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
e280: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
e290: 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
e2a0: 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
e2b0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
e2c0: 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
e2d0: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
e2e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
e2f0: 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==0 && !pPager->
e300: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74  memDb ){.    int
e310: 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 64   busy = 1;.    d
e320: 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
e330: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
e340: 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
e350: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 77 68 69  _LOCK);.    }whi
e360: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
e370: 55 53 59 20 26 26 20 0a 20 20 20 20 20 20 20 20  USY && .        
e380: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
e390: 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20 20  dler && .       
e3a0: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
e3b0: 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20  ndler->xFunc && 
e3c0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
e3d0: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78  >pBusyHandler->x
e3e0: 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75  Func(pPager->pBu
e3f0: 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c  syHandler->pArg,
e400: 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 29 3b 0a   busy++).    );.
e410: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e420: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
e430: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e440: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
e450: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
e460: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
e470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
e480: 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
e490: 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
e4a0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
e4b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
e4c0: 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
e4d0: 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
e4e0: 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
e4f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e500: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
e510: 6e 61 6c 20 26 26 20 0a 20 20 20 20 20 20 20 20  nal && .        
e520: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
e530: 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
e540: 72 6e 61 6c 29 20 26 26 0a 20 20 20 20 20 20 20  rnal) &&.       
e550: 20 21 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b   !sqlite3OsCheck
e560: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 26 70 50  ReservedLock(&pP
e570: 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 20 29  ager->fd) .    )
e580: 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b  {.       int rc;
e590: 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ..       /* Get 
e5a0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
e5b0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
e5c0: 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
e5d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e5e0: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
e5f0: 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
e600: 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
e610: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e620: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
e630: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
e640: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
e650: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
e660: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
e670: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72  LOCK;.         r
e680: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
e690: 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72   }.       pPager
e6a0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
e6b0: 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20  EXCLUSIVE;..    
e6c0: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
e6d0: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69  ournal for readi
e6e0: 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ng only.  Return
e6f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a   SQLITE_BUSY if.
e700: 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
e710: 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
e720: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e730: 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  . .       **.   
e740: 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e      ** The journ
e750: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
e760: 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
e770: 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a  ed itself.  The.
e780: 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
e790: 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
e7a0: 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20  open unless the 
e7b0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
e7c0: 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20  le holds.       
e7d0: 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c  ** a write lock,
e7e0: 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76   so there is nev
e7f0: 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66  er any chance of
e800: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20   two or more.   
e810: 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73      ** processes
e820: 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75   opening the jou
e830: 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65  rnal at the same
e840: 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f   time..       */
e850: 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .       rc = sql
e860: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
e870: 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ly(pPager->zJour
e880: 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
e890: 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  d);.       if( r
e8a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e8b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e8c0: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
e8d0: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
e8e0: 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
e8f0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
e900: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  NLOCK;.         
e910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
e920: 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  SY;.       }.   
e930: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
e940: 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  nalOpen = 1;.   
e950: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
e960: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
e970: 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62  .       /* Playb
e980: 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
e990: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
e9a0: 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
e9b0: 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c  rite.       ** l
e9c0: 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
e9d0: 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
e9e0: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
e9f0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
ea00: 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
ea10: 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
ea20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ea30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
ea40: 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ;.       }.    }
ea50: 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
ea60: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65  }else{.    /* Se
ea70: 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e  arch for page in
ea80: 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50   cache */.    pP
ea90: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
eaa0: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
eab0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
eac0: 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d  memDb && pPager-
ead0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
eae0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
eaf0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
eb00: 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
eb10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  }.  }.  if( pPg=
eb20: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
eb30: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
eb40: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
eb50: 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
eb60: 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67   int h;.    pPag
eb70: 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20  er->nMiss++;.   
eb80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
eb90: 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  ge<pPager->mxPag
eba0: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69  e || pPager->pFi
ebb0: 72 73 74 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  rst==0 || pPager
ebc0: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
ebd0: 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
ebe0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70   page */.      p
ebf0: 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Pg = sqliteMallo
ec00: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50  cRaw( sizeof(*pP
ec10: 67 29 20 2b 20 53 51 4c 49 54 45 5f 50 41 47 45  g) + SQLITE_PAGE
ec20: 5f 53 49 5a 45 20 0a 20 20 20 20 20 20 20 20 20  _SIZE .         
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
ec50: 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
ec60: 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  tra.            
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 2b 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44    + pPager->memD
ec90: 62 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  b*sizeof(PgHisto
eca0: 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ry) );.      if(
ecb0: 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
ecc0: 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
ecd0: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20  memDb ){.       
ece0: 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65     pager_unwrite
ecf0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
ed00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ed10: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
ed20: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d  |= PAGER_ERR_MEM
ed30: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ed40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ed50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
ed60: 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65  set(pPg, 0, size
ed70: 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20  of(*pPg));.     
ed80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
ed90: 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  Db ){.        me
eda0: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49  mset(PGHDR_TO_HI
edb0: 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  ST(pPg, pPager),
edc0: 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73   0, sizeof(PgHis
edd0: 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a  tory));.      }.
ede0: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
edf0: 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
ee00: 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20    pPg->pNextAll 
ee10: 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a  = pPager->pAll;.
ee20: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
ee30: 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ll = pPg;.      
ee40: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
ee50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ee60: 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
ee70: 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
ee80: 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
ee90: 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
eea0: 0a 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72  .      ** requir
eeb0: 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73  e us to do an fs
eec0: 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75  ync() on the jou
eed0: 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rnal..      */. 
eee0: 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
eef0: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r->pFirstSynced;
ef00: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65  ..      /* If we
ef10: 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
ef20: 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
ef30: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
ef40: 66 73 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a  fsync().      **
ef50: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
ef60: 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20  file then fsync 
ef70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ef80: 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 20  .  This is a.   
ef90: 20 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20     ** very slow 
efa0: 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65  operation, so we
efb0: 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76   work hard to av
efc0: 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d  oid it.  But som
efd0: 65 74 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20  etimes.      ** 
efe0: 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70  it can't be help
eff0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
f000: 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
f010: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
f020: 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
f030: 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
f040: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
f050: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f060: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
f070: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
f080: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f090: 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d  IOERR;.        }
f0a0: 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70  .        pPg = p
f0b0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
f0c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
f0d0: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
f0e0: 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  0 );..      /* W
f0f0: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
f100: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f110: 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
f120: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
f130: 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
f140: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
f150: 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
f160: 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
f170: 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
f180: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
f190: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
f1a0: 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  st( pPg );.     
f1b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f1c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f1d0: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
f1e0: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
f1f0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
f200: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
f210: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f220: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
f230: 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
f240: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
f250: 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
f260: 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
f270: 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
f280: 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ack, then.      
f290: 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
f2a0: 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
f2b0: 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
f2c0: 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  bling the.      
f2d0: 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72  ** sqlite_dont_r
f2e0: 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
f2f0: 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
f300: 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
f310: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
f320: 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
f330: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
f340: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
f350: 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
f360: 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67  ack.      ** mig
f370: 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61  ht be reloaded a
f380: 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62  t a later time b
f390: 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ut at that point
f3a0: 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62   we won't rememb
f3b0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  er.      ** that
f3c0: 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
f3d0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
f3e0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
f3f0: 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
f400: 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65       ** be marke
f410: 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
f420: 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
f430: 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   out..      */. 
f440: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61 6c       if( pPg->al
f450: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
f460: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
f470: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
f480: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
f490: 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65     /* Unlink the
f4a0: 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
f4b0: 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
f4c0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
f4d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
f4e0: 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
f4f0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f        pPager->nO
f500: 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  vfl++;.    }.   
f510: 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
f520: 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  o;.    if( pPage
f530: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->aInJournal &&
f540: 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
f550: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
f560: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
f570: 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65  heckMemory(pPage
f580: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->aInJournal, p
f590: 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73  gno/8);.      as
f5a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
f5b0: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
f5c0: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
f5d0: 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e  l = (pPager->aIn
f5e0: 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20  Journal[pgno/8] 
f5f0: 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
f600: 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  !=0;.      pPg->
f610: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
f620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f630: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
f640: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
f650: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
f660: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
f670: 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e  ->aInStmt && (in
f680: 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
f690: 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20  stmtSize.       
f6a0: 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72        && (pPager
f6b0: 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38  ->aInStmt[pgno/8
f6c0: 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
f6d0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))!=0 ){.      p
f6e0: 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
f6f0: 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
f700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65  else{.      page
f710: 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
f720: 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
f730: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74   }.    pPg->dirt
f740: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 0;.    pPg->
f750: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45  nRef = 1;.    RE
f760: 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20  FINFO(pPg);.    
f770: 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
f780: 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61      h = pager_ha
f790: 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50  sh(pgno);.    pP
f7a0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
f7b0: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
f7c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
f7d0: 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
f7e0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
f7f0: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ash ){.      ass
f800: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
f810: 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  ash->pPrevHash==
f820: 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  0 );.      pPg->
f830: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
f840: 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
f850: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
f860: 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
f870: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
f880: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20  _TO_EXTRA(pPg), 
f890: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
f8a0: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
f8b0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
f8c0: 3c 30 20 29 20 73 71 6c 69 74 65 33 70 61 67 65  <0 ) sqlite3page
f8d0: 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
f8e0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  er);.    if( pPa
f8f0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
f900: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f910: 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
f920: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
f930: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
f940: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
f950: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f960: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
f970: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
f980: 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20  <(int)pgno ){.  
f990: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
f9a0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
f9b0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
f9c0: 5a 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ZE);.    }else{.
f9d0: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
f9e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f9f0: 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
fa00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
fa10: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
fa20: 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74   (pgno-1)*(off_t
fa30: 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  )SQLITE_PAGE_SIZ
fa40: 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  E);.      rc = s
fa50: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
fa60: 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
fa70: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51  TO_DATA(pPg), SQ
fa80: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
fa90: 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 46  .      TRACE2("F
faa0: 45 54 43 48 20 70 61 67 65 20 25 64 5c 6e 22 2c  ETCH page %d\n",
fab0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
fac0: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
fad0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
fae0: 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
faf0: 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  3);.      if( rc
fb00: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fb10: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c         off_t fil
fb20: 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  eSize;.        i
fb30: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
fb40: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64  Size(&pPager->fd
fb50: 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c  ,&fileSize)!=SQL
fb60: 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
fb70: 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a        || fileSiz
fb80: 65 3e 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50  e>=pgno*SQLITE_P
fb90: 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
fba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
fbb0: 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54  er_unref(PGHDR_T
fbc0: 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20  O_DATA(pPg));.  
fbd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
fbe0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
fbf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
fc00: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
fc10: 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45  (pPg), 0, SQLITE
fc20: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
fc30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
fc40: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
fc50: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
fc60: 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
fc70: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
fc80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69  .    pPager->nHi
fc90: 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72 65  t++;.    page_re
fca0: 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  f(pPg);.  }.  *p
fcb0: 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f  pPage = PGHDR_TO
fcc0: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65  _DATA(pPg);.  re
fcd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
fcf0: 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
fd00: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
fd10: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
fd20: 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
fd30: 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
fd40: 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
fd50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
fd60: 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
fd70: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
fd80: 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53  n cache..**.** S
fd90: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
fda0: 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65  ager_get().  The
fdb0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
fdc0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
fdd0: 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70  .** and sqlite3p
fde0: 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68  ager_get() is th
fdf0: 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
fe00: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
fe10: 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
fe20: 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
fe30: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
fe40: 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
fe50: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
fe60: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
fe70: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
fe80: 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
fe90: 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
fea0: 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
feb0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
fec0: 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
fed0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
fee0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
fef0: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
ff00: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
ff10: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
ff20: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
ff30: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
ff40: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
ff50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ff60: 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67  .  }.  pPg = pag
ff70: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
ff80: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
ff90: 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Pg==0 ) return 0
ffa0: 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
ffb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  );.  return PGHD
ffc0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
ffd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
ffe0: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
fff0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
10000 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
10010 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
10020 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
10030 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
10040 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
10050 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
10060 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
10070 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
10080 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
10090 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
100a0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
100b0 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
100c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
100d0 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20  ager_unref(void 
100e0 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
100f0 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63   *pPg;..  /* Dec
10100 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
10110 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
10120 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
10130 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
10140 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73  HDR(pData);.  as
10150 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
10160 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  0 );.  pPg->nRef
10170 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
10180 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
10190 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
101a0 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
101b0 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
101c0 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
101d0 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
101e0 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
101f0 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
10200 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
10210 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
10220 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
10230 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
10240 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
10250 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
10260 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
10270 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
10280 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
10290 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
102a0 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
102b0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
102c0 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
102d0 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
102e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
102f0 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
10300 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
10310 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
10320 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10330 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
10340 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
10350 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
10360 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10370 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
10380 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
10390 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
103a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
103b0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
103c0 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
103d0 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
103e0 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
103f0 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
10400 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
10410 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
10420 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
10430 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
10440 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
10450 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
10460 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 70 50  ->nRef==0 && !pP
10470 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
10480 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
10490 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
104a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
104b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
104c0 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
104d0 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
104e0 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
104f0 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
10500 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
10510 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
10520 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10530 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
10540 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
10550 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
10560 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
10570 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
10580 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
10590 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
105a0 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
105b0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
105c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
105d0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
105e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
105f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
10600 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6d 65  ert( !pPager->me
10610 6d 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  mDb );.  assert(
10620 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
10630 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
10640 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
10650 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
10660 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10670 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
10680 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 70  al );.  sqlite3p
10690 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
106a0 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
106b0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
106c0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
106d0 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
106e0 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
106f0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
10700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
10710 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
10720 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
10730 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
10740 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
10750 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
10760 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10770 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10780 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
10790 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
107a0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70  , &pPager->jfd,p
107b0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
107c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
107d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
107e0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
107f0 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  aInJournal);.   
10800 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
10810 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  nal = 0;.    sql
10820 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
10830 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
10840 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
10850 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
10860 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
10870 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
10880 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OPEN;.  }.  sqli
10890 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f  te3OsOpenDirecto
108a0 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  ry(pPager->zDire
108b0 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72 2d 3e  ctory, &pPager->
108c0 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  jfd);.  pPager->
108d0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
108e0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
108f0 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
10900 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
10910 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
10920 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
10930 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
10940 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
10950 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
10960 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 ){.    rc = pa
10970 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
10980 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
10990 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
109a0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
109b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
109c0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
109d0 68 65 61 64 65 72 20 66 6f 72 20 74 68 65 20 6a  header for the j
109e0 6f 75 72 6e 61 6c 3a 0a 20 20 2a 2a 20 2d 20 38  ournal:.  ** - 8
109f0 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
10a00 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
10a10 6c 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2a 20 2d  l format..  ** -
10a20 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
10a30 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
10a40 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
10a50 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
10a60 2e 0a 20 20 2a 2a 20 2d 20 34 20 62 79 74 65 73  ..  ** - 4 bytes
10a70 3a 20 4d 61 67 69 63 20 75 73 65 64 20 66 6f 72  : Magic used for
10a80 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 73 2e   page checksums.
10a90 0a 20 20 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  .  ** - 4 bytes:
10aa0 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
10ab0 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 20 20  e page count..  
10ac0 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
10ad0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
10ae0 73 65 72 76 65 64 20 66 6f 72 20 6d 61 73 74 65  served for maste
10af0 72 20 6a 6f 75 72 6e 61 6c 20 70 74 72 20 28 6e  r journal ptr (n
10b00 4d 61 73 74 65 72 29 0a 20 20 2a 2a 20 2d 20 6e  Master).  ** - n
10b10 4d 61 73 74 65 72 20 62 79 74 65 73 3a 20 53 70  Master bytes: Sp
10b20 61 63 65 20 66 6f 72 20 61 20 6d 61 73 74 65 72  ace for a master
10b30 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
10b40 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
10b50 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
10b60 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
10b70 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
10b80 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
10b90 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
10ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
10bb0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
10bc0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
10bd0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66  er->noSync ? 0xf
10be0 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
10bf0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
10c00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
10c10 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73  ite3Randomness(s
10c20 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
10c30 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
10c40 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
10c50 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
10c60 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
10c70 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
10c80 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nit);.  }.  if( 
10c90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10ca0 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
10cb0 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
10cc0 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  fd, pPager->dbSi
10cd0 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ze);.  }.  if( r
10ce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10cf0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
10d00 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
10d10 64 2c 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74  d, pPager->nMast
10d20 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
10d30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10d40 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
10d50 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
10d60 32 34 20 2b 20 70 50 61 67 65 72 2d 3e 6e 4d 61  24 + pPager->nMa
10d70 73 74 65 72 20 2d 20 31 29 3b 0a 20 20 20 20 72  ster - 1);.    r
10d80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10d90 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
10da0 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d   "\000", 1);.  }
10db0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
10dc0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72  tmtAutoopen && r
10dd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10de0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10df0 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e  pager_stmt_begin
10e00 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10e10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10e20 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
10e30 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
10e40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
10e50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10e60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10e70 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
10e80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10e90 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75    .}../*.** Acqu
10ea0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
10eb0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
10ec0 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
10ed0 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
10ee0 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
10ef0 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
10f00 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
10f10 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e3pager_commit()
10f20 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
10f30 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
10f40 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  _rollback() is c
10f50 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
10f60 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
10f70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
10f80 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
10f90 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63  ger_unref() is c
10fa0 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72  alled to on ever
10fb0 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
10fc0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
10fd0 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f  rst parameter to
10fe0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10ff0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
11000 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74  y open page of t
11010 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
11020 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68  ile.  Nothing ch
11030 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20  anges about the 
11040 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65  page - it is use
11050 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61  d merely to.** a
11060 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72  cquire a pointer
11070 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
11080 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70  ructure and as p
11090 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20  roof that there 
110a0 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20  is.** already a 
110b0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
110c0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
110d0 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   The second para
110e0 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
110f0 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
11100 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72  n bytes to reser
11110 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74  ve for a.** mast
11120 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  er journal file-
11130 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72  name at the star
11140 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
11150 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61   when it is crea
11160 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75  ted..**.** A jou
11170 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
11180 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e  ned if this is n
11190 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ot a temporary f
111a0 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72  ile.  For tempor
111b0 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68  ary.** files, th
111c0 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65  e opening of the
111d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
111e0 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
111f0 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61  there is an.** a
11200 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72  ctual need to wr
11210 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
11220 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  al..**.** If the
11230 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
11240 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f  eady reserved fo
11250 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20  r writing, this 
11260 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
11270 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
11280 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f  e3pager_begin(vo
11290 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  id *pData, int n
112a0 4d 61 73 74 65 72 29 7b 0a 20 20 50 67 48 64 72  Master){.  PgHdr
112b0 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
112c0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
112d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
112e0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
112f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11300 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
11310 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
11320 73 65 72 74 28 20 6e 4d 61 73 74 65 72 3e 3d 30  sert( nMaster>=0
11330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11340 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
11350 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  ER_UNLOCK );.  i
11360 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
11370 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
11380 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
11390 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
113a0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
113b0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
113c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
113d0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
113e0 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
113f0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
11400 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
11410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11420 20 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b     int busy = 1;
11430 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
11440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11450 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
11460 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
11470 4b 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  K);.      }while
11480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
11490 59 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  Y && .          
114a0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
114b0 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20 20  dler && .       
114c0 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
114d0 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26  Handler->xFunc &
114e0 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  & .          pPa
114f0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
11500 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d  r->xFunc(pPager-
11510 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70  >pBusyHandler->p
11520 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20  Arg, busy++).   
11530 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
11540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11550 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11560 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
11570 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65    pPager->nMaste
11580 72 20 3d 20 6e 4d 61 73 74 65 72 3b 0a 20 20 20  r = nMaster;.   
11590 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
115a0 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
115b0 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
115c0 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
115d0 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 54  .      TRACE3("T
115e0 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 20 6e 4d  RANSACTION %d nM
115f0 61 73 74 65 72 3d 25 64 5c 6e 22 2c 20 70 50 61  aster=%d\n", pPa
11600 67 65 72 2d 3e 66 64 2e 68 2c 20 6e 4d 61 73 74  ger->fd.h, nMast
11610 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
11620 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
11630 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
11640 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
11650 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
11660 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
11670 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11680 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
116a0 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
116b0 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
116c0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
116d0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
116e0 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
116f0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
11700 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
11710 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
11720 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
11730 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
11740 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
11750 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
11760 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
11770 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
11780 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
11790 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
117a0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
117b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
117c0 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
117d0 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
117e0 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
117f0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
11800 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
11810 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
11820 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
11830 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
11840 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
11850 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
11860 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
11870 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
11880 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
11890 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
118a0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
118b0 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
118c0 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
118d0 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
118e0 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
118f0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
11900 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
11910 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
11920 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
11930 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
11940 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
11950 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
11960 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
11970 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
11980 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  l to sqlite3page
11990 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  r_commit() or sq
119a0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
119b0 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
119c0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
119d0 33 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69  3pager_write(voi
119e0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
119f0 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
11a00 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
11a10 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
11a20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
11a30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11a40 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
11a50 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
11a60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
11a70 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72  rrMask ){ .    r
11a80 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
11a90 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
11aa0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
11ab0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
11ac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
11ad0 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72  M;.  }..  /* Mar
11ae0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
11af0 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
11b00 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
11b10 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
11b20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
11b30 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
11b40 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
11b50 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20  */.  pPg->dirty 
11b60 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
11b70 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
11b80 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61  g->inStmt || pPa
11b90 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
11ba0 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
11bb0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
11bc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11bd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
11be0 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
11bf0 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
11c00 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
11c10 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72  ds to be.  ** wr
11c20 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
11c30 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
11c40 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
11c50 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  nt journal.  ** 
11c60 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
11c70 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
11c80 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
11c90 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
11ca0 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
11cb0 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
11cc0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a  it does not..  *
11cd0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
11ce0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
11cf0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20  _UNLOCK );.  rc 
11d00 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
11d10 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a  egin(pData, 0);.
11d20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11d30 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
11d40 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
11d50 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
11d60 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
11d70 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  D );.  if( !pPag
11d80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11d90 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
11da0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
11db0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
11dc0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
11dd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11de0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
11df0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
11e00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
11e10 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
11e20 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70  seJournal );.  p
11e30 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
11e40 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65  e = 1;..  /* The
11e50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
11e60 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
11e70 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
11e80 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a  SERVED or an.  *
11e90 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
11ea0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
11eb0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
11ec0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
11ed0 61 67 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  age to.  ** the 
11ee0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
11ef0 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
11f00 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
11f10 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d    */.  if( !pPg-
11f20 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
11f30 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
11f40 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  l || pPager->mem
11f50 44 62 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  Db) ){.    if( (
11f60 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
11f70 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
11f80 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ize ){.      int
11f90 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 75 33 32   szPg;.      u32
11fa0 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 69 66   saved;.      if
11fb0 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
11fc0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
11fd0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
11fe0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
11ff0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
12000 20 20 54 52 41 43 45 32 28 22 4a 4f 55 52 4e 41    TRACE2("JOURNA
12010 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  L page %d\n", pP
12020 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
12030 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
12040 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
12050 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69       pHist->pOri
12060 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
12070 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
12080 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
12090 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
120a0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  g ){.          m
120b0 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
120c0 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
120d0 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
120e0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
120f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67     }.        pPg
12100 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
12110 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12120 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 20        u32 cksum 
12130 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
12140 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
12150 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
12160 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
12170 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
12180 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  Pg);.        sto
12190 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20  re32bits(cksum, 
121a0 70 50 67 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  pPg, SQLITE_PAGE
121b0 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
121c0 73 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f 50 41  szPg = SQLITE_PA
121d0 47 45 5f 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20  GE_SIZE+8;.     
121e0 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
121f0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
12200 34 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  4);.        CODE
12210 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
12220 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
12230 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12240 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
12250 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61  ger->jfd, &((cha
12260 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73  r*)pData)[-4], s
12270 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 54 52  zPg);.        TR
12280 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 70 61  ACE3("JOURNAL pa
12290 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
122a0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
122b0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
122c0 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
122d0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
122e0 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
122f0 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44       *(u32*)PGHD
12300 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 20  R_TO_EXTRA(pPg) 
12310 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20  = saved;.       
12320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12330 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12340 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
12350 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
12360 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
12370 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
12380 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20  R_ERR_FULL;.    
12390 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
123a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
123b0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
123c0 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
123d0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
123e0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
123f0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
12400 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
12410 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
12420 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
12430 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
12440 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
12450 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69  ;.        pPg->i
12460 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
12470 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
12480 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
12490 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
124a0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
124b0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
124c0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
124d0 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
124e0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
124f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12500 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
12510 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
12520 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
12530 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
12540 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
12550 20 20 20 20 20 20 54 52 41 43 45 33 28 22 41 50        TRACE3("AP
12560 50 45 4e 44 20 70 61 67 65 20 25 64 20 6e 65 65  PEND page %d nee
12570 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67  dSync=%d\n", pPg
12580 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
12590 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20  dSync);.    }.  
125a0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
125b0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ync ){.      pPa
125c0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
125d0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
125e0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
125f0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
12600 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
12610 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
12620 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
12630 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
12640 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
12650 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
12660 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  that.  ** the st
12670 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
12680 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
12690 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
126a0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
126b0 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
126c0 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
126d0 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
126e0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
126f0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
12700 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
12710 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
12720 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
12730 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
12740 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
12750 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
12760 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
12770 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69  gDbSize );.    i
12780 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
12790 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
127a0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
127b0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
127c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
127d0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
127e0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
127f0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
12800 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
12810 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12820 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48   );.      if( pH
12830 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
12840 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
12850 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
12860 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
12870 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
12880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12890 54 52 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55  TRACE2("STMT-JOU
128a0 52 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c  RNAL page %d\n",
128b0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
128c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
128d0 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70  ore32bits(pPg->p
128e0 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20  gno, pPg, -4);. 
128f0 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
12900 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
12910 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 72  gno, 7);.      r
12920 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
12930 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  te(&pPager->stfd
12940 2c 20 28 28 63 68 61 72 2a 29 70 44 61 74 61 29  , ((char*)pData)
12950 2d 34 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  -4, SQLITE_PAGE_
12960 53 49 5a 45 2b 34 29 3b 0a 20 20 20 20 20 20 54  SIZE+4);.      T
12970 52 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE2("STMT-JOUR
12980 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20  NAL page %d\n", 
12990 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
129a0 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
129b0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
129c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
129d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
129e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
129f0 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
12a00 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
12a10 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
12a20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
12a30 4c 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  L;.        retur
12a40 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
12a50 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
12a60 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73  NRec++;.      as
12a70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
12a80 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
12a90 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
12aa0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
12ab0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
12ac0 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  7);.    }.    pa
12ad0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
12ae0 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ist(pPg);.  }.. 
12af0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
12b00 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
12b10 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
12b20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
12b30 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  ze<(int)pPg->pgn
12b40 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
12b50 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
12b60 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 70 50  gno;.    if( !pP
12b70 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
12b80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
12b90 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
12ba0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
12bb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
12bc0 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
12bd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12be0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
12bf0 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
12c00 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
12c10 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
12c20 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
12c30 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  o sqlite3pager_w
12c40 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
12c50 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
12c60 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
12c70 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
12c80 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
12c90 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   page..*/.int sq
12ca0 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
12cb0 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61  teable(void *pDa
12cc0 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
12cd0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
12ce0 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
12cf0 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
12d00 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  ../*.** Replace 
12d10 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
12d20 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74   single page wit
12d30 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  h the informatio
12d40 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a  n in the third.*
12d50 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
12d60 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
12d70 6f 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20  overwrite(Pager 
12d80 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
12d90 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29  no, void *pData)
12da0 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b  {.  void *pPage;
12db0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
12dc0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
12dd0 67 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  get(pPager, pgno
12de0 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
12df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12e00 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
12e10 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
12e20 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
12e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12e40 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67       memcpy(pPag
12e50 65 2c 20 70 44 61 74 61 2c 20 53 51 4c 49 54 45  e, pData, SQLITE
12e60 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
12e70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61   }.    sqlite3pa
12e80 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
12e90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12ea0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  c;.}../*.** A ca
12eb0 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
12ec0 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
12ed0 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
12ee0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
12ef0 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
12f00 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
12f10 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74  "pgno" back to t
12f20 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
12f30 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
12f40 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
12f50 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a  d as dirty..**.*
12f60 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
12f70 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
12f80 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
12f90 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
12fa0 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
12fb0 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
12fc0 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
12fd0 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
12fe0 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
12ff0 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
13000 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
13010 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
13020 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
13030 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
13040 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
13050 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
13060 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
13070 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
13080 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
13090 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
130a0 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
130b0 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
130c0 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
130d0 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
130e0 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
130f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
13100 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
13110 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
13120 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
13130 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
13140 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
13150 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
13160 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
13170 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
13180 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
13190 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
131a0 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
131b0 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
131c0 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
131d0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
131e0 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
131f0 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
13200 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
13210 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
13220 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
13230 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
13240 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
13250 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
13260 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
13270 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
13280 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
13290 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
132a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
132b0 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
132c0 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64  reused,.** the d
132d0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72  ont_rollback() r
132e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
132f0 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
13300 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  he page contains
13310 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74  .** critical dat
13320 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  a, we still need
13330 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67   to be sure it g
13340 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ets rolled back 
13350 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74  in spite.** of t
13360 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
13370 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
13380 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
13390 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a  nt_write(Pager *
133a0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
133b0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
133c0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
133d0 3e 6d 65 6d 44 62 20 29 20 72 65 74 75 72 6e 3b  >memDb ) return;
133e0 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
133f0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
13400 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77  gno);.  pPg->alw
13410 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
13420 0a 20 20 69 66 28 20 70 50 67 20 26 26 20 70 50  .  if( pPg && pP
13430 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
13440 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
13450 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
13460 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
13470 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
13480 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
13490 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
134a0 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
134b0 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
134c0 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
134d0 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
134e0 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
134f0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
13500 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
13510 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
13520 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
13530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13540 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
13550 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
13560 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
13570 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
13580 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
13590 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
135a0 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
135b0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
135c0 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
135d0 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
135e0 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
135f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
13600 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
13610 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
13620 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
13630 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
13640 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
13650 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
13660 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
13670 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
13680 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
13690 20 20 20 20 20 20 54 52 41 43 45 33 28 22 44 4f        TRACE3("DO
136a0 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
136b0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c   of %d\n", pgno,
136c0 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
136d0 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
136e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
136f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
13700 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
13710 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
13720 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
13730 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
13740 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
13750 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
13760 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
13770 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
13780 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
13790 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
137a0 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
137b0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
137c0 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
137d0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69   journal..*/.voi
137e0 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  d sqlite3pager_d
137f0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69  ont_rollback(voi
13800 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
13810 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
13820 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
13830 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
13840 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
13850 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
13860 61 74 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate!=PAGER_EXCLU
13870 53 49 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e  SIVE || pPager->
13880 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
13890 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
138a0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
138b0 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c  ck || pPager->al
138c0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
138d0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20  pPager->memDb ) 
138e0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
138f0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
13900 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
13910 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
13920 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  bSize ){.    ass
13930 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
13940 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
13950 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
13960 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
13970 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
13980 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
13990 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
139a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
139b0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
139c0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
139d0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
139e0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
139f0 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61  7);.      page_a
13a00 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
13a10 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
13a20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c  TRACE3("DONT_ROL
13a30 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66  LBACK page %d of
13a40 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
13a50 6f 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29  o, pPager->fd.h)
13a60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
13a70 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
13a80 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
13a90 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
13aa0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
13ab0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
13ac0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
13ad0 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
13ae0 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
13af0 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
13b00 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
13b10 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  tmt!=0 );.    pP
13b20 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
13b30 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
13b40 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
13b50 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
13b60 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
13b70 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c    }.}.../*.** Cl
13b80 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
13b90 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
13ba0 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
13bb0 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
13bc0 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  st){.  sqliteFre
13bd0 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
13be0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
13bf0 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
13c00 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
13c10 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
13c20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  = 0;.}../*.** Co
13c30 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
13c40 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13c50 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
13c60 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
13c70 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
13c80 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
13c90 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
13ca0 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
13cb0 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
13cc0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
13cd0 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
13ce0 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
13cf0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
13d00 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
13d10 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
13d20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
13d30 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
13d40 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70  r *pPg;..  if( p
13d50 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d  Pager->errMask==
13d60 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29  PAGER_ERR_FULL )
13d70 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
13d80 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
13d90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
13da0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13db0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
13dc0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
13dd0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
13de0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
13df0 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
13e00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
13e10 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
13e20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13e30 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
13e40 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
13e50 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
13e60 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
13e70 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22  ;.  }.  TRACE2("
13e80 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50  COMMIT %d\n", pP
13e90 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69  ager->fd.h);.  i
13ea0 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
13eb0 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61   ){.    pPg = pa
13ec0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
13ed0 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
13ee0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
13ef0 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69  ){.      clearHi
13f00 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
13f10 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
13f20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
13f30 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
13f40 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
13f50 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
13f60 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
13f70 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
13f80 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
13f90 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
13fa0 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
13fb0 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
13fc0 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  UG.    for(pPg=p
13fd0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
13fe0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
13ff0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
14000 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
14010 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
14020 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
14030 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
14040 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
14050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14060 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
14070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
14080 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
14090 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
140a0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
140b0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
140c0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
140d0 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
140e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
140f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72   if( pPager->dir
14100 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20  tyCache==0 ){.  
14110 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20    /* Exit early 
14120 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74  (without doing t
14130 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e  he time-consumin
14140 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  g sqlite3OsSync(
14150 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20  ) calls).    ** 
14160 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
14170 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
14180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14190 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
141a0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
141b0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  ync==0 );.    rc
141c0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
141d0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
141e0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
141f0 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
14200 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
14210 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14220 6e 61 6c 4f 70 65 6e 20 29 3b 0a 23 69 66 20 30  nalOpen );.#if 0
14230 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  .  rc = syncJour
14240 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  nal(pPager, 0);.
14250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14260 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
14270 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
14280 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
14290 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
142a0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ges(pPager);.  i
142b0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 72 63  f( pPg ){.    rc
142c0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
142d0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
142e0 20 20 69 66 28 20 72 63 20 7c 7c 20 28 21 70 50    if( rc || (!pP
142f0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
14300 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
14310 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49  Pager->fd)!=SQLI
14320 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
14330 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
14340 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
14350 64 69 66 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  dif.  rc = sqlit
14360 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61  e3pager_sync(pPa
14370 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ger, 0);.  if( r
14380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14390 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
143a0 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20  abort;.  }.  rc 
143b0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
143c0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ock(pPager);.  p
143d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
143e0 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
143f0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
14400 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
14410 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74  s wrong during t
14420 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
14430 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61  s..  */.commit_a
14440 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c  bort:.  rc = sql
14450 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
14460 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
14470 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14480 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14490 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72  TE_FULL;.  }.  r
144a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
144b0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
144c0 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
144d0 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
144e0 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
144f0 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  D mode..** All i
14500 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
14510 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
14520 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
14530 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
14540 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
14550 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
14560 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
14570 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
14580 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
14590 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
145a0 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
145b0 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
145c0 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  l (SQLITE_PROTOC
145d0 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  OL) or unless so
145e0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
145f0 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
14600 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
14610 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
14620 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
14630 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
14640 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
14650 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
14660 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
14670 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
14680 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
14690 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
146a0 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
146b0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
146c0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
146d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
146e0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
146f0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
14700 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41    TRACE2("ROLLBA
14710 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  CK %d\n", pPager
14720 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70  ->fd.h);.  if( p
14730 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
14740 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
14750 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
14760 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  pAll; p; p=p->pN
14770 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
14780 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b  gHistory *pHist;
14790 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
147a0 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  p->alwaysRollbac
147b0 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  k );.      if( !
147c0 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  p->dirty ){.    
147d0 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
147e0 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
147f0 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
14800 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  er))->pOrig );. 
14810 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
14820 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
14830 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
14840 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29  Pager))->pStmt )
14850 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
14860 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ue;.      }..   
14870 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52     pHist = PGHDR
14880 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
14890 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
148a0 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
148b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
148c0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
148d0 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50  pHist->pOrig, pP
148e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
148f0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28  .        TRACE2(
14900 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25  "ROLLBACK-PAGE %
14910 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a  d\n", p->pgno);.
14920 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14930 20 20 20 20 20 54 52 41 43 45 32 28 22 50 41 47       TRACE2("PAG
14940 45 20 25 64 20 69 73 20 63 6c 65 61 6e 5c 6e 22  E %d is clean\n"
14950 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  , p->pgno);.    
14960 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48    }.      clearH
14970 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
14980 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20       p->dirty = 
14990 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f  0;.      p->inJo
149a0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
149b0 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a   p->inStmt = 0;.
149c0 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74        p->pPrevSt
149d0 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d  mt = p->pNextStm
149e0 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  t = 0;..      if
149f0 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
14a00 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ter ){.        p
14a10 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
14a20 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
14a30 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
14a40 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
14a50 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70      .    }.    p
14a60 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
14a70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
14a80 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
14a90 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d  rigDbSize;.    m
14aa0 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
14ab0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
14ac0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
14ad0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
14ae0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
14af0 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
14b00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14b10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
14b20 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61  rtyCache || !pPa
14b30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
14b40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
14b50 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
14b60 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
14b70 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
14b80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
14b90 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
14ba0 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26 26  r->errMask!=0 &&
14bb0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
14bc0 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  !=PAGER_ERR_FULL
14bd0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
14be0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
14bf0 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
14c00 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
14c10 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
14c20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
14c30 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
14c40 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
14c50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
14c60 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
14c70 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
14c80 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65     rc = pager_re
14c90 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
14ca0 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61  r);.    rc2 = pa
14cb0 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
14cc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
14cd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14ce0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
14cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
14d00 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
14d10 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
14d20 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   1);.  }.  if( r
14d30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14d40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14d50 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 70 50 61  CORRUPT;.    pPa
14d60 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
14d70 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
14d80 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  T;.  }.  pPager-
14d90 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
14da0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14db0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
14dc0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
14dd0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
14de0 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
14df0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
14e00 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
14e10 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
14e20 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
14e30 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e  e3pager_isreadon
14e40 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
14e50 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
14e60 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
14e70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14e80 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
14e90 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
14ea0 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
14eb0 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t *sqlite3pager_
14ec0 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  stats(Pager *pPa
14ed0 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
14ee0 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20  nt a[9];.  a[0] 
14ef0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  = pPager->nRef;.
14f00 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d    a[1] = pPager-
14f10 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d  >nPage;.  a[2] =
14f20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b   pPager->mxPage;
14f30 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
14f40 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d  ->dbSize;.  a[4]
14f50 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
14f60 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
14f70 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b  r->errMask;.  a[
14f80 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
14f90 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
14fa0 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
14fb0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66  ] = pPager->nOvf
14fc0 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  l;.  return a;.}
14fd0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14fe0 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
14ff0 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
15000 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
15010 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
15020 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
15030 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
15040 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
15050 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
15060 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
15070 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
15080 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
15090 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
150a0 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
150b0 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
150c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
150d0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
150e0 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65  _stmt_begin(Page
150f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
15100 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65  t rc;.  char zTe
15110 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
15120 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65  ME_SIZE];.  asse
15130 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
15140 74 49 6e 55 73 65 20 29 3b 0a 20 20 54 52 41 43  tInUse );.  TRAC
15150 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25  E2("STMT-BEGIN %
15160 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
15170 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  .h);.  if( pPage
15180 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
15190 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
151a0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
151b0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
151c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
151d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
151e0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  OK;.  }.  if( !p
151f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
15200 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  en ){.    pPager
15210 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
15220 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
15230 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
15240 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15250 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
15260 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
15270 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
15280 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
15290 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
152a0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d  Pager->aInStmt==
152b0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
152c0 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
152d0 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
152e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
152f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
15300 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
15310 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
15320 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
15330 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
15340 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
15350 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
15360 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
15370 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
15380 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 0a 20 20 20  tmtJSize == .   
15390 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f   pPager->nRec*JO
153a0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
153b0 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44  er) + JOURNAL_HD
153c0 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
153d0 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
153e0 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 0a 20 20 20  >stmtJSize =.   
153f0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a    pPager->nRec*J
15400 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
15410 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48  ger) + JOURNAL_H
15420 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
15430 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
15440 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
15450 7a 65 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ze;.  if( !pPage
15460 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
15470 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
15480 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54  ager_opentemp(zT
15490 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  emp, &pPager->st
154a0 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fd);.    if( rc 
154b0 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
154c0 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
154d0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
154e0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
154f0 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
15500 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
15510 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
15520 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15530 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
15540 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
15550 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
15560 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
15570 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
15580 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
15590 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
155a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
155b0 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
155c0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
155d0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
155e0 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
155f0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
15600 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
15610 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
15620 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43  *pNext;.    TRAC
15630 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
15640 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
15650 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20 21 70  d.h);.    if( !p
15660 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
15670 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
15680 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66  eek(&pPager->stf
15690 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20  d, 0);.      /* 
156a0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
156b0 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  e(&pPager->stfd,
156c0 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
156d0 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
156e0 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
156f0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
15700 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
15710 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
15720 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
15730 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
15740 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
15750 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73  xtStmt;.      as
15760 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d  sert( pPg->inStm
15770 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  t );.      pPg->
15780 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
15790 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
157a0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
157b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
157c0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
157d0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
157e0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
157f0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
15800 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
15810 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
15820 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
15830 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
15840 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
15850 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
15860 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20  tmtNRec = 0;.   
15870 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
15880 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
15890 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
158a0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
158b0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
158c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
158d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
158e0 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
158f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15900 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62  pager_stmt_rollb
15910 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
15920 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
15930 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
15940 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41  InUse ){.    TRA
15950 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41  CE2("STMT-ROLLBA
15960 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  CK %d\n", pPager
15970 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69 66 28  ->fd.h);.    if(
15980 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
15990 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
159a0 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  Pg;.      for(pP
159b0 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
159c0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
159d0 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20  NextStmt){.     
159e0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
159f0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
15a00 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
15a10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
15a20 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
15a30 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
15a40 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
15a50 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  ), pHist->pStmt,
15a60 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15a70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
15a80 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
15a90 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
15aa0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
15ab0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
15ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
15ad0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
15ae0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
15af0 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63       memoryTrunc
15b00 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
15b10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
15b20 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
15b30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73      rc = pager_s
15b40 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  tmt_playback(pPa
15b50 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
15b60 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
15b70 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
15b80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
15b90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15ba0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
15bb0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
15bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15bd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15be0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
15bf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15c00 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
15c10 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
15c20 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  filename(Pager *
15c30 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
15c40 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
15c50 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
15c60 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
15c70 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
15c80 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
15c90 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
15ca0 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67  ager_dirname(Pag
15cb0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
15cc0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44  eturn pPager->zD
15cd0 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a  irectory;.}../*.
15ce0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
15cf0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
15d00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
15d10 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
15d20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75  sqlite3pager_jou
15d30 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
15d40 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
15d50 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
15d60 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  al;.}../*.** Set
15d70 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
15d80 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
15d90 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
15da0 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65  et_codec(.  Page
15db0 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
15dc0 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64  d (*xCodec)(void
15dd0 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
15de0 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
15df0 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72  cArg.){.  pPager
15e00 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65  ->xCodec = xCode
15e10 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  c;.  pPager->pCo
15e20 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41  decArg = pCodecA
15e30 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rg;.}../*.** Thi
15e40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15e50 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
15e60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15e70 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
15e80 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
15e90 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
15ea0 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
15eb0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
15ec0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
15ed0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
15ee0 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b  {.  void *pPage;
15ef0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72  .  PgHdr *pPgHdr
15f00 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  ;.  u32 change_c
15f10 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63  ounter;.  int rc
15f20 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  ;..  /* Open pag
15f30 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
15f40 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
15f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
15f60 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
15f70 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66  1, &pPage);.  if
15f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15f90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
15fa0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
15fb0 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
15fc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15fd0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
15fe0 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63  .  /* Read the c
15ff0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20  urrent value at 
16000 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50  byte 24. */.  pP
16010 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50  gHdr = DATA_TO_P
16020 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63  GHDR(pPage);.  c
16030 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
16040 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70  retrieve32bits(p
16050 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f  PgHdr, 24);..  /
16060 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
16070 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
16080 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
16090 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
160a0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
160b0 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69  r++;.  store32bi
160c0 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  ts(change_counte
160d0 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a  r, pPgHdr, 24);.
160e0 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68  .  /* Release th
160f0 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
16100 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61  . */.  sqlite3pa
16110 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
16120 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16130 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
16140 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
16150 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
16160 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
16170 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
16180 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
16190 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
161a0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
161b0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
161c0 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
161d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
161e0 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
161f0 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
16200 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
16210 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
16220 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
16230 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
16240 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16250 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
16260 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
16270 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72   synced, all dir
16280 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ty pages written
16290 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
162a0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
162b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
162c0 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20  ynced. The only 
162d0 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65  thing that.** re
162e0 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
162f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16300 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
16310 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
16320 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  r.** master jour
16330 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
16340 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
16350 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
16360 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
16370 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
16380 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
16390 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
163a0 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  an sqlite3pager_
163b0 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  sync() call..*/.
163c0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
163d0 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  _sync(Pager *pPa
163e0 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
163f0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
16400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16410 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
16420 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
16430 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
16440 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
16450 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
16460 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
16470 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
16480 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
16490 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
164a0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
164b0 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 70 50  ER_SYNCED && !pP
164c0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
164d0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
164e0 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
164f0 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
16500 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16510 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 72 63 20  Open );..    rc 
16520 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
16530 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
16540 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
16550 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
16560 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20   sync_exit;..   
16570 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
16580 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20  rnal file */.   
16590 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
165a0 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
165b0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
165c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
165d0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20   sync_exit;..   
165e0 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
165f0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
16600 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
16610 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
16620 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
16630 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
16640 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
16650 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
16660 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16670 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
16680 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20  sync_exit;..    
16690 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
166a0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
166b0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
166c0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
166d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
166e0 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  c(&pPager->fd);.
166f0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
16700 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
16710 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79  _SYNCED;.  }..sy
16720 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  nc_exit:.  retur
16730 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  n rc;.}..#if def
16740 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
16750 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
16760 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
16770 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
16780 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
16790 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
167a0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
167b0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
167c0 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
167d0 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
167e0 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
167f0 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
16800 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
16810 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
16820 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
16830 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
16840 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
16850 61 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70  ager->fd.locktyp
16860 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  e;.}.#endif..#if
16870 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16880 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
16890 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
168a0 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
168b0 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
168c0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
168d0 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28  e3pager_refdump(
168e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
168f0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
16900 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
16910 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
16920 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
16930 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
16940 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
16950 20 20 20 20 70 72 69 6e 74 66 28 22 50 41 47 45      printf("PAGE
16960 20 25 33 64 20 61 64 64 72 3d 30 78 25 30 38 78   %3d addr=0x%08x
16970 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
16980 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
16990 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41  (int)PGHDR_TO_DA
169a0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
169b0 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
169c0 66 0a                                            f.