/ Hex Artifact Content
Login

Artifact a43e2a392be51966129e9afb18b81551c9f222b8:


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 37  : pager.c,v 1.17
0350: 32 20 32 30 30 34 2f 31 31 2f 30 34 20 31 34 3a  2 2004/11/04 14:
0360: 33 30 3a 30 35 20 64 61 6e 69 65 6c 6b 31 39 37  30:05 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0380: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0390: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
03a0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03b0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03c0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03d0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03e0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03f0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0400: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0410: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0420: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
0430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
0440: 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66  ugPrintf(X).#def
0450: 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 20  ine TRACE2(X,Y) 
0460: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
0470: 50 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66  Printf(X,Y).#def
0480: 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a  ine TRACE3(X,Y,Z
0490: 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  )   sqlite3Debug
04a0: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23 64  Printf(X,Y,Z).#d
04b0: 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59  efine TRACE4(X,Y
04c0: 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62  ,Z,W) sqlite3Deb
04d0: 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57  ugPrintf(X,Y,Z,W
04e0: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
04f0: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0500: 65 20 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  e TRACE2(X,Y).#d
0510: 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59  efine TRACE3(X,Y
0520: 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  ,Z).#define TRAC
0530: 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 65 6e 64  E4(X,Y,Z,W).#end
0540: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  if.../*.** The p
0550: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0560: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0570: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0580: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0590: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
05a0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
05b0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
05c0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
05d0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0600: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
0610: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0630: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0640: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0650: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0670: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0680: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
0690: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
06a0: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
06b0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
06c0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
06d0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
06e0: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
06f0: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0700: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
0710: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0720: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0730: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0740: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0760: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0770: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0780: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0790: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
07a0: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
07b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
07c0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
07f0: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
0800: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
0810: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0830: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0840: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0850: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0860: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0870: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0880: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0890: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
08a0: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
08c0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
08d0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
08e0: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0910: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0920: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0930: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0940: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0950: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0970: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0980: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0990: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
09c0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
09d0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
09e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
09f0: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0a00: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0a10: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0a20: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0a30: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0a40: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0a50: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0a80: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0a90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0aa0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ac0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0ad0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0ae0: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0b10: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0b20: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74 68   is to remove th
0b30: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0b40: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
0b50: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0b60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
0b70: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
0b90: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0ba0: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0bb0: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0bc0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0bd0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0be0: 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 6f  te3pager_get() o
0bf0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0c00: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0c10: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0c20: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0c30: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0c40: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0c50: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0c60: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0c70: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0c80: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0c90: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0ca0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 70 61 67   that sqlite3pag
0cb0: 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61  er_write() is ca
0cc0: 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20  lled, the state 
0cd0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a  transitions to.*
0ce0: 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
0cf0: 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71  .  (Note that sq
0d00: 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28  lite_page_write(
0d10: 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a  ) can only be.**
0d20: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75   called on an ou
0d30: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77  tstanding page w
0d40: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
0d50: 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a  the pager must.*
0d60: 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48  * be in PAGER_SH
0d70: 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74  ARED before it t
0d80: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41  ransitions to PA
0d90: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a  GER_RESERVED.).*
0da0: 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  * The transition
0db0: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
0dc0: 49 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20  IVE occurs when 
0dd0: 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
0de0: 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74  es.** are made t
0df0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
0e00: 69 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73  ile.  After an s
0e10: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
0e20: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
0e30: 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite_pager_commit
0e40: 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f  (), the state go
0e50: 65 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  es back to PAGER
0e60: 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66  _SHARED..*/.#def
0e70: 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  ine PAGER_UNLOCK
0e80: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
0e90: 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20  PAGER_SHARED    
0ea0: 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    1   /* same as
0eb0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a   SHARED_LOCK */.
0ec0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45  #define PAGER_RE
0ed0: 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a  SERVED    2   /*
0ee0: 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56 45   same as RESERVE
0ef0: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
0f00: 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  e PAGER_EXCLUSIV
0f10: 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20  E   4   /* same 
0f20: 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  as EXCLUSIVE_LOC
0f30: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
0f40: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35  ER_SYNCED      5
0f50: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ../*.** If the S
0f60: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52  QLITE_BUSY_RESER
0f70: 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69  VED_LOCK macro i
0f80: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61 74  s set to true at
0f90: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a   compile-time,.*
0fa0: 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74  * then failed at
0fb0: 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20  tempts to get a 
0fc0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69  reserved lock wi
0fd0: 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ll invoke the bu
0fe0: 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  sy callback..** 
0ff0: 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20 64  This is off by d
1000: 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20  efault.  To see 
1010: 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  why, consider th
1020: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e  e following scen
1030: 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70  ario:.** .** Sup
1040: 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61 6c  pose thread A al
1050: 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61 72  ready has a shar
1060: 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74  ed lock and want
1070: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
1080: 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61  k..** Thread B a
1090: 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 73  lready has a res
10a0: 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77  erved lock and w
10b0: 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76  ants an exclusiv
10c0: 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62  e lock.  If.** b
10d0: 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65 20  oth threads are 
10e0: 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73 79  using their busy
10f0: 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d   callbacks, it m
1100: 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74  ight be a long t
1110: 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e  ime.** be for on
1120: 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64 73  e of the threads
1130: 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c   give up and all
1140: 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f  ows the other to
1150: 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74   proceed..** But
1160: 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20 74   if the thread t
1170: 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65  rying to get the
1180: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67   reserved lock g
1190: 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a  ives up quickly.
11a0: 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72 20  ** (if it never 
11b0: 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79  invokes its busy
11c0: 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20   callback) then 
11d0: 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77  the contention w
11e0: 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76  ill be.** resolv
11f0: 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23  ed quickly..*/.#
1200: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55  ifndef SQLITE_BU
1210: 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
1220: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1230: 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
1240: 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OCK 0.#endif../*
1250: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72  .** This macro r
1260: 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20  ounds values up 
1270: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 76  so that if the v
1280: 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72 65  alue is an addre
1290: 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72  ss it.** is guar
12a0: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20  anteed to be an 
12b0: 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73 20  address that is 
12c0: 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d  aligned to an 8-
12d0: 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a  byte boundary..*
12e0: 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f  /.#define FORCE_
12f0: 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28  ALIGNMENT(X)   (
1300: 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a  ((X)+7)&~7)../*.
1310: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
1320: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
1330: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
1340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
1350: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
1360: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
1370: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
1380: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
1390: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
13a0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
13b0: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
13c0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
13d0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
13e0: 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75  Client code shou
13f0: 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 70  ld call sqlite3p
1400: 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20  ager_write() on 
1410: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1420: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1430: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1440: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1450: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1460: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a  3pager_write().*
1470: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  * is called, the
1480: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
1490: 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74  ontents are writ
14a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c  ten into the rol
14b0: 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  lback.** journal
14c0: 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75   and PgHdr.inJou
14d0: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e  rnal and PgHdr.n
14e0: 65 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e  eedSync are set.
14f0: 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a    Later, once.**
1500: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67   the journal pag
1510: 65 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e  e has made it on
1520: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
1530: 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53  ace, PgHdr.needS
1540: 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  ync.** is cleare
1550: 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64  d.  The modified
1560: 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20   page cannot be 
1570: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
1580: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a  o the original.*
1590: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
15a0: 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61  until the journa
15b0: 6c 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e  l pages has been
15c0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
15d0: 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72  and the.** PgHdr
15e0: 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65  .needSync has be
15f0: 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  en cleared..**.*
1600: 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74  * The PgHdr.dirt
1610: 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68  y flag is set wh
1620: 65 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  en sqlite3pager_
1630: 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  write() is calle
1640: 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61  d and.** is clea
1650: 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74  red again when t
1660: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1670: 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
1680: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  to the original.
1690: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16a0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
16b0: 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72 3b  uct PgHdr PgHdr;
16c0: 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a  .struct PgHdr {.
16d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
1700: 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65   which this page
1710: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67   belongs */.  Pg
1720: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1740: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1750: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
1760: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48  .  PgHdr *pNextH
1770: 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b  ash, *pPrevHash;
1780: 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73    /* Hash collis
1790: 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67  ion chain for Pg
17a0: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67  Hdr.pgno */.  Pg
17b0: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
17c0: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
17d0: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
17e0: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
17f0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1800: 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tAll;           
1810: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
1820: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
1830: 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74  PgHdr *pNextStmt
1840: 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f  , *pPrevStmt;  /
1850: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
1860: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
1870: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
1880: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18a0: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
18b0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
18c0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74  nal */.  u8 inSt
18d0: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
18e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
18f0: 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  if in the statem
1900: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
1910: 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20 20  /.  u8 dirty;   
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65     /* TRUE if we
1940: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 62   need to write b
1950: 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ack changes */. 
1960: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20  /* Sync journal 
1990: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
19a0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
19b0: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b   alwaysRollback;
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d0: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
19e0: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73  lback() for this
19f0: 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74   page */.  short
1a00: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a20: 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20  ber of users of 
1a30: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
1a40: 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20  gHdr *pDirty;   
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a60: 20 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72   Dirty pages sor
1a70: 74 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e  ted by PgHdr.pgn
1a80: 6f 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  o */.  /* pPager
1a90: 2d 3e 70 73 41 6c 69 67 6e 65 64 20 62 79 74 65  ->psAligned byte
1aa0: 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66  s of page data f
1ab0: 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65  ollow this heade
1ac0: 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e  r */.  /* Pager.
1ad0: 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
1ae0: 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f  local data follo
1af0: 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  w the page data 
1b00: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
1b10: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
1b20: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
1b30: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
1b40: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
1b50: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
1b60: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
1b70: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
1b80: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
1b90: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
1ba0: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
1bb0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
1bc0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1bd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
1be0: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
1bf0: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
1c00: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
1c10: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1c20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
1c30: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
1c40: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
1c50: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
1c60: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
1c70: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
1c80: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
1c90: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
1ca0: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
1cb0: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
1cc0: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
1cd0: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
1ce0: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
1cf0: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
1d00: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
1d10: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
1d20: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
1d30: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
1d40: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
1d50: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
1d60: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
1d70: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
1d80: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
1d90: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
1da0: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
1db0: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
1dc0: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
1dd0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
1de0: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
1df0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
1e00: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
1e10: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
1e20: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
1e30: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
1e40: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
1e50: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
1e60: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
1e70: 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c  efine CODEC(P,D,
1e80: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
1e90: 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  ec ){ P->xCodec(
1ea0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
1eb0: 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64  ,X); }.#else.# d
1ec0: 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c  efine CODEC(P,D,
1ed0: 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  N,X).#endif../*.
1ee0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
1ef0: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
1f00: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
1f10: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
1f20: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
1f30: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
1f40: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
1f50: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
1f60: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
1f70: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
1f80: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
1f90: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
1fa0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
1fb0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
1fc0: 31 5d 29 29 5b 28 50 29 2d 3e 70 73 41 6c 69 67  1]))[(P)->psAlig
1fd0: 6e 65 64 5d 29 0a 23 64 65 66 69 6e 65 20 50 47  ned]).#define PG
1fe0: 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47  HDR_TO_HIST(P,PG
1ff0: 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20  R)  \.          
2000: 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26    ((PgHistory*)&
2010: 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d  ((char*)(&(P)[1]
2020: 29 29 5b 28 50 47 52 29 2d 3e 70 73 41 6c 69 67  ))[(PGR)->psAlig
2030: 6e 65 64 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72  ned+(PGR)->nExtr
2040: 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62  a])../*.** How b
2050: 69 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ig to make the h
2060: 61 73 68 20 74 61 62 6c 65 20 75 73 65 64 20 66  ash table used f
2070: 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d  or locating in-m
2080: 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20 62  emory pages.** b
2090: 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
20a0: 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48  /.#define N_PG_H
20b0: 41 53 48 20 32 30 34 38 0a 0a 2f 2a 0a 2a 2a 20  ASH 2048../*.** 
20c0: 48 61 73 68 20 61 20 70 61 67 65 20 6e 75 6d 62  Hash a page numb
20d0: 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61  er.*/.#define pa
20e0: 67 65 72 5f 68 61 73 68 28 50 4e 29 20 20 28 28  ger_hash(PN)  ((
20f0: 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48 2d 31  PN)&(N_PG_HASH-1
2100: 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  ))../*.** A open
2110: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
2120: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2130: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2140: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
2150: 20 50 61 67 65 72 20 7b 0a 20 20 63 68 61 72 20   Pager {.  char 
2160: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
2170: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2180: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2190: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
21a0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
21b0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
21c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
21e0: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
21f0: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
2200: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
2210: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2220: 2f 0a 20 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a  /.  OsFile fd, j
2230: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
2240: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
2250: 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65  ors for database
2260: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   and journal */.
2270: 20 20 4f 73 46 69 6c 65 20 73 74 66 64 3b 20 20    OsFile stfd;  
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2290: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
22a0: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
22b0: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a  nt subjournal*/.
22c0: 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20    int dbSize;   
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
22f0: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   in the file */.
2300: 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65    int origDbSize
2310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2320: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
2330: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
2340: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53  e */.  int stmtS
2350: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2360: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
2370: 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73  tabase (in pages
2380: 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  ) at stmt_begin(
2390: 29 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  ) */.  i64 stmtJ
23a0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
23b0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
23c0: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
23d0: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  gin() */.  int n
23e0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
23f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2400: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
2410: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2420: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
2430: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
2440: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
2450: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
2460: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
2470: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65  */.  int stmtNRe
2480: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2490: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
24a0: 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75  cords in stmt su
24b0: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  bjournal */.  in
24c0: 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  t nExtra;       
24d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
24e0: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
24f0: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2500: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69  ry page */.  voi
2510: 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29  d (*xDestructor)
2520: 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20  (void*,int); /* 
2530: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
2540: 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70  e when freeing p
2550: 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  ages */.  void (
2560: 2a 78 52 65 69 6e 69 74 65 72 29 28 76 6f 69 64  *xReiniter)(void
2570: 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c  *,int);   /* Cal
2580: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
2590: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
25a0: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  ges */.  int pag
25b0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
25c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25d0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
25e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 73 41 6c 69  e */.  int psAli
25f0: 67 6e 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  gned;           
2600: 20 20 20 2f 2a 20 70 61 67 65 53 69 7a 65 20 72     /* pageSize r
2610: 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 61 20 6d  ounded up to a m
2620: 75 6c 74 69 70 6c 65 20 6f 66 20 38 20 2a 2f 0a  ultiple of 8 */.
2630: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2650: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2660: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
2670: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
26a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
26b0: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
26c0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
26d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26e0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
26f0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
2700: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
2710: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
2720: 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f  ss, nOvfl;     /
2730: 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69  * Cache hits, mi
2740: 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f  ssing, and LRU o
2750: 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 76 6f  verflows */.  vo
2760: 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
2770: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
2780: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
2790: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
27a0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
27b0: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
27c0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
27d0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
27e0: 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  () */.  u8 journ
27f0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
2800: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
2810: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
2820: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
2830: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2840: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2850: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2860: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2870: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2880: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
28a0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
28b0: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
28c0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
28d0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
28e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
28f0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
2900: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
2910: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2930: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
2940: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
2950: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
2960: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
2970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2980: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
2990: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
29a0: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
29b0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29d0: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
29e0: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
29f0: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
2a00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2a10: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
2a20: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
2a30: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
2a40: 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b  s */.  u8 state;
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
2a70: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
2a80: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
2a90: 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20    u8 errMask;   
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ab0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
2ac0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
2ad0: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
2ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2af0: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
2b00: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2b10: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
2b20: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
2b30: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
2b40: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
2b50: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ase */.  u8 need
2b60: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2b70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b80: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
2b90: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
2ba0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
2bb0: 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  yCache;         
2bc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2bd0: 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76  cached pages hav
2be0: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
2bf0: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
2c00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
2c10: 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  sable dont_rollb
2c20: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
2c30: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
2c40: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2c50: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2c60: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
2c70: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61 49   I/O */.  u8 *aI
2c80: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
2c90: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2ca0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2cb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2cc0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
2cd0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
2ce0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2cf0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2d00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2d10: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d30: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
2d40: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
2d50: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
2d60: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
2d70: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
2d80: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2d90: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
2da0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
2db0: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
2dc0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
2dd0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
2de0: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
2df0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2e00: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
2e10: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
2e20: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
2e30: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2e40: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
2e50: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
2e60: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
2e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2e80: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2e90: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
2ea0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
2eb0: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
2ec0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2ed0: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e  t byte offset in
2ee0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ef0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
2f00: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
2f10: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
2f20: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
2f30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
2f40: 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66    i64 stmtHdrOff
2f50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f60: 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   First journal h
2f70: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 68  eader written th
2f80: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
2f90: 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b    i64 stmtCksum;
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fb0: 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20   cksumInit when 
2fc0: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
2fd0: 61 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  arted */.  int s
2fe0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
2ff0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3000: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3010: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3020: 0a 20 20 50 67 48 64 72 20 2a 61 48 61 73 68 5b  .  PgHdr *aHash[
3030: 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f  N_PG_HASH];    /
3040: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20  * Hash table to 
3050: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
3060: 74 6f 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a  to PgHdr */.};..
3070: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
3080: 62 69 74 73 20 74 68 61 74 20 63 61 6e 20 62 65  bits that can be
3090: 20 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72   set in Pager.er
30a0: 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e  rMask..*/.#defin
30b0: 65 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  e PAGER_ERR_FULL
30c0: 20 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20       0x01  /* a 
30d0: 77 72 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a  write() failed *
30e0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
30f0: 45 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30  ERR_MEM      0x0
3100: 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66  2  /* malloc() f
3110: 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ailed */.#define
3120: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
3130: 20 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72      0x04  /* err
3140: 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  or in the lockin
3150: 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64  g protocol */.#d
3160: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
3170: 43 4f 52 52 55 50 54 20 20 30 78 30 38 20 20 2f  CORRUPT  0x08  /
3180: 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f  * database or jo
3190: 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
31a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
31b0: 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30  R_ERR_DISK     0
31c0: 78 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20  x10  /* general 
31d0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d  disk I/O error -
31e0: 20 62 61 64 20 68 61 72 64 20 64 72 69 76 65 3f   bad hard drive?
31f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e   */../*.** Journ
3200: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
3210: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
3220: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
3230: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
3240: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
3250: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
3260: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
3270: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
3280: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
3290: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
32a0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
32b0: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
32c0: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
32d0: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
32e0: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
32f0: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
3300: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
3310: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
3320: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
3330: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
3340: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
3350: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
3360: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
3370: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
3380: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
3390: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
33a0: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
33b0: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
33c0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
33d0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
33e0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
33f0: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3400: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3410: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
3420: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3430: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3440: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
3450: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3460: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
3470: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3480: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
3490: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
34a0: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
34b0: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
34c0: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
34d0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
34e0: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
34f0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3500: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3510: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3520: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3530: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3540: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3550: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3560: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
3570: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
3580: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
3590: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
35a0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
35b0: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
35c0: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
35d0: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
35e0: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
35f0: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3600: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3610: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3620: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3630: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3640: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3650: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3660: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
3670: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
3680: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
3690: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
36a0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
36b0: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
36c0: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
36d0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
36e0: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
36f0: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3700: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3710: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3720: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
3730: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
3740: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
3750: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
3760: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
3770: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
3780: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
3790: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
37a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
37b0: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
37c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
37d0: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
37e0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
37f0: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
3800: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
3810: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
3820: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
3830: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3840: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
3850: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
3860: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
3870: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
3880: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
3890: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
38a0: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
38b0: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
38c0: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
38d0: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
38e0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
38f0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
3900: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
3910: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
3920: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
3930: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
3940: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
3950: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
3960: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
3970: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
3980: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
3990: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
39a0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
39b0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
39c0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
39d0: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
39e0: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
39f0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
3a00: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
3a10: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
3a20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
3a30: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
3a40: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
3a50: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
3a60: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
3a70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
3a80: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66   default size of
3a90: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a   a disk sector.*
3aa0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
3ab0: 53 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a  SECTOR_SIZE 512.
3ac0: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62  ./*.** Page numb
3ad0: 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  er PAGER_MJ_PGNO
3ae0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69   is never used i
3af0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
3b00: 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72  base (it is.** r
3b10: 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b  eserved for work
3b20: 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e  ing around a win
3b30: 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d  dows/posix incom
3b40: 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20  patibility). It 
3b50: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68  is.** used in th
3b60: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67  e journal to sig
3b70: 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  nify that the re
3b80: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
3b90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
3ba0: 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74  is devoted to st
3bb0: 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  oring a master j
3bc0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68  ournal name - th
3bd0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
3be0: 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  pages to.** roll
3bf0: 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65   back. See comme
3c00: 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  nts for function
3c10: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
3c20: 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nal() for detail
3c30: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  s..*/.#define PA
3c40: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
3c50: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
3c60: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 0a 0a 2f  )->pageSize))../
3c70: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65  *.** Enable refe
3c80: 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63  rence count trac
3c90: 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67  king (for debugg
3ca0: 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69  ing) here:.*/.#i
3cb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3cc0: 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65  .  int pager3_re
3cd0: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30  finfo_enable = 0
3ce0: 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  ;.  static void 
3cf0: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67  pager_refinfo(Pg
3d00: 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61  Hdr *p){.    sta
3d10: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
3d20: 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72 33  .    if( !pager3
3d30: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
3d40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
3d50: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
3d60: 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e 54  (.       "REFCNT
3d70: 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52  : %4d addr=%p nR
3d80: 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ef=%d\n",.      
3d90: 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f   p->pgno, PGHDR_
3da0: 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e  TO_DATA(p), p->n
3db0: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
3dc0: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
3dd0: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
3de0: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
3df0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
3e00: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
3e10: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
3e20: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
3e30: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
3e40: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
3e50: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
3e60: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
3e70: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
3e80: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
3e90: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
3ea0: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
3eb0: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
3ec0: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
3ed0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
3ee0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
3ef0: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
3f00: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
3f10: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
3f20: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
3f30: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
3f40: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
3f50: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
3f60: 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72 63  32 res;.  int rc
3f70: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
3f80: 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65 73 2c  OsRead(fd, &res,
3f90: 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20   sizeof(res));. 
3fa0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3fb0: 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  OK ){.    unsign
3fc0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
3fd0: 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72     memcpy(ac, &r
3fe0: 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20  es, 4);.    res 
3ff0: 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20  = (ac[0]<<24) | 
4000: 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61  (ac[1]<<16) | (a
4010: 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d  c[2]<<8) | ac[3]
4020: 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
4030: 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  res;.  return rc
4040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
4050: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4060: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
4070: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4080: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4090: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
40a0: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
40b0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
40c0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
40d0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
40e0: 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64  2bits(OsFile *fd
40f0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e  , u32 val){.  un
4100: 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34  signed char ac[4
4110: 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61  ];.  ac[0] = (va
4120: 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20  l>>24) & 0xff;. 
4130: 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31   ac[1] = (val>>1
4140: 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  6) & 0xff;.  ac[
4150: 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20  2] = (val>>8) & 
4160: 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20  0xff;.  ac[3] = 
4170: 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72 65  val & 0xff;.  re
4180: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
4190: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a  ite(fd, ac, 4);.
41a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  }../*.** Write t
41b0: 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  he 32-bit intege
41c0: 72 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65  r 'val' into the
41d0: 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64   page identified
41e0: 20 62 79 20 70 61 67 65 20 68 65 61 64 65 72 0a   by page header.
41f0: 2a 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65 74  ** 'p' at offset
4200: 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74   'offset'..*/.st
4210: 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33  atic void store3
4220: 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50  2bits(u32 val, P
4230: 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66  gHdr *p, int off
4240: 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  set){.  unsigned
4250: 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20   char *ac;.  ac 
4260: 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68  = &((unsigned ch
4270: 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  ar*)PGHDR_TO_DAT
4280: 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20  A(p))[offset];. 
4290: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
42a0: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  4) & 0xff;.  ac[
42b0: 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26  1] = (val>>16) &
42c0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d   0xff;.  ac[2] =
42d0: 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66   (val>>8) & 0xff
42e0: 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20  ;.  ac[3] = val 
42f0: 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  & 0xff;.}../*.**
4300: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4310: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
4320: 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74   'offset' from t
4330: 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
4340: 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65  ed by.** page he
4350: 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61  ader 'p'..*/.sta
4360: 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65  tic u32 retrieve
4370: 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c  32bits(PgHdr *p,
4380: 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20   int offset){.  
4390: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
43a0: 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73  c;.  ac = &((uns
43b0: 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44  igned char*)PGHD
43c0: 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66  R_TO_DATA(p))[of
43d0: 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20  fset];.  return 
43e0: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
43f0: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
4400: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
4410: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
4420: 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
4430: 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  e pPager->errMas
4440: 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70  k into an approp
4450: 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63  rate.** return c
4460: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
4470: 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  nt pager_errcode
4480: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
4490: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
44a0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
44b0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
44c0: 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20  AGER_ERR_LOCK ) 
44d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
44e0: 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70  ROTOCOL;.  if( p
44f0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
4500: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20   PAGER_ERR_DISK 
4510: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
4520: 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70 50  _IOERR;.  if( pP
4530: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
4540: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29  PAGER_ERR_FULL )
4550: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4560: 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67  FULL;.  if( pPag
4570: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4580: 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20  GER_ERR_MEM )   
4590: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
45a0: 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  MEM;.  if( pPage
45b0: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
45c0: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29  ER_ERR_CORRUPT )
45d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
45e0: 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72  RUPT;.  return r
45f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  c;.}../*.** When
4600: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
4610: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4620: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
4630: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
4640: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
4650: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
4660: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
4670: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
4680: 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e   and .** written
4690: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
46a0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
46b0: 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61  eMalloc(). *pzMa
46c0: 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74  ster is.** set t
46d0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d  o point at the m
46e0: 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
46f0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
4700: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
4710: 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70   sqliteFree() *p
4720: 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  zMaster..**.** I
4730: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
4740: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
4750: 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74   present *pzMast
4760: 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  er is set to 0 a
4770: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
4780: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
4790: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
47a0: 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65  erJournal(OsFile
47b0: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a   *pJrnl, char **
47c0: 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  pzMaster){.  int
47d0: 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a   rc;.  u32 len;.
47e0: 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32    i64 szJ;.  u32
47f0: 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b   cksum;.  int i;
4800: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4810: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
4820: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
4830: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
4840: 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72   */..  *pzMaster
4850: 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71   = 0;..  rc = sq
4860: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
4870: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20  pJrnl, &szJ);.  
4880: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4890: 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65  K || szJ<16 ) re
48a0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
48b0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
48c0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20  Jrnl, szJ-16);. 
48d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
48e0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
48f0: 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62   .  rc = read32b
4900: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29  its(pJrnl, &len)
4910: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
4920: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
4930: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
4940: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b  2bits(pJrnl, &ck
4950: 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
4960: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
4970: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
4980: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
4990: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a  nl, aMagic, 8);.
49a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
49b0: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
49c0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
49d0: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
49e0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
49f0: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
4a00: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20  , szJ-16-len);. 
4a10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4a20: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
4a30: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28  .  *pzMaster = (
4a40: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
4a50: 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66  loc(len+1);.  if
4a60: 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a  ( !*pzMaster ){.
4a70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4a80: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
4a90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
4aa0: 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74  d(pJrnl, *pzMast
4ab0: 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  er, len);.  if( 
4ac0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
4ad0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4ae0: 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  *pzMaster);.    
4af0: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  *pzMaster = 0;. 
4b00: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
4b10: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
4b20: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
4b30: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
4b40: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
4b50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
4b60: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
4b70: 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b   -= (*pzMaster)[
4b80: 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  i];.  }.  if( ck
4b90: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
4ba0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
4bb0: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
4bc0: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
4bd0: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
4be0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
4bf0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
4c00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
4c10: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
4c20: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
4c30: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
4c40: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
4c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4c60: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
4c70: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
4c80: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
4c90: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
4ca0: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
4cb0: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
4cc0: 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 28 2a  er = 0;.  }.  (*
4cd0: 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d  pzMaster)[len] =
4ce0: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
4cf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
4d10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
4d20: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
4d30: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
4d40: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
4d50: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
4d60: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
4d70: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
4d80: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
4d90: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
4da0: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
4db0: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
4dc0: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
4dd0: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
4de0: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
4df0: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
4e00: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
4e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
4e30: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
4e40: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
4e50: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
4e60: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
4e70: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
4e80: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
4e90: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
4ea0: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
4eb0: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ** .*/.static in
4ec0: 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  t seekJournalHdr
4ed0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
4ee0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
4ef0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
4f00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
4f10: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
4f20: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
4f30: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
4f40: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
4f50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
4f60: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
4f70: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
4f80: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4f90: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
4fa0: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
4fb0: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
4fc0: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
4fd0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
4fe0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
4ff0: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72  ff = offset;.  r
5000: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53  eturn sqlite3OsS
5010: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
5020: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
5030: 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lOff);.}../*.** 
5040: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
5050: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
5060: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
5070: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
5080: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
5090: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
50a0: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
50b0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
50c0: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
50d0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
50e0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
50f0: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
5100: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
5110: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
5120: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
5130: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
5140: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
5150: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
5160: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
5170: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
5180: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
5190: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
51a0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
51b0: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
51c0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
51d0: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
51e0: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
51f0: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
5200: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
5210: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
5220: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
5230: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
5240: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
5250: 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73  R_SZ - 24) bytes
5260: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
5270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5280: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
5290: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
52a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 65 65 6b  .  int rc = seek
52b0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
52c0: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
52d0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61  eturn rc;..  pPa
52e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
52f0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
5300: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 70 50 61 67  lOff;.  if( pPag
5310: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d  er->stmtHdrOff==
5320: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
5330: 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50  >stmtHdrOff = pP
5340: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
5350: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
5360: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
5370: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5380: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20  ger);..  /* FIX 
5390: 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50  ME: .  **.  ** P
53a0: 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61  ossibly for a pa
53b0: 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79  ger not in no-sy
53c0: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
53d0: 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c  rnal magic shoul
53e0: 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72  d not.  ** be wr
53f0: 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63  itten until nRec
5400: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73   is filled in as
5410: 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79   part of next sy
5420: 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20  ncJournal(). .  
5430: 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
5440: 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65   maybe the whole
5450: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5460: 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65  should be delaye
5470: 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a  d until that.  *
5480: 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61  * point. Think a
5490: 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  bout this..  */.
54a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
54b0: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
54c0: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
54d0: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
54e0: 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 69 66  alMagic));..  if
54f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 52  ){.    /* The nR
5510: 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46  ec Field. 0xFFFF
5520: 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63  FFFF for no-sync
5530: 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
5540: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
5550: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
5560: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
5570: 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
5580: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
5590: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
55a0: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
55b0: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
55c0: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20 20 73  aliser */ .    s
55d0: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
55e0: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
55f0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
5600: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
5610: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
5620: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5630: 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  fd, pPager->cksu
5640: 6d 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69 66  mInit);.  }.  if
5650: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5660: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  ){.    /* The in
5670: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
5680: 69 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ize */.    rc = 
5690: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
56a0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
56b0: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ->dbSize);.  }. 
56c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
56d0: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
56e0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
56f0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
5700: 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 63 20  ocess */.    rc 
5710: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
5720: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5730: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
5740: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  .  }..  /* The j
5750: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61  ournal header ha
5760: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73  s been written s
5770: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65  uccessfully. See
5780: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  k the journal.  
5790: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
57a0: 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
57b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
57c0: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
57d0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
57e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
57f0: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
5800: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5810: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20  journalOff-1);. 
5820: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
5830: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
5840: 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b  jfd, "\000", 1);
5850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
5870: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
5880: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
5890: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
58a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
58b0: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
58c0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
58d0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
58e0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
58f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
5900: 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d  * file. See comm
5910: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
5920: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
5930: 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63  Hdr() for a desc
5940: 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ription of.** th
5950: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
5960: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
5970: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
5980: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
5990: 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20  y, *nRec is set 
59a0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
59b0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
59c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
59d0: 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69  header and *dbSi
59e0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
59f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
5a00: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
5a10: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5a20: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
5a30: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
5a40: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
5a50: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
5a60: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
5a70: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
5a80: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
5a90: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
5aa0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
5ab0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
5ac0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
5ad0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
5ae0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
5af0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e   returned and *n
5b00: 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  Rec and *dbSize 
5b10: 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66  are not set.  If
5b20: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
5b30: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
5b40: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
5b50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
5b60: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
5b70: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
5b80: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
5b90: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
5ba0: 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a  pPager, .  i64 j
5bb0: 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33  ournalSize,.  u3
5bc0: 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32  2 *pNRec, .  u32
5bd0: 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69   *pDbSize.){.  i
5be0: 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
5bf0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
5c00: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
5c10: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
5c20: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20  header */..  rc 
5c30: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
5c40: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
5c50: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
5c60: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
5c70: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
5c80: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5c90: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
5ca0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5cb0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
5cc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
5cd0: 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ead(&pPager->jfd
5ce0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
5cf0: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
5d00: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5d10: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
5d20: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
5d30: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
5d40: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
5d50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
5d60: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
5d70: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
5d80: 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b  er->jfd, pNRec);
5d90: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
5da0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
5db0: 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65  ead32bits(&pPage
5dc0: 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
5dd0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
5de0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5df0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
5e00: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5e10: 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20  fd, pDbSize);.  
5e20: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
5e30: 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  rc;..  /* Update
5e40: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
5e50: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
5e60: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
5e70: 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72   by .  ** the pr
5e80: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
5e90: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
5ea0: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
5eb0: 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65   was.  ** create
5ec0: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
5ed0: 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
5ee0: 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
5ef0: 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65  utine.  ** is be
5f00: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
5f10: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
5f20: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
5f30: 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66  al value.  ** of
5f40: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
5f50: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
5f60: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
5f70: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
5f80: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5f90: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  (&pPager->jfd, (
5fa0: 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73  u32 *)&pPager->s
5fb0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
5fc0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
5fd0: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
5fe0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
5ff0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6000: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6010: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
6020: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
6030: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74  urnalOff);.  ret
6040: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
6050: 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
6060: 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
6070: 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
6080: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
6090: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
60a0: 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
60b0: 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
60c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
60d0: 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
60e0: 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
60f0: 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
6100: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
6110: 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
6120: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
6130: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
6140: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
6150: 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
6160: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
6170: 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
6180: 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
6190: 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
61a0: 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  .**.** + 4 bytes
61b0: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
61c0: 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c  .** + N bytes: l
61d0: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
61e0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
61f0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a   + 4 bytes: N.**
6200: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
6210: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
6220: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38  checksum..** + 8
6230: 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
6240: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
6250: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6260: 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
6270: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
6280: 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
6290: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
62a0: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
62b0: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
62c0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
62d0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
62e0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
62f0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e  nt rc;.  int len
6300: 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 75  ; .  int i; .  u
6310: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 0a 0a  32 cksum = 0; ..
6320: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
6330: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
6340: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
6350: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
6360: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
6370: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
6380: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
6390: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
63a0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
63b0: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
63c0: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
63d0: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
63e0: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
63f0: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
6400: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
6410: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6420: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
6430: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
6440: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
6450: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
6460: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
6470: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
6480: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
6490: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
64a0: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
64b0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
64c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
64d0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
64e0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
64f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c  journalOff += (l
6500: 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20  en+20);..  rc = 
6510: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
6520: 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f  ger->jfd, PAGER_
6530: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
6540: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
6550: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
6560: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
6570: 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
6580: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
6590: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
65a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
65b0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
65c0: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
65d0: 67 65 72 2d 3e 6a 66 64 2c 20 6c 65 6e 29 3b 0a  ger->jfd, len);.
65e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
65f0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6600: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
6610: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
6620: 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  d, cksum);.  if(
6630: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6640: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
6650: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6660: 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
6670: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
6680: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6690: 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65 72  agic));.  pPager
66a0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
66b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
66c0: 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d  /*.** Add or rem
66d0: 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ove a page from 
66e0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
66f0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69  pages that are i
6700: 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65  n the.** stateme
6710: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
6720: 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70  * The Pager keep
6730: 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73  s a separate lis
6740: 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  t of pages that 
6750: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
6760: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e  .** the statemen
6770: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73  t journal.  This
6780: 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74   helps the sqlit
6790: 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
67a0: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
67b0: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
67c0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
67d0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
67e0: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
67f0: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
6800: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
6810: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
6820: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
6830: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
6840: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
6850: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
6860: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
6870: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
6880: 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72   pPg->inStmt ) r
6890: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
68a0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d   pPg->pPrevStmt=
68b0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74  =0 && pPg->pNext
68c0: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67  Stmt==0 );.  pPg
68d0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
68e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
68f0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67  Stmt ){.    pPag
6900: 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76  er->pStmt->pPrev
6910: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Stmt = pPg;.  }.
6920: 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74    pPg->pNextStmt
6930: 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74   = pPager->pStmt
6940: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  ;.  pPager->pStm
6950: 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  t = pPg;.  pPg->
6960: 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74  inStmt = 1;.}.st
6970: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
6980: 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f  emove_from_stmt_
6990: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
69a0: 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  {.  if( !pPg->in
69b0: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
69c0: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53   if( pPg->pPrevS
69d0: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
69e0: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
69f0: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50  t->pNextStmt==pP
6a00: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
6a10: 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74  revStmt->pNextSt
6a20: 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
6a30: 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tmt;.  }else{.  
6a40: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
6a50: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50  Pager->pStmt==pP
6a60: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
6a70: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
6a80: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
6a90: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
6aa0: 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  xtStmt ){.    as
6ab0: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
6ac0: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d  Stmt->pPrevStmt=
6ad0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
6ae0: 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65  >pNextStmt->pPre
6af0: 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72  vStmt = pPg->pPr
6b00: 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50  evStmt;.  }.  pP
6b10: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
6b20: 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74  ;.  pPg->pPrevSt
6b30: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69  mt = 0;.  pPg->i
6b40: 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nStmt = 0;.}../*
6b50: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
6b60: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
6b70: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
6b80: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
6b90: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
6ba0: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
6bb0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
6bc0: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
6bd0: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
6be0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
6bf0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
6c00: 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48   *p = pPager->aH
6c10: 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70  ash[pager_hash(p
6c20: 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  gno)];.  while( 
6c30: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
6c40: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
6c50: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
6c60: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6c70: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
6c80: 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65  database and cle
6c90: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
6ca0: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
6cb0: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
6cc0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
6cd0: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
6ce0: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
6cf0: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
6d00: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
6d10: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
6d20: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
6d30: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
6d40: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
6d50: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
6d60: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
6d70: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
6d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
6d90: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
6da0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
6db0: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
6dc0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
6dd0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
6de0: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  g=pNext){.    pN
6df0: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
6e00: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
6e10: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
6e20: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
6e30: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
6e40: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a  irstSynced = 0;.
6e50: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
6e60: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
6e70: 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  All = 0;.  memse
6e80: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
6e90: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
6ea0: 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50  r->aHash));.  pP
6eb0: 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
6ec0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
6ed0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
6ee0: 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  RVED ){.    sqli
6ef0: 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
6f00: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
6f10: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
6f20: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  (&pPager->fd, NO
6f30: 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72  _LOCK);.  pPager
6f40: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
6f50: 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72  UNLOCK;.  pPager
6f60: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
6f70: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
6f80: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
6f90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
6fa0: 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
6fb0: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
6fc0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
6fd0: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
6fe0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
6ff0: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
7000: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
7010: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
7020: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
7030: 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20  ine releases.** 
7040: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
7050: 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  k and acquires a
7060: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20   SHARED lock in 
7070: 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20  its place.  The 
7080: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
7090: 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63  is deleted and c
70a0: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  losed..**.** TOD
70b0: 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70  O: Consider keep
70c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
70d0: 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65  file open for te
70e0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
70f0: 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74  s..** This might
7100: 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
7110: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  nce improvement 
7120: 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65  on windows where
7130: 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69   opening.** a fi
7140: 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69  le is an expensi
7150: 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ve operation..*/
7160: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
7170: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61  r_unwritelock(Pa
7180: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7190: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
71a0: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
71b0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
71c0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
71d0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
71e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
71f0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
7200: 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
7210: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
7220: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
7230: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
7240: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
7250: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
7260: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
7270: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
7280: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
7290: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
72a0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
72b0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67  ->jfd);.    pPag
72c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
72d0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
72e0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
72f0: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
7300: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
7310: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
7320: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
7330: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
7340: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
7350: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
7360: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
7370: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
7380: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
7390: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
73a0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
73b0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
73c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
73d0: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
73e0: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
73f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7400: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
7410: 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
7420: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
7430: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72  al==0 );.  }.  r
7440: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  c = sqlite3OsUnl
7450: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
7460: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
7470: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7480: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
7490: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
74a0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
74b0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
74c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
74d0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
74e0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
74f0: 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61  cksum for the pa
7500: 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a  ge of data..**.*
7510: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
7520: 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20  real checksum.  
7530: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
7540: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
7550: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
7560: 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ial value and th
7570: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  e page number.  
7580: 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20  We experimented 
7590: 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73  with.** a checks
75a0: 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  um of the entire
75b0: 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20   data, but that 
75c0: 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  was found to be 
75d0: 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20  too slow..**.** 
75e0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
75f0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f  ge number is sto
7600: 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e  red at the begin
7610: 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64  ning of data and
7620: 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d  .** the checksum
7630: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
7640: 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20  e end.  This is 
7650: 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a  important.  If j
7660: 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70  ournal.** corrup
7670: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
7680: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
7690: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
76a0: 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20  ely scenario.** 
76b0: 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
76c0: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
76d0: 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
76e0: 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20  be changed.  It 
76f0: 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20  is.** much less 
7700: 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
7710: 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
7720: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
7730: 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
7740: 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
7750: 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
7760: 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
7770: 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
7780: 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
7790: 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
77a0: 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
77b0: 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
77c0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d  ion..**.** FIX M
77d0: 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64  E:  Consider add
77e0: 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20  ing every 200th 
77f0: 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20  (or so) byte of 
7800: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a  the data to the.
7810: 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68  ** checksum.  Th
7820: 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67  at way if a sing
7830: 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20  le page spans 3 
7840: 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63  or more disk sec
7850: 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79  tors and.** only
7860: 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74   the middle sect
7870: 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77  or is corrupt, w
7880: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76  e will still hav
7890: 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a  e a reasonable.*
78a0: 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c  * chance of fail
78b0: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
78c0: 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74   and thus detect
78d0: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e  ing the problem.
78e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
78f0: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
7900: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
7910: 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  gno, const char 
7920: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
7930: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
7940: 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20  ksumInit;.  int 
7950: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
7960: 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c  Size-200;.  whil
7970: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
7980: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
7990: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
79a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
79b0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  m;.}../*.** Read
79c0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
79d0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
79e0: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
79f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
7a00: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
7a10: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
7a20: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
7a30: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
7a40: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
7a50: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
7a60: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
7a70: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
7a80: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
7a90: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
7aa0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
7ab0: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
7ac0: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
7ad0: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
7ae0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
7af0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50  yback_one_page(P
7b00: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73  ager *pPager, Os
7b10: 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75  File *jfd, int u
7b20: 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20  seCksum){.  int 
7b30: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
7b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7b50: 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
7b60: 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
7b70: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
7b80: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
7b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
7ba0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
7bb0: 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
7bc0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
7bf0: 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
7c00: 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20  hecking */.  u8 
7c10: 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41 58  aData[SQLITE_MAX
7c20: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a  _PAGE_SIZE];  /*
7c30: 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f   Temp storage fo
7c40: 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 72  r a page */..  r
7c50: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
7c60: 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  fd, &pgno);.  if
7c70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7c80: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
7c90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
7ca0: 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70  d(jfd, &aData, p
7cb0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
7cc0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7cd0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
7ce0: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
7cf0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
7d00: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
7d10: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
7d20: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
7d30: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
7d40: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
7d50: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
7d60: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
7d70: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
7d80: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
7d90: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
7da0: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
7db0: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
7dc0: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
7dd0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
7de0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
7df0: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
7e00: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
7e10: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
7e20: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
7e30: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
7e40: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
7e50: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
7e60: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
7e70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7e80: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
7e90: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
7ea0: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
7eb0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
7ec0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
7ed0: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
7ee0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
7ef0: 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d  bits(jfd, &cksum
7f00: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
7f10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
7f20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
7f30: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
7f40: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
7f50: 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29  er, pgno, aData)
7f60: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
7f70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
7f80: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
7f90: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
7fa0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
7fb0: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
7fc0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
7fd0: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
7fe0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
7ff0: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
8000: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
8010: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
8020: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
8030: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
8040: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
8050: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
8060: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
8070: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
8080: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
8090: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
80a0: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
80b0: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
80c0: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
80d0: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
80e0: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
80f0: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
8100: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
8110: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
8120: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
8130: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
8140: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67    */.  pPg = pag
8150: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
8160: 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
8170: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
8180: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
8190: 45 20 7c 7c 20 70 50 67 20 29 3b 0a 20 20 54 52  E || pPg );.  TR
81a0: 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE3("PLAYBACK %
81b0: 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  d page %d\n", pP
81c0: 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 67 6e 6f  ager->fd.h, pgno
81d0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
81e0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
81f0: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 73  CLUSIVE ){.    s
8200: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
8210: 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d  ager->fd, (pgno-
8220: 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
8230: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72  pageSize);.    r
8240: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
8250: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
8260: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
8270: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
8280: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
8290: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
82a0: 20 65 76 65 72 20 62 65 20 72 6f 6c 6c 65 64 20   ever be rolled 
82b0: 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
82c0: 75 73 65 2c 20 65 78 63 65 70 74 20 66 6f 72 20  use, except for 
82d0: 70 61 67 65 0a 20 20 20 20 2a 2a 20 31 20 77 68  page.    ** 1 wh
82e0: 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
82f0: 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
8300: 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
8310: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
8320: 20 2a 2a 20 61 63 74 69 76 65 2e 0a 20 20 20 20   ** active..    
8330: 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
8340: 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
8350: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
8360: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  pPg->pgno==1 );.
8370: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
8380: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
8390: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
83a0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
83b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
83c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
83d0: 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a  tructor ){  /***
83e0: 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64   FIX ME:  Should
83f0: 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74   this be xReinit
8400: 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61  ? ***/.      pPa
8410: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
8420: 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  (pData, pPager->
8430: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
8440: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
8450: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
8460: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
8470: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
8480: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
8490: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
84a0: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
84b0: 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
84c0: 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65  no, 3);.  }.  re
84d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
84e0: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
84f0: 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
8500: 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
8510: 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
8520: 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
8530: 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
8540: 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
8550: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
8560: 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
8570: 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
8580: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
8590: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
85a0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
85b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
85c0: 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
85d0: 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
85e0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
85f0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
8600: 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
8610: 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  all child journa
8620: 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69  ls..** To tell i
8630: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
8640: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
8650: 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68  d, check to each
8660: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64   of the.** child
8670: 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69  ren.  If all chi
8680: 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72  ldren are either
8690: 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e   missing or do n
86a0: 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61  ot refer to.** a
86b0: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
86c0: 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  r journal, then 
86d0: 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72  this master jour
86e0: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
86f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
8700: 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
8710: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  r(const char *zM
8720: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
8730: 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f  ;.  int master_o
8740: 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c  pen = 0;.  OsFil
8750: 65 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72  e master;.  char
8760: 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
8770: 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
8780: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
8790: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
87a0: 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
87b0: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
87c0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
87d0: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
87e0: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
87f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63  journal file exc
8800: 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65  lusively in case
8810: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
8820: 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e  ess.  ** is runn
8830: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
8840: 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20   also. Not that 
8850: 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63  it makes too muc
8860: 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  h difference..  
8870: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61 73  */.  memset(&mas
8880: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  ter, 0, sizeof(m
8890: 61 73 74 65 72 29 29 3b 0a 20 20 72 63 20 3d 20  aster));.  rc = 
88a0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
88b0: 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26  dOnly(zMaster, &
88c0: 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72  master);.  if( r
88d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
88e0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
88f0: 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e  t;.  master_open
8900: 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
8910: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
8920: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
8930: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
8940: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8950: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
8960: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
8970: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
8980: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
8990: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
89a0: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
89b0: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
89c0: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
89d0: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
89e0: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
89f0: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
8a00: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
8a10: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
8a20: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
8a30: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
8a40: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
8a50: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
8a60: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
8a70: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
8a80: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
8a90: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
8aa0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
8ab0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
8ac0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8ad0: 33 4f 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c  3OsRead(&master,
8ae0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
8af0: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29   nMasterJournal)
8b00: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
8b10: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
8b20: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
8b30: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
8b40: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
8b50: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
8b60: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
8b70: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
8b80: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  l ){.      if( s
8b90: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
8ba0: 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  ts(zJournal) ){.
8bb0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
8bc0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
8bd0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
8be0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8bf0: 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
8c00: 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
8c10: 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
8c20: 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
8c30: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
8c40: 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
8c50: 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
8c60: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
8c70: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
8c80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f      */.        O
8c90: 73 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 0a  sFile journal;..
8ca0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
8cb0: 6a 6f 75 72 6e 61 6c 2c 20 30 2c 20 73 69 7a 65  journal, 0, size
8cc0: 6f 66 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20  of(journal));.  
8cd0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8ce0: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
8cf0: 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72  (zJournal, &jour
8d00: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
8d10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8d20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
8d30: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
8d40: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
8d50: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
8d60: 74 65 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75 72  terJournal(&jour
8d70: 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72  nal, &zMasterPtr
8d80: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8d90: 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e  e3OsClose(&journ
8da0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
8db0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8dc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
8dd0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
8de0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
8df0: 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 50 74     if( zMasterPt
8e00: 72 20 26 26 20 21 73 74 72 63 6d 70 28 7a 4d 61  r && !strcmp(zMa
8e10: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
8e20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
8e30: 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
8e40: 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
8e50: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8e60: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
8e70: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
8e80: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
8e90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8ea0: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
8eb0: 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29  strlen(zJournal)
8ec0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
8ed0: 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c   .  sqlite3OsDel
8ee0: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64  ete(zMaster);..d
8ef0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
8f00: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
8f10: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
8f20: 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  Free(zMasterJour
8f30: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
8f40: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
8f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
8f60: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
8f70: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8f80: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65  ../*.** Make eve
8f90: 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ry page in the c
8fa0: 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20  ache agree with 
8fb0: 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
8fc0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
8fd0: 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20  ,.** reread the 
8fe0: 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68  disk to reset th
8ff0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
9000: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
9010: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
9020: 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62  ed after a rollb
9030: 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d  ack in which som
9040: 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63  e of the dirty c
9050: 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61  ache.** pages ha
9060: 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  d never been wri
9070: 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tten out to disk
9080: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
9090: 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63  ll back the.** c
90a0: 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64  ache content and
90b0: 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79   the easiest way
90c0: 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74   to do that is t
90d0: 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64  o reread the old
90e0: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b   content.** back
90f0: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a   from the disk..
9100: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
9110: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
9120: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9130: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
9140: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9150: 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  _OK;.  for(pPg=p
9160: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
9170: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
9180: 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  All){.    char z
9190: 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50  Buf[SQLITE_MAX_P
91a0: 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69  AGE_SIZE];.    i
91b0: 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29  f( !pPg->dirty )
91c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
91d0: 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
91e0: 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
91f0: 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
9200: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
9210: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
9220: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
9230: 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29  4)(pPg->pgno-1))
9240: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
9250: 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67  ite3OsRead(&pPag
9260: 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
9270: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9280: 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52  .      TRACE3("R
9290: 45 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  EFETCH %d page %
92a0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
92b0: 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  .h, pPg->pgno);.
92c0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
92d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45  reak;.      CODE
92e0: 43 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20  C(pPager, zBuf, 
92f0: 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20  pPg->pgno, 2);. 
9300: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9310: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
9320: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9330: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9340: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
9350: 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47   memcmp(zBuf, PG
9360: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
9370: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
9380: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ze) ){.      mem
9390: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
93a0: 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50  A(pPg), zBuf, pP
93b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
93c0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
93d0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
93e0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
93f0: 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f  xReiniter(PGHDR_
9400: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
9410: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9420: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9430: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
9440: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
9450: 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
9460: 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
9470: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9480: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
9490: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  0;.    pPg->dirt
94a0: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
94b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
94c0: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61   Truncate the ma
94d0: 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67  in file of the g
94e0: 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68  iven pager to th
94f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
9500: 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a  s.** indicated..
9510: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
9520: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
9530: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
9540: 6e 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  nPage){.  return
9550: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
9560: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
9570: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9580: 2a 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a  *(i64)nPage);.}.
9590: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
95a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
95b0: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
95c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
95d0: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
95e0: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
95f0: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
9600: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
9610: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
9620: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
9630: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
9640: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
9650: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
9660: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
9670: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
9680: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
9690: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
96a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
96b0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
96c0: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
96d0: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
96e0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
96f0: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
9700: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
9710: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
9720: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
9730: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
9740: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
9750: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
9760: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
9770: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
9780: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
9790: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
97a0: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
97b0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
97c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
97d0: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
97e0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
97f0: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
9800: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
9810: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
9820: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
9830: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9840: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
9850: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
9860: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
9870: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
9880: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
9890: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
98a0: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
98b0: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
98c0: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
98d0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
98e0: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
98f0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
9900: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
9910: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
9920: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
9930: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
9940: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
9950: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
9960: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
9970: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
9980: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
9990: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
99a0: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
99b0: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
99c0: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
99d0: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
99e0: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
99f0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
9a00: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
9a10: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
9a20: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
9a30: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
9a40: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
9a50: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
9a60: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
9a70: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
9a80: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
9a90: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
9aa0: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
9ab0: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
9ac0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
9ad0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
9ae0: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
9af0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
9b00: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
9b10: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
9b20: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
9b30: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
9b40: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
9b50: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
9b60: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
9b70: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
9b80: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
9b90: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
9ba0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
9bb0: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
9bc0: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
9bd0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
9be0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
9bf0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
9c00: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
9c10: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
9c20: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
9c30: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
9c40: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
9c50: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
9c60: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
9c70: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
9c80: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
9c90: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
9ca0: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
9cb0: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
9cc0: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
9cd0: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
9ce0: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
9cf0: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
9d00: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
9d10: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
9d20: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
9d30: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
9d40: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
9d50: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
9d60: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
9d70: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
9d80: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
9d90: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
9da0: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
9db0: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
9dc0: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
9dd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
9de0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
9df0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
9e00: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
9e10: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
9e20: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
9e30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
9e40: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
9e50: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
9e60: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
9e70: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
9e80: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
9e90: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
9ea0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9eb0: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
9ec0: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
9ed0: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
9ee0: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
9ef0: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
9f00: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
9f10: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
9f20: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
9f30: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
9f40: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
9f50: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
9f60: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
9f70: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
9f80: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
9f90: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
9fa0: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
9fb0: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
9fc0: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
9fd0: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
9fe0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
9ff0: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
a000: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
a010: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
a020: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a030: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
a040: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
a050: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
a060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a070: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
a080: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
a090: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a0b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
a0c0: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
a0d0: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
a100: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
a110: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
a120: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
a130: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
a140: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
a150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a160: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
a170: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
a180: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
a190: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
a1a0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
a1b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
a1c0: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
a1d0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
a1e0: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
a1f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
a200: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
a210: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
a220: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
a230: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a240: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
a250: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a260: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
a270: 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
a280: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a290: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
a2a0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
a2b0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
a2c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
a2d0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
a2e0: 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
a2f0: 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
a300: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a310: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
a320: 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
a330: 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
a340: 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
a350: 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
a360: 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
a370: 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
a380: 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
a390: 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  d back..  */.  r
a3a0: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
a3b0: 75 72 6e 61 6c 28 26 70 50 61 67 65 72 2d 3e 6a  urnal(&pPager->j
a3c0: 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20  fd, &zMaster);. 
a3d0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
a3e0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
a3f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a400: 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21  || (zMaster && !
a410: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
a420: 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b  sts(zMaster)) ){
a430: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
a440: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
a450: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
a460: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
a470: 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
a480: 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  _OK;.    goto en
a490: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
a4a0: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
a4b0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  &pPager->jfd, 0)
a4c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
a4d0: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
a4e0: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
a4f0: 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
a500: 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
a510: 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
a520: 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
a530: 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
a540: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
a550: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
a560: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
a570: 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
a580: 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
a590: 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
a5a0: 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
a5b0: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
a5c0: 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
a5d0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
a5e0: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
a5f0: 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
a600: 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
a610: 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
a620: 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
a630: 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
a640: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
a650: 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
a660: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
a670: 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
a680: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
a690: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
a6a0: 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
a6b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
a6c0: 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
a6d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a6e0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
a6f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a700: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
a710: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
a720: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a730: 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
a740: 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
a750: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
a760: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
a770: 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
a780: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
a790: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
a7a0: 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
a7b0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
a7c0: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
a7d0: 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
a7e0: 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
a7f0: 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
a800: 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
a810: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
a820: 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
a830: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
a840: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
a850: 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
a860: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a870: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
a880: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
a890: 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
a8a0: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
a8b0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a8c0: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
a8d0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
a8e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
a8f0: 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
a900: 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
a910: 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
a920: 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
a930: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
a940: 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61   to it's origina
a950: 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
a960: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
a970: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
a980: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a990: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
a9a0: 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  t( pPager->origD
a9b0: 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67  bSize==0 || pPag
a9c0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
a9d0: 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63  mxPg );.      rc
a9e0: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
a9f0: 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
aa00: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
aa10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
aa20: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
aa30: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
aa40: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
aa50: 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
aa60: 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20 3d 20 73  }..    /* rc = s
aa70: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
aa80: 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e  ager->jfd, JOURN
aa90: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
aaa0: 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  )); */.    if( r
aab0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
aac0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
aad0: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ;.  .    /* Copy
aae0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
aaf0: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
ab00: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
ab10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ab20: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
ab30: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
ab40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
ab50: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
ab60: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
ab70: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31   &pPager->jfd, 1
ab80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
ab90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
aba0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
abb0: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
abc0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
abd0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
abe0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
abf0: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
ac00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ac10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ac20: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
ac30: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
ac40: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
ac50: 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20    }..  /* Pages 
ac60: 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77  that have been w
ac70: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
ac80: 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20  urnal but never 
ac90: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72  synced.  ** wher
aca0: 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62  e not restored b
acb0: 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65  y the loop above
acc0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65  .  We have to re
acd0: 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a  store those.  **
ace0: 20 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e   pages by readin
acf0: 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d  g them back from
ad00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
ad10: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61  tabase..  */.  a
ad20: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
ad30: 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f  E_OK );.  pager_
ad40: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
ad50: 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62  ger);..end_playb
ad60: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
ad70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ad80: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
ad90: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
ada0: 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65    }.  if( zMaste
adb0: 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  r ){.    /* If t
adc0: 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
add0: 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
ade0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
adf0: 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20  return true,.   
ae00: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
ae10: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
ae20: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
ae30: 6f 75 72 6e 61 6c 2e 20 49 66 20 65 72 72 6f 72  ournal. If error
ae40: 73 20 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20  s .    ** occur 
ae50: 64 75 72 69 6e 67 20 74 68 69 73 20 70 72 6f 63  during this proc
ae60: 65 73 73 2c 20 69 67 6e 6f 72 65 20 74 68 65 6d  ess, ignore them
ae70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ae80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ae90: 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 64 65  {.      pager_de
aea0: 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29  lmaster(zMaster)
aeb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
aec0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
aed0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
aee0: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
aef0: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
af00: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
af10: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
af20: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
af30: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
af40: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
af50: 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43  ferent PAGER_SEC
af60: 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61  TOR_SIZE.  ** va
af70: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
af80: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
af90: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
afa0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ess..  */.  pPag
afb0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
afc0: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
afd0: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ZE;.  return rc;
afe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
aff0: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
b000: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
b010: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
b020: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
b030: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
b040: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
b050: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
b060: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
b070: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
b080: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
b090: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
b0a0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
b0b0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
b0c0: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
b0d0: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
b0e0: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
b0f0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
b100: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
b110: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
b120: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
b130: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
b140: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b150: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
b160: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
b170: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
b180: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
b190: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
b1a0: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
b1b0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
b1c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b1d0: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
b1e0: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
b1f0: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
b200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b210: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
b220: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
b230: 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
b240: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
b250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b260: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
b270: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b290: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b2a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
b2b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b2c0: 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  Off;.#ifndef NDE
b2d0: 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34  BUG .  {.    i64
b2e0: 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20   os_szJ;.    rc 
b2f0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
b300: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
b310: 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20  , &os_szJ);.    
b320: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b330: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
b340: 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d     assert( szJ==
b350: 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65  os_szJ );.  }.#e
b360: 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68  ndif..  /* Set h
b370: 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20  drOff to be the 
b380: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 66 69  offset to the fi
b390: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
b3a0: 65 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  er written.  ** 
b3b0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74  this statement t
b3c0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74  ransaction, or t
b3d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
b3e0: 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c  le if no journal
b3f0: 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73  .  ** header was
b400: 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   written..  */. 
b410: 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72   hdrOff = pPager
b420: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20  ->stmtHdrOff;.  
b430: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b440: 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72  fullSync || !hdr
b450: 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64  Off );.  if( !hd
b460: 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f  rOff ){.    hdrO
b470: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
b480: 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20  ..  /* Truncate 
b490: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63  the database bac
b4a0: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
b4b0: 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72  l size..  */.  r
b4c0: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
b4d0: 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
b4e0: 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20  r->stmtSize);.  
b4f0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
b500: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
b510: 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  e;..  /* Figure 
b520: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
b530: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
b540: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b550: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
b560: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
b570: 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
b580: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
b590: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
b5a0: 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
b5b0: 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72  .  nRec = pPager
b5c0: 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20  ->stmtNRec;.  . 
b5d0: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
b5e0: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
b5f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
b600: 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
b610: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
b620: 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65  base file.  Note
b630: 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
b640: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74  ent journal omit
b650: 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d  s checksums from
b660: 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72  .  ** each recor
b670: 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61  d since power-fa
b680: 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69  ilure recovery i
b690: 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20  s not important 
b6a0: 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  to statement.  *
b6b0: 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  * journals..  */
b6c0: 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b  .  for(i=nRec-1;
b6d0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
b6e0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
b6f0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
b700: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 73  ager, &pPager->s
b710: 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  tfd, 0);.    ass
b720: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
b730: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
b740: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b750: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
b760: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
b770: 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20  * Now roll some 
b780: 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  pages back from 
b790: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
b7a0: 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73  journal. Pager.s
b7b0: 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61  tmtJSize.  ** wa
b7c0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
b7d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
b7e0: 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  hen this stateme
b7f0: 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  nt was started, 
b800: 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69  so.  ** everythi
b810: 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65  ng after that ne
b820: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
b830: 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e   back, either in
b840: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
b850: 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79  base, the memory
b860: 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e   cache, or both.
b870: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74  .  **.  ** If it
b880: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
b890: 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72  en Pager.stmtHdr
b8a0: 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65  Off is the offse
b8b0: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
b8c0: 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
b8d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
b8e0: 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74  written during t
b8f0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
b900: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
b910: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b920: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
b930: 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  d, pPager->stmtJ
b940: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
b950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b960: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
b970: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
b980: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b990: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
b9a0: 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  tJSize;.  pPager
b9b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50  ->cksumInit = pP
b9c0: 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b  ager->stmtCksum;
b9d0: 0a 20 20 61 73 73 65 72 74 28 20 4a 4f 55 52 4e  .  assert( JOURN
b9e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
b9f0: 29 3c 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  )<(pPager->pageS
ba00: 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c  ize+8) );.  whil
ba10: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
ba20: 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66 66  alOff <= (hdrOff
ba30: 2d 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  -(pPager->pageSi
ba40: 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20 20 72 63  ze+8)) ){.    rc
ba50: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
ba60: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
ba70: 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  r, &pPager->jfd,
ba80: 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
ba90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
baa0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
bab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
bac0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
bad0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ck;.  }..  while
bae0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
baf0: 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20  lOff < szJ ){.  
bb00: 20 20 75 33 32 20 6e 52 65 63 3b 0a 20 20 20 20    u32 nRec;.    
bb10: 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
bb20: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
bb30: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
bb40: 26 6e 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  &nRec, &dummy);.
bb50: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bb60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
bb70: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
bb80: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
bb90: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
bba0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
bbb0: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 29 7b    if( nRec==0 ){
bbc0: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
bbd0: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
bbe0: 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67  rnalOff) / (pPag
bbf0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b  er->pageSize+8);
bc00: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
bc10: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26  =nRec-1; i>=0 &&
bc20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bc30: 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b  Off < szJ; i--){
bc40: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
bc50: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
bc60: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
bc70: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
bc80: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
bc90: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
bca0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
bcb0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
bcc0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
bcd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
bce0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bcf0: 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73   = szJ;.  .end_s
bd00: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
bd10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
bd20: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
bd30: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
bd40: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
bd50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
bd60: 4f 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74  ORRUPT;  /* bkpt
bd70: 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d 65  -CORRUPT */.  }e
bd80: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
bd90: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
bda0: 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  J;.    /* pager_
bdb0: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
bdc0: 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72  ger); */.  }.  r
bdd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bde0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
bdf0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
be00: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
be10: 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
be20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
be30: 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68  mum number is th
be40: 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  e absolute value
be50: 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20 70   of the mxPage p
be60: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20  arameter..** If 
be70: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
be80: 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66  ve, the noSync f
be90: 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e  lag is also set.
bea0: 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65    noSync bypasse
beb0: 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  s.** calls to sq
bec0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 2e 20 20  lite3OsSync().  
bed0: 54 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d  The pager runs m
bee0: 75 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20  uch faster with 
bef0: 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75  noSync on,.** bu
bf00: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
bf10: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
bf20: 73 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e  s or there is an
bf30: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a   abrupt power .*
bf40: 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  * failure, the d
bf50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67  atabase file mig
bf60: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ht be left in an
bf70: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
bf80: 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c  d.** unrepairabl
bf90: 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f  e state.  .*/.vo
bfa0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
bfb0: 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61  set_cachesize(Pa
bfc0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
bfd0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
bfe0: 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  mxPage>=0 ){.   
bff0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
c000: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
c010: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  le;.    if( pPag
c020: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
c030: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
c040: 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0; .  }else{.   
c050: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
c060: 3d 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20  = 1;.    mxPage 
c070: 3d 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20  = -mxPage;.  }. 
c080: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
c090: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
c0a0: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
c0b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
c0c0: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
c0d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
c0e0: 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
c0f0: 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
c100: 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
c110: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
c120: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
c130: 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
c140: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
c150: 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
c160: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
c170: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
c180: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
c190: 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
c1a0: 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
c1b0: 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
c1c0: 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
c1d0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
c1e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c1f0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
c200: 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
c210: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
c220: 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
c230: 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
c240: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
c250: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
c260: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
c270: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
c280: 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
c290: 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
c2a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c2b0: 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
c2c0: 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
c2d0: 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
c2e0: 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
c2f0: 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
c300: 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
c310: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
c320: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
c340: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
c350: 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
c360: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
c370: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
c380: 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
c390: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
c3a0: 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
c3b0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
c3c0: 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
c3d0: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
c3e0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
c3f0: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
c400: 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
c410: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
c420: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
c430: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c440: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
c450: 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
c460: 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
c470: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
c480: 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
c490: 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
c4a0: 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
c4c0: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
c4d0: 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
c4e0: 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
c4f0: 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
c500: 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
c510: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
c520: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
c530: 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
c540: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
c550: 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
c560: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
c570: 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
c580: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
c590: 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
c5a0: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
c5b0: 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
c5c0: 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
c5d0: 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76  and FULL=3..*/.v
c5e0: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
c5f0: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
c600: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
c610: 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70   int level){.  p
c620: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
c630: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
c640: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
c650: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
c660: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
c670: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
c680: 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
c690: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
c6a0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
c6b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
c6c0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
c6d0: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
c6e0: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
c6f0: 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65   zName.** (zName
c700: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
c710: 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  t SQLITE_TEMPNAM
c720: 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e  E_SIZE bytes lon
c730: 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68  g.)  Write.** th
c740: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
c750: 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
c760: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
c770: 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
c780: 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
c790: 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
c7a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69  .**.** The OS wi
c7b0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
c7c0: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
c7d0: 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
c7e0: 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e  it is.** closed.
c7f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
c800: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
c810: 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65  temp(char *zFile
c820: 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20  , OsFile *fd){. 
c830: 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20   int cnt = 8;.  
c840: 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20  int rc;.  do{.  
c850: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
c860: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
c870: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
c880: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
c890: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
c8a0: 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69  , fd, 1);.  }whi
c8b0: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
c8c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
c8d0: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
c8e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c8f0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
c900: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
c910: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
c920: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
c930: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
c940: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
c950: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
c960: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
c970: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
c980: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
c990: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
c9a0: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
c9b0: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
c9c0: 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
c9d0: 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
c9e0: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
c9f0: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
ca00: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
ca10: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
ca20: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
ca30: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
ca40: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
ca50: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
ca60: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
ca70: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
ca80: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
ca90: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
caa0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
cab0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
cac0: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
cad0: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
cae0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
caf0: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
cb00: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
cb10: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
cb20: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
cb30: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
cb40: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
cb50: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
cb60: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20  te3pager_open(. 
cb70: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
cb80: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
cb90: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
cba0: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
cbb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
cbc0: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
cbd0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
cbe0: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
cbf0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cc10: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
cc20: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
cc30: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
cc40: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 20  int useJournal  
cc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
cc60: 20 74 6f 20 75 73 65 20 61 20 72 6f 6c 6c 62 61   to use a rollba
cc70: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ck journal on th
cc80: 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
cc90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
cca0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
ccb0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
ccc0: 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c  nameLen;.  OsFil
ccd0: 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  e fd;.  int rc =
cce0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
ccf0: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
cd00: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
cd10: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
cd20: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
cd30: 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54  char zTemp[SQLIT
cd40: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
cd50: 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  ;..  *ppPager = 
cd60: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 66 64 2c  0;.  memset(&fd,
cd70: 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29 3b   0, sizeof(fd));
cd80: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
cd90: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
cda0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cdb0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
cdc0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
cdd0: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
cde0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cdf0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
ce00: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
ce10: 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
ce20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
ce30: 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
ce40: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
ce50: 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b  qliteStrDup("");
ce60: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
ce70: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
ce80: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
ce90: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
cea0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
ceb0: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
cec0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
ced0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
cee0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
cef0: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
cf00: 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rite(zFullPathna
cf10: 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e  me, &fd, &readOn
cf20: 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ly);.      }.   
cf30: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
cf40: 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
cf50: 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70  r_opentemp(zTemp
cf60: 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c  , &fd);.    zFil
cf70: 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20  ename = zTemp;. 
cf80: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
cf90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
cfa0: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
cfb0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  me);.    if( rc=
cfc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cfd0: 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
cfe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
cff0: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
d000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
d010: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
d020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d030: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
d040: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d050: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
d060: 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71  ose(&fd);.    sq
d070: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
d080: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
d090: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 61  urn rc;.  }.  na
d0a0: 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  meLen = strlen(z
d0b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
d0c0: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
d0d0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
d0e0: 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65  pPager) + nameLe
d0f0: 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 69 66  n*3 + 30 );.  if
d100: 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20  ( pPager==0 ){. 
d110: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
d120: 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  e(&fd);.    sqli
d130: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
d140: 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
d150: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
d160: 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22 4f 50    }.  TRACE3("OP
d170: 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 66 64 2e  EN %d %s\n", fd.
d180: 68 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  h, zFullPathname
d190: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
d1a0: 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
d1b0: 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50  &pPager[1];.  pP
d1c0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
d1d0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
d1e0: 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ename[nameLen+1]
d1f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
d200: 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
d210: 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c  zDirectory[nameL
d220: 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28  en+1];.  strcpy(
d230: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
d240: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
d250: 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  );.  strcpy(pPag
d260: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
d270: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
d280: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
d290: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
d2a0: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
d2b0: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
d2c0: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
d2d0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
d2e0: 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70   = 0;.  strcpy(p
d2f0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
d300: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
d310: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
d320: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
d330: 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e  strcpy(&pPager->
d340: 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e  zJournal[nameLen
d350: 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a  ], "-journal");.
d360: 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66    pPager->fd = f
d370: 64 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20  d;.#if OS_UNIX. 
d380: 20 70 50 61 67 65 72 2d 3e 66 64 2e 70 50 61 67   pPager->fd.pPag
d390: 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e  er = pPager;.#en
d3a0: 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  dif.  pPager->jo
d3b0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
d3c0: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
d3d0: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
d3e0: 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
d3f0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
d400: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
d410: 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70  mtInUse = 0;.  p
d420: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
d430: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
d440: 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70  e = memDb-1;.  p
d450: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
d460: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
d470: 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50  _PAGE_SIZE;.  pP
d480: 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20  ager->psAligned 
d490: 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  = FORCE_ALIGNMEN
d4a0: 54 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  T(pPager->pageSi
d4b0: 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ze);.  pPager->s
d4c0: 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  tmtSize = 0;.  p
d4d0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
d4e0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
d4f0: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61  nPage = 0;.  pPa
d500: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
d510: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  0;.  pPager->sta
d520: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
d530: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  K;.  pPager->err
d540: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  Mask = 0;.  pPag
d550: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74  er->tempFile = t
d560: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
d570: 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
d580: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
d590: 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
d5a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
d5b0: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
d5c0: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
d5d0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
d5e0: 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
d5f0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
d600: 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
d610: 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72  c?0:1);.  pPager
d620: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
d630: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
d640: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
d650: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
d660: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
d670: 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  = FORCE_ALIGNMEN
d680: 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61  T(nExtra);.  pPa
d690: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
d6a0: 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  = PAGER_SECTOR_S
d6b0: 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  IZE;.  pPager->p
d6c0: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
d6d0: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
d6e0: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
d6f0: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
d700: 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ));.  *ppPager =
d710: 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
d720: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d730: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
d740: 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
d750: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
d760: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75  ite3pager_set_bu
d770: 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20  syhandler(Pager 
d780: 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e  *pPager, BusyHan
d790: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
d7a0: 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er){.  pPager->p
d7b0: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42  BusyHandler = pB
d7c0: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f  usyHandler;.}../
d7d0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
d7e0: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
d7f0: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
d800: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
d810: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
d820: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
d830: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
d840: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
d850: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
d860: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
d870: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
d880: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
d890: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
d8a0: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
d8b0: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
d8c0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
d8d0: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
d8e0: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70   result sqlite3p
d8f0: 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a  ager_close().  .
d900: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
d910: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
d920: 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  y sqlite3pager_u
d930: 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nref()..*/.void 
d940: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
d950: 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  _destructor(Page
d960: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
d970: 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69  (*xDesc)(void*,i
d980: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
d990: 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44  xDestructor = xD
d9a0: 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  esc;.}../*.** Se
d9b0: 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  t the reinitiali
d9c0: 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  zer for this pag
d9d0: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
d9e0: 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  , the reinitiali
d9f0: 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  zer.** is called
da00: 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
da10: 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63  t of a page in c
da20: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
da30: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
da40: 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72  .** value as a r
da50: 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62  esult of a rollb
da60: 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61  ack.  The callba
da70: 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d  ck gives higher-
da80: 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e  level code.** an
da90: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
daa0: 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52  restore the EXTR
dab0: 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72  A section to agr
dac0: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
dad0: 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74  ored.** page dat
dae0: 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
daf0: 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e  e3pager_set_rein
db00: 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
db10: 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
db20: 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b  it)(void*,int)){
db30: 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
db40: 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
db50: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
db60: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
db70: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
db80: 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 63 68 61  must only be cha
db90: 6e 67 65 64 20 77 68 65 6e 20 74 68 65 20 63 61  nged when the ca
dba0: 63 68 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  che is empty..*/
dbb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
dbc0: 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28  er_set_pagesize(
dbd0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
dbe0: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
dbf0: 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
dc00: 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
dc10: 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
dc20: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 70 50 61  GE_SIZE );.  pPa
dc30: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
dc40: 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  pageSize;.  pPag
dc50: 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20 3d 20  er->psAligned = 
dc60: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
dc70: 70 61 67 65 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  pageSize);.}../*
dc80: 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
dc90: 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
dca0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
dcb0: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
dcc0: 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
dcd0: 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  est points to.  
dce0: 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  No error checkin
dcf0: 67 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f  g is done..*/.vo
dd00: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
dd10: 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28  read_fileheader(
dd20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
dd30: 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
dd40: 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d  har *pDest){.  m
dd50: 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
dd60: 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d  N);.  if( MEMDB=
dd70: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
dd80: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
dd90: 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  >fd, 0);.    sql
dda0: 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67  ite3OsRead(&pPag
ddb0: 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
ddc0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ddd0: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
dde0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ddf0: 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
de00: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
de10: 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a  h.** pPager..*/.
de20: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
de30: 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  _pagecount(Pager
de40: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
de50: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   n;.  assert( pP
de60: 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
de70: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
de80: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
de90: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
dea0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
deb0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
dec0: 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53  ager->fd, &n)!=S
ded0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dee0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
def0: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53  |= PAGER_ERR_DIS
df00: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  K;.    return 0;
df10: 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20 70 50 61 67  .  }.  n /= pPag
df20: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
df30: 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 3d  if( !MEMDB && n=
df40: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  =PENDING_BYTE/pP
df50: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
df60: 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  {.    n++;.  }. 
df70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
df80: 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
df90: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
dfa0: 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a  dbSize = n;.  }.
dfb0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
dfc0: 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
dfd0: 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
dfe0: 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
dff0: 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a  al(Pager*);.../*
e000: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66  .** Unlink pPg f
e010: 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
e020: 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
e030: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
e040: 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
e050: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
e060: 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
e070: 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
e080: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
e090: 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
e0a0: 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
e0b0: 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63  page() routine c
e0c0: 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20  an leave a page 
e0d0: 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74  in the .** pNext
e0e0: 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c  Free/pPrevFree l
e0f0: 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ist that is not 
e100: 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  a part of any ha
e110: 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  sh-chain..*/.sta
e120: 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48  tic void unlinkH
e130: 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a  ashChain(Pager *
e140: 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
e150: 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
e160: 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pgno==0 ){.    /
e170: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
e180: 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68  mber is zero, th
e190: 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
e1a0: 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68 20  not in any hash 
e1b0: 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65  chain. */.    re
e1c0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
e1d0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
e1e0: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
e1f0: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
e200: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
e210: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
e220: 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
e230: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e240: 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61  ->aHash[pager_ha
e250: 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d  sh(pPg->pgno)]!=
e260: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
e270: 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
e280: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
e290: 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
e2a0: 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65      int h = page
e2b0: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
e2c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e2d0: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
e2e0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
e2f0: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
e300: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
e310: 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   }..  pPg->pgno 
e320: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78  = 0;.  pPg->pNex
e330: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  tHash = pPg->pPr
e340: 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f  evHash = 0;.}../
e350: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61  *.** Unlink a pa
e360: 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
e370: 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
e380: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65  of all pages whe
e390: 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61  re nRef==0).** a
e3a0: 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  nd from its hash
e3b0: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
e3c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e3d0: 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64   unlinkPage(PgHd
e3e0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
e3f0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
e400: 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65  pPager;..  /* Ke
e410: 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e  ep the pFirstSyn
e420: 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ced pointer poin
e430: 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73  ting at the firs
e440: 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70  t synchronized p
e450: 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  age */.  if( pPg
e460: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
e470: 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67  Synced ){.    Pg
e480: 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
e490: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69  extFree;.    whi
e4a0: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
e4b0: 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
e4c0: 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
e4d0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
e4e0: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
e4f0: 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
e500: 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
e510: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
e520: 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
e530: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
e540: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
e550: 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  xtFree;.  }else{
e560: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
e570: 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67  ger->pFirst==pPg
e580: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
e590: 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
e5a0: 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69  extFree;.  }.  i
e5b0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
e5c0: 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  e ){.    pPg->pN
e5d0: 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
e5e0: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
e5f0: 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
e600: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e610: 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
e620: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
e630: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
e640: 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ee;.  }.  pPg->p
e650: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
e660: 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a  pPrevFree = 0;..
e670: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
e680: 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
e690: 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  able */.  unlink
e6a0: 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
e6b0: 2c 20 70 50 67 29 3b 0a 2f 2a 0a 20 20 69 66 28  , pPg);./*.  if(
e6c0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
e6d0: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
e6e0: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
e6f0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
e700: 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  h;.  }.  if( pPg
e710: 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
e720: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
e730: 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  h->pNextHash = p
e740: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
e750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
e760: 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
e770: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
e780: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
e790: 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a  Hash[h]==pPg );.
e7a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
e7b0: 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
e7c0: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67  tHash;.  }.  pPg
e7d0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
e7e0: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
e7f0: 3b 0a 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ;.*/.}../*.** Th
e800: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
e810: 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ed to truncate a
e820: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
e830: 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a  base.  Delete.**
e840: 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65   all pages whose
e850: 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20   pgno is larger 
e860: 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
e870: 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66  ize and is unref
e880: 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65  erenced..** Refe
e890: 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72  renced pages lar
e8a0: 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
e8b0: 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f  >dbSize are zero
e8c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
e8d0: 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74  id memoryTruncat
e8e0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
e8f0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
e900: 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a    PgHdr **ppPg;.
e910: 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70    int dbSize = p
e920: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
e930: 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72    ppPg = &pPager
e940: 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28  ->pAll;.  while(
e950: 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d   (pPg = *ppPg)!=
e960: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  0 ){.    if( pPg
e970: 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29  ->pgno<=dbSize )
e980: 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  {.      ppPg = &
e990: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
e9a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67     }else if( pPg
e9b0: 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
e9c0: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
e9d0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
e9e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e9f0: 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  );.      ppPg = 
ea00: 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
ea10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ea20: 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e   *ppPg = pPg->pN
ea30: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e  extAll;.      un
ea40: 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
ea50: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
ea60: 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
ea70: 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
ea80: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
ea90: 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  Truncate the fil
eaa0: 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
eab0: 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69  of pages specifi
eac0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
ead0: 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e3pager_truncate
eae0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
eaf0: 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
eb00: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
eb10: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
eb20: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
eb30: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
eb40: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 ){.    rc = pa
eb50: 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
eb60: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
eb70: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  rc;.  }.  if( nP
eb80: 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70  age>=(unsigned)p
eb90: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
eba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ebb0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
ebc0: 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
ebd0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
ebe0: 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Page;.    memory
ebf0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
ec00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ec10: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
ec20: 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
ec30: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
ec40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ec50: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ec60: 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  }.  rc = pager_t
ec70: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
ec80: 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
ec90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
eca0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
ecb0: 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20  e = nPage;.  }. 
ecc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ecd0: 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
ece0: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
ecf0: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
ed00: 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
ed10: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
ed20: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
ed30: 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
ed40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
ed50: 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
ed60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
ed70: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
ed80: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
ed90: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
eda0: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
edb0: 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
edc0: 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
edd0: 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
ede0: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
edf0: 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
ee00: 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
ee10: 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
ee20: 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
ee30: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
ee40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
ee50: 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20  ger_close(Pager 
ee60: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
ee70: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
ee80: 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72    switch( pPager
ee90: 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63  ->state ){.    c
eea0: 61 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56  ase PAGER_RESERV
eeb0: 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47  ED:.    case PAG
eec0: 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20  ER_SYNCED: .    
eed0: 63 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55  case PAGER_EXCLU
eee0: 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIVE: {.      sq
eef0: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
ef00: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
ef10: 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
ef20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ef30: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
ef40: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
ef50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
ef60: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
ef70: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
ef80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ef90: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 41 47 45   }.    case PAGE
efa0: 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20  R_SHARED: {.    
efb0: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
efc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
efd0: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
efe0: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
eff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f000: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
f010: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
f020: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
f030: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f040: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67   }.  }.  for(pPg
f050: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
f060: 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
f070: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
f080: 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
f090: 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
f0a0: 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
f0b0: 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
f0c0: 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
f0d0: 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
f0e0: 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
f0f0: 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
f100: 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
f110: 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
f120: 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
f130: 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20  endif.    pNext 
f140: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
f150: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
f160: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43  pPg);.  }.  TRAC
f170: 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E2("CLOSE %d\n",
f180: 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
f190: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
f1a0: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
f1b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f1c0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
f1d0: 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
f1e0: 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
f1f0: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
f200: 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
f210: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f220: 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
f230: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
f240: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
f250: 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 69 66 28   ** }.  */.  if(
f260: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
f270: 6d 65 21 3d 28 63 68 61 72 2a 29 26 70 50 61 67  me!=(char*)&pPag
f280: 65 72 5b 31 5d 20 29 7b 0a 20 20 20 20 61 73 73  er[1] ){.    ass
f290: 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61  ert( 0 );  /* Ca
f2a0: 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20  nnot happen */. 
f2b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
f2c0: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
f2d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
f2e0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
f2f0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
f300: 65 65 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  ee(pPager->zDire
f310: 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71  ctory);.  }.  sq
f320: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
f330: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f340: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
f350: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
f360: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
f370: 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
f380: 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61  /.Pgno sqlite3pa
f390: 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76  ger_pagenumber(v
f3a0: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
f3b0: 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54  gHdr *p = DATA_T
f3c0: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
f3d0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
f3e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
f3f0: 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69  age_ref() functi
f400: 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  on increments th
f410: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
f420: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a  t for a page..**
f430: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
f440: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
f450: 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72   freelist (the r
f460: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
f470: 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20  s zero) then.** 
f480: 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
f490: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
f4a0: 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20  ** For non-test 
f4b0: 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
f4c0: 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74  f() is a macro t
f4d0: 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f  hat calls _page_
f4e0: 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20  ref().** online 
f4f0: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
f500: 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20   count is zero. 
f510: 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d   For test system
f520: 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s, page_ref().**
f530: 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74   is a real funct
f540: 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63  ion so that we c
f550: 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e  an set breakpoin
f560: 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e  ts and trace it.
f570: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f580: 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20  _page_ref(PgHdr 
f590: 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
f5a0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
f5b0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20   /* The page is 
f5c0: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
f5d0: 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f   freelist.  Remo
f5e0: 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ve it. */.    if
f5f0: 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67  ( pPg==pPg->pPag
f600: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
f610: 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
f620: 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
f630: 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ree;.      while
f640: 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
f650: 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
f660: 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20  xtFree; }.      
f670: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
f680: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
f690: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
f6a0: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
f6b0: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
f6c0: 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
f6d0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
f6e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f6f0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
f700: 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
f710: 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  xtFree;.    }.  
f720: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
f730: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
f740: 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
f750: 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
f760: 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65  PrevFree;.    }e
f770: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
f780: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
f790: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
f7a0: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
f7b0: 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
f7c0: 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b   }.  pPg->nRef++
f7d0: 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
f7e0: 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
f7f0: 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20  E_TEST.  static 
f800: 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
f810: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69  Hdr *pPg){.    i
f820: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
f830: 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72  ){.      _page_r
f840: 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ef(pPg);.    }el
f850: 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
f860: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46  Ref++;.      REF
f870: 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d  INFO(pPg);.    }
f880: 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
f890: 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
f8a0: 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
f8b0: 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
f8c0: 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
f8d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
f8e0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
f8f0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
f900: 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
f910: 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
f920: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
f930: 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
f940: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
f950: 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61  er_ref(void *pDa
f960: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
f970: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
f980: 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65  R(pData);.  page
f990: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
f9a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f9b0: 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
f9c0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
f9d0: 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
f9e0: 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
f9f0: 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
fa00: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
fa10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
fa20: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
fa30: 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
fa40: 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
fa50: 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
fa60: 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
fa70: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
fa80: 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
fa90: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
faa0: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
fab0: 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
fac0: 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
fad0: 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
fae0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
faf0: 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
fb00: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
fb10: 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
fb20: 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
fb30: 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
fb40: 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
fb50: 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
fb60: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
fb70: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
fb80: 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
fb90: 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
fba0: 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
fbb0: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
fbc0: 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
fbd0: 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
fbe0: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
fbf0: 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
fc00: 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
fc10: 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
fc20: 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
fc30: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
fc40: 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
fc50: 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
fc60: 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
fc70: 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
fc80: 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
fc90: 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
fca0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
fcb0: 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
fcc0: 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
fcd0: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
fce0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
fcf0: 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
fd00: 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
fd10: 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
fd20: 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
fd30: 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63  failure, so sync
fd40: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
fd50: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
fd60: 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
fd70: 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
fd80: 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
fd90: 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
fda0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
fdb0: 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
fdc0: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
fdd0: 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
fde0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
fdf0: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
fe00: 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  nal before modif
fe10: 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61  ying the main da
fe20: 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73  tabase.  ** (ass
fe30: 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61  uming there is a
fe40: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20   journal and it 
fe50: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
fe60: 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed.).  */.  if( 
fe70: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
fe80: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
fe90: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
fea0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
feb0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
fec0: 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61  en );.      /* a
fed0: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
fee0: 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53  noSync ); // noS
fef0: 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74  ync might be set
ff00: 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a   if synchronous.
ff10: 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72        ** was tur
ff20: 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68  ned off after th
ff30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
ff40: 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b  s started.  Tick
ff50: 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64  et #615 */.#ifnd
ff60: 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20  ef NDEBUG.      
ff70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  {.        /* Mak
ff80: 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65  e sure the pPage
ff90: 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20  r->nRec counter 
ffa0: 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61  we are keeping a
ffb0: 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  grees.        **
ffc0: 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63   with the nRec c
ffd0: 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
ffe0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
fff0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
10000 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
10010 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72  4 jSz;.        r
10020 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
10030 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a  eSize(&pPager->j
10040 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20  fd, &jSz);.     
10050 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
10060 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10080 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53  ->journalOff==jS
10090 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
100a0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
100b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
100c0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
100d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
100e0 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
100f0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
10100 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
10110 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
10120 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
10130 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
10140 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
10150 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
10160 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
10170 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
10180 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
10190 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
101a0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
101b0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
101c0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
101d0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
101e0 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22          TRACE2("
101f0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
10200 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
10210 64 2e 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d.h);.          
10220 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
10230 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
10240 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10250 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
10260 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
10270 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
10280 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
10290 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
102a0 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
102b0 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
102c0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
102d0 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
102e0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
102f0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
10300 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
10310 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10320 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
10330 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
10340 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20  rnalOff);.      
10350 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  }.      TRACE2("
10360 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
10370 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
10380 64 2e 68 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  d.h);.      rc =
10390 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26   sqlite3OsSync(&
103a0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
103b0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
103c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
103d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
103e0 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
103f0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
10400 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
10410 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e    /* Erase the n
10420 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f  eedSync flag fro
10430 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20  m every page..  
10440 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67    */.    for(pPg
10450 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
10460 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
10470 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
10480 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
10490 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
104a0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
104b0 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
104c0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
104d0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
104e0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
104f0 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
10500 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
10510 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
10520 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
10530 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
10540 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
10550 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
10560 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
10570 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f  /.  else{.    fo
10580 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
10590 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
105a0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
105b0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
105c0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
105d0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
105e0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
105f0 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70  ynced==pPager->p
10600 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e  First );.  }.#en
10610 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
10620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
10630 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
10640 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
10650 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
10660 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
10670 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
10680 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
10690 20 52 65 70 65 61 74 65 20 75 6e 74 69 6c 20 74   Repeate until t
106a0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
106b0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73   returns.** fals
106c0 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c  e or until the l
106d0 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
106e0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
106f0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
10700 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
10710 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
10720 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
10730 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
10740 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
10750 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
10760 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
10770 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
10780 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
10790 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
107a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
107b0 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
107c0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
107d0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
107e0 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
107f0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  VE_LOCK );.  if(
10800 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
10810 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
10820 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
10840 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 64   busy = 1;.    d
10850 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
10860 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
10870 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
10880 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
10890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
108a0 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
108b0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
108c0 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  r && .        pP
108d0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
108e0 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20  er->xFunc && .  
108f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
10900 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e  usyHandler->xFun
10910 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  c(pPager->pBusyH
10920 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75  andler->pArg, bu
10930 73 79 2b 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20  sy++).    );.   
10940 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10950 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
10960 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
10970 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  type;.    }.  }.
10980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10990 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
109a0 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
109b0 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
109c0 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
109d0 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
109e0 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
109f0 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
10a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
10a10 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
10a20 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
10a30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10a40 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
10a50 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
10a60 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
10a70 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
10a80 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
10a90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10aa0 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
10ab0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
10ac0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
10ad0 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
10ae0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
10af0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
10b00 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
10b10 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
10b20 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
10b30 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
10b40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
10b50 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
10b60 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
10b70 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
10b80 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
10b90 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
10ba0 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
10bb0 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
10bc0 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
10bd0 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
10be0 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
10bf0 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
10c00 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
10c10 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
10c20 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
10c30 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
10c40 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
10c50 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
10c60 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
10c70 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
10c80 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
10c90 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
10ca0 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
10cb0 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
10cc0 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
10cd0 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
10ce0 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
10cf0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
10d00 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
10d10 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
10d20 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
10d30 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
10d40 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
10d50 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
10d60 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
10d70 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
10d80 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
10d90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
10da0 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
10db0 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
10dc0 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
10dd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10de0 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
10df0 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
10e00 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
10e10 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
10e20 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  ayback..  */.  r
10e30 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
10e40 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
10e50 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
10e60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
10e80 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  n rc;.  }..  whi
10e90 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  le( pList ){.   
10ea0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
10eb0 64 69 72 74 79 20 29 3b 0a 20 20 20 20 73 71 6c  dirty );.    sql
10ec0 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
10ed0 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e  er->fd, (pList->
10ee0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
10ef0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
10f00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
10f10 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
10f20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
10f30 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
10f40 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
10f50 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
10f60 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
10f70 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72   sqlite3pager_tr
10f80 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
10f90 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
10fa0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
10fb0 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
10fc0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
10fd0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
10fe0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
10ff0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
11000 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
11010 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
11020 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
11030 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 28   ){.      CODEC(
11040 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
11050 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
11060 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20  ist->pgno, 6);. 
11070 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4f       TRACE3("STO
11080 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
11090 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20  , pPager->fd.h, 
110a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
110b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
110c0 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
110d0 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
110e0 54 41 28 70 4c 69 73 74 29 2c 20 70 50 61 67 65  TA(pList), pPage
110f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
11100 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
11110 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
11120 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
11130 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  gno, 0);.    }.#
11140 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
11150 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52    else{.      TR
11160 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
11170 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 61   page %d\n", pPa
11180 67 65 72 2d 3e 66 64 2e 68 2c 20 70 4c 69 73 74  ger->fd.h, pList
11190 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
111a0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
111b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
111c0 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
111d0 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   0;.    pList = 
111e0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
111f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11200 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11210 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
11220 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
11230 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
11240 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
11250 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
11260 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
11270 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
11280 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
11290 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
112a0 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
112b0 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
112c0 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
112d0 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
112e0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a  ){.  PgHdr *p, *
112f0 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d  pList;.  pList =
11300 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67   0;.  for(p=pPag
11310 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
11320 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
11330 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b   if( p->dirty ){
11340 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79  .      p->pDirty
11350 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
11360 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d  pList = p;.    }
11370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
11380 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  ist;.}../*.** Ac
11390 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
113a0 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
113b0 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
113c0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
113d0 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
113e0 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
113f0 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
11400 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
11410 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
11420 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
11430 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66  * A _get works f
11440 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
11450 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
11460 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
11470 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
11480 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
11490 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
114a0 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
114b0 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
114c0 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
114d0 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
114e0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
114f0 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
11500 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
11510 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
11520 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
11530 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
11540 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
11550 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
11560 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
11570 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
11580 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
11590 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
115a0 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
115b0 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
115c0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
115d0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
115e0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
115f0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
11600 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
11610 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
11620 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
11630 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
11640 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
11650 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
11660 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
11670 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
11680 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
11690 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
116a0 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
116b0 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
116c0 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
116d0 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
116e0 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
116f0 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
11700 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
11710 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
11720 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
11730 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
11740 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
11750 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
11760 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
11770 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
11780 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
11790 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
117a0 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
117b0 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
117c0 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
117d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
117e0 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
117f0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
11800 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
11810 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
11820 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
11830 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
11840 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
11850 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
11860 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
11870 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
11880 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
11890 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
118a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
118b0 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
118c0 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
118d0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
118e0 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
118f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
11900 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
11910 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
11920 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44  hen get a SHARED
11930 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68   lock.  ** on th
11940 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11950 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
11960 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
11970 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20  MEMDB ){.    rc 
11980 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
11990 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
119a0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  RED_LOCK);.    i
119b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
119c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
119d0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
119e0 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
119f0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
11a00 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
11a10 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
11a20 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
11a30 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
11a40 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
11a50 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
11a60 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
11a70 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
11a80 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
11a90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11aa0 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61  OsFileExists(pPa
11ab0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 26  ger->zJournal) &
11ac0 26 0a 20 20 20 20 20 20 20 20 21 73 71 6c 69 74  &.        !sqlit
11ad0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
11ae0 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
11af0 64 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  d) .    ){.     
11b00 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20    int rc;..     
11b10 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
11b20 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
11b30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11b40 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
11b50 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a 20 69  t is.       ** i
11b60 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
11b70 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
11b80 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
11b90 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
11ba0 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
11bb0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
11bc0 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
11bd0 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
11be0 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64   the.       ** d
11bf0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
11c00 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
11c10 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
11c20 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
11c30 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
11c40 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
11c50 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
11c60 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
11c70 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20  ling it .       
11c80 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ** back..       
11c90 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20 42 65  ** .       ** Be
11ca0 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
11cb0 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
11cc0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
11cd0 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
11ce0 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63    ** second proc
11cf0 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ess will get to 
11d00 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
11d10 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
11d20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62 74  to.       ** obt
11d30 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43  ain it's own EXC
11d40 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
11d50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11d60 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
11d70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11d80 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  sLock(&pPager->f
11d90 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
11da0 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  K);.       if( r
11db0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11dc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11dd0 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
11de0 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
11df0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
11e00 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
11e10 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  NLOCK;.         
11e20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
11e30 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
11e40 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
11e50 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20  _EXCLUSIVE;..   
11e60 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
11e70 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
11e80 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ing only.  Retur
11e90 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  n SQLITE_BUSY if
11ea0 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72  .       ** we ar
11eb0 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  e unable to open
11ec0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11ed0 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20  e. .       **.  
11ee0 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72       ** The jour
11ef0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
11f00 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
11f10 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65  ked itself.  The
11f20 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  .       ** journ
11f30 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
11f40 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
11f50 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
11f60 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
11f70 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   ** a write lock
11f80 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65  , so there is ne
11f90 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f  ver any chance o
11fa0 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20  f two or more.  
11fb0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
11fc0 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f  s opening the jo
11fd0 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d  urnal at the sam
11fe0 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a  e time..       *
11ff0 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
12000 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
12010 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  nly(pPager->zJou
12020 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
12030 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  fd);.       if( 
12040 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12050 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
12060 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
12070 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
12080 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
12090 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
120a0 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
120b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
120c0 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20  USY;.       }.  
120d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
120e0 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
120f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
12100 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
12110 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12120 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12130 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
12140 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
12150 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
12160 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20  rnalHdr = 0;..  
12170 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
12180 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
12190 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
121a0 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
121b0 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  e.       ** lock
121c0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
121d0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
121e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
121f0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
12200 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
12210 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12230 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12240 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
12250 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
12260 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
12270 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65  or page in cache
12280 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
12290 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
122a0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
122b0 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  ( MEMDB && pPage
122c0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
122d0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
122e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
122f0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
12300 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
12310 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
12320 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
12330 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
12340 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
12350 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50     int h;.    pP
12360 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20  ager->nMiss++;. 
12370 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
12380 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
12390 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  age || pPager->p
123a0 46 69 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44  First==0 || MEMD
123b0 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72  B ){.      /* Cr
123c0 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
123d0 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73  */.      pPg = s
123e0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
123f0 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70  sizeof(*pPg) + p
12400 50 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64  Pager->psAligned
12410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
12430 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
12440 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
12470 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
12480 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69  tory) );.      i
12490 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
124a0 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20       if( !MEMDB 
124b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
124c0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
124d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
124e0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
124f0 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
12500 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20  ER_ERR_MEM;.    
12510 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12520 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
12530 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
12540 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
12550 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  g));.      if( M
12560 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
12570 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
12580 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
12590 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48  ), 0, sizeof(PgH
125a0 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20  istory));.      
125b0 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
125c0 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
125d0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c      pPg->pNextAl
125e0 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  l = pPager->pAll
125f0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
12600 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
12610 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
12620 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
12630 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61      /* Find a pa
12640 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
12650 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
12660 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
12670 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 71 75  ot.      ** requ
12680 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
12690 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
126a0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
126b0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61  .      pPg = pPa
126c0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
126d0 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  d;..      /* If 
126e0 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  we could not fin
126f0 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  d a page that do
12700 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
12710 6e 20 66 73 79 6e 63 28 29 0a 20 20 20 20 20 20  n fsync().      
12720 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
12730 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
12740 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
12750 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
12760 20 20 20 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f       ** very slo
12770 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
12780 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
12790 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
127a0 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20 20 20 2a  ometimes.      *
127b0 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
127c0 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lped..      */. 
127d0 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
127e0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
127f0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
12800 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
12810 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
12820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
12830 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
12840 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
12850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
12860 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
12870 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
12880 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
12890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
128a0 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
128b0 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a  e, write a new j
128c0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
128d0 74 6f 20 74 68 65 0a 09 20 20 2a 2a 20 6a 6f 75  to the..  ** jou
128e0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
128f0 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
12900 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
12910 61 20 6a 6f 75 72 6e 61 6c 0a 09 20 20 2a 2a 20  a journal..  ** 
12920 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69  header that is i
12930 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72  nvolved in the r
12940 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73  ollback of pages
12950 20 74 68 61 74 20 68 61 76 65 0a 09 20 20 2a 2a   that have..  **
12960 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
12970 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
12980 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
12990 68 65 20 68 65 61 64 65 72 20 69 73 0a 09 20 20  he header is..  
129a0 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
129b0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
129c0 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
129d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
129e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
129f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
12a00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
12a10 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b  ournalOff > 0 );
12a20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
12a30 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
12a40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
12a50 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
12a60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12a70 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
12a80 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
12a90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12aa0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
12ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12ac0 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  }.        pPg = 
12ad0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
12ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
12af0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
12b00 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
12b10 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
12b20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
12b30 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
12b40 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ty..      */.   
12b50 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74     if( pPg->dirt
12b60 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
12b70 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
12b80 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nc==0 );.       
12b90 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
12ba0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
12bb0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
12bc0 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
12bd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12be0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12bf0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
12c00 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
12c10 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
12c20 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
12c30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12c40 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
12c50 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
12c60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
12c70 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72  he page we are r
12c80 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b  ecycling is mark
12c90 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
12ca0 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20  back, then.     
12cb0 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
12cc0 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
12cd0 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
12ce0 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  abling the.     
12cf0 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f   ** sqlite_dont_
12d00 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  rollback() optim
12d10 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
12d20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
12d30 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
12d40 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
12d50 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
12d60 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
12d70 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
12d80 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69  back.      ** mi
12d90 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ght be reloaded 
12da0 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20  at a later time 
12db0 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  but at that poin
12dc0 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d  t we won't remem
12dd0 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ber.      ** tha
12de0 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20  t is was marked 
12df0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20  alwaysRollback. 
12e00 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
12e10 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a   all pages must.
12e20 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b        ** be mark
12e30 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
12e40 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
12e50 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  n out..      */.
12e60 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61        if( pPg->a
12e70 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
12e80 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
12e90 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
12ea0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
12eb0 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68      /* Unlink th
12ec0 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
12ed0 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
12ee0 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
12ef0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12f00 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
12f10 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
12f20 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Ovfl++;.    }.  
12f30 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
12f40 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  no;.    if( pPag
12f50 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
12f60 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
12f70 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
12f80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12f90 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
12fa0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
12fb0 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
12fc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
12fd0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
12fe0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
12ff0 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
13000 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
13010 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
13020 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
13030 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
13040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13050 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
13060 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
13070 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
13080 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
13090 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69  r->aInStmt && (i
130a0 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
130b0 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20  >stmtSize.      
130c0 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65         && (pPage
130d0 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f  r->aInStmt[pgno/
130e0 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
130f0 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
13100 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
13110 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
13120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
13130 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
13140 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
13150 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72    }.    pPg->dir
13160 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ty = 0;.    pPg-
13170 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
13180 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
13190 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
131a0 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68  .    h = pager_h
131b0 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ash(pgno);.    p
131c0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
131d0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
131e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
131f0 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
13200 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
13210 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
13220 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
13230 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
13240 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
13250 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
13260 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
13270 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
13280 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
13290 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
132a0 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
132b0 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
132c0 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
132d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61   }.    sqlite3pa
132e0 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
132f0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
13300 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
13310 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
13320 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
13330 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
13340 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
13350 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
13360 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
13370 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
13380 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
13390 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a  ze<(int)pgno ){.
133a0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
133b0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
133c0 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
133d0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
133e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
133f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 45        assert( ME
13400 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  MDB==0 );.      
13410 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
13420 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
13430 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
13440 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
13450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13460 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
13470 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
13480 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
13490 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 54  geSize);.      T
134a0 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20  RACE3("FETCH %d 
134b0 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  page %d\n", pPag
134c0 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d 3e 70  er->fd.h, pPg->p
134d0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  gno);.      CODE
134e0 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
134f0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
13500 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20  g->pgno, 3);.   
13510 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13530 69 36 34 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20  i64 fileSize;.  
13540 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
13550 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
13560 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a  ger->fd,&fileSiz
13570 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  e)!=SQLITE_OK.  
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
13590 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70  fileSize>=pgno*p
135a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
135b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
135c0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
135d0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
135e0 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  g));.          r
135f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13610 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
13620 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
13630 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
13640 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
13650 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
13660 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
13670 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
13680 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
13690 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  che. */.    pPag
136a0 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20  er->nHit++;.    
136b0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
136c0 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50   }.  *ppPage = P
136d0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
136e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
136f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13700 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
13710 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
13720 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
13730 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
13740 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
13750 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
13760 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
13770 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
13780 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
13790 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a  s not in cache..
137a0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
137b0 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
137c0 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
137d0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
137e0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
137f0 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
13800 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
13810 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
13820 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
13830 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
13840 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
13850 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
13860 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
13870 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
13880 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
13890 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
138a0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
138b0 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
138c0 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  happened..*/.voi
138d0 64 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  d *sqlite3pager_
138e0 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
138f0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
13900 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
13910 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13920 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
13930 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69  ( pgno!=0 );.  i
13940 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
13950 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52  sk & ~(PAGER_ERR
13960 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65  _FULL) ){.    re
13970 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50  turn 0;.  }.  pP
13980 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
13990 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
139a0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72    if( pPg==0 ) r
139b0 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f  eturn 0;.  page_
139c0 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
139d0 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
139e0 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
139f0 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
13a00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
13a10 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
13a20 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
13a30 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
13a40 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
13a50 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
13a60 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
13a70 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
13a80 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
13a90 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
13aa0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
13ab0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
13ac0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
13ad0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
13ae0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
13af0 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  f(void *pData){.
13b00 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
13b10 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
13b20 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
13b30 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
13b40 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54    */.  pPg = DAT
13b50 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
13b60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
13b70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50  ->nRef>0 );.  pP
13b80 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46  g->nRef--;.  REF
13b90 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  INFO(pPg);..  /*
13ba0 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
13bb0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
13bc0 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30  o a page reach 0
13bd0 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
13be0 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61  destructor and a
13bf0 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
13c00 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a  he freelist..  *
13c10 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  /.  if( pPg->nRe
13c20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  f==0 ){.    Page
13c30 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70  r *pPager;.    p
13c40 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
13c50 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
13c60 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  extFree = 0;.   
13c70 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
13c80 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b  = pPager->pLast;
13c90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
13ca0 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  st = pPg;.    if
13cb0 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
13cc0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
13cd0 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
13ce0 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ree = pPg;.    }
13cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
13d00 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
13d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13d20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
13d30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72   && pPager->pFir
13d40 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20  stSynced==0 ){. 
13d50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
13d60 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b  rstSynced = pPg;
13d70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
13d80 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
13d90 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  or ){.      pPag
13da0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
13db0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
13dc0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
13dd0 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
13de0 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
13df0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
13e00 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
13e10 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
13e20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
13e30 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
13e40 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
13e50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
13e60 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
13e70 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
13e80 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20   && !MEMDB ){.  
13e90 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
13ea0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
13eb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
13ec0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13ed0 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c  Create a journal
13ee0 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72   file for pPager
13ef0 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  .  There should 
13f00 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
13f10 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c  ERVED.** or EXCL
13f20 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
13f30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13f40 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
13f50 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
13f60 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
13f70 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
13f80 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  g.  Return an er
13f90 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c  ror code and rel
13fa0 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74  ease the.** writ
13fb0 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69  e lock if anythi
13fc0 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
13fd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13fe0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
13ff0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14000 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
14010 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
14020 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14030 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
14040 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ERVED );.  asser
14050 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14060 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61  alOpen==0 );.  a
14070 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
14080 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 73  seJournal );.  s
14090 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
140a0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
140b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
140c0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nal = sqliteMall
140d0 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
140e0 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
140f0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
14100 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
14110 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14120 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
14130 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
14140 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  l;.  }.  rc = sq
14150 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
14160 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  sive(pPager->zJo
14170 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
14180 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70  jfd,pPager->temp
14190 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  File);.  pPager-
141a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
141b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
141c0 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
141d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
141e0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
141f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
14200 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
14210 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
14220 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44    sqlite3OsOpenD
14230 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d  irectory(pPager-
14240 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 26 70 50  >zDirectory, &pP
14250 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50  ager->jfd);.  pP
14260 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
14270 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
14280 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
14290 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
142a0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
142b0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
142c0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
142d0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
142e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
142f0 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
14300 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
14310 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
14320 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
14330 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
14340 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
14350 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  ize;..  rc = wri
14360 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
14370 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  ger);..  if( pPa
14380 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
14390 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
143a0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
143b0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
143c0 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  _begin(pPager);.
143d0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
143e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
143f0 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
14400 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
14410 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
14430 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
14440 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14450 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
14460 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
14470 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
14480 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29  ger->aInJournal)
14490 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
144a0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 73 71  ournal = 0;.  sq
144b0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
144c0 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
144d0 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
144e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
144f0 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  OCK;.  return rc
14500 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
14510 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
14520 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
14530 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
14540 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
14550 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
14560 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
14570 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
14580 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20  3pager_commit() 
14590 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
145a0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
145b0 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  rollback() is ca
145c0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
145d0 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
145e0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
145f0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
14600 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61  er_unref() is ca
14610 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79  lled to on every
14620 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
14630 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
14640 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  st parameter to 
14650 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14660 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79  a pointer to any
14670 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68   open page of th
14680 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
14690 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61  le.  Nothing cha
146a0 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70  nges about the p
146b0 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64  age - it is used
146c0 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63   merely to.** ac
146d0 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20  quire a pointer 
146e0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
146f0 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72  ucture and as pr
14700 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69  oof that there i
14710 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72  s.** already a r
14720 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
14730 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
14740 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  The second param
14750 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68  eter indicates h
14760 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e  ow much space in
14770 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76   bytes to reserv
14780 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65  e for a.** maste
14790 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e  r journal file-n
147a0 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ame at the start
147b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
147c0 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74  when it is creat
147d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72  ed..**.** A jour
147e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
147f0 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ed if this is no
14800 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  t a temporary fi
14810 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61  le.  For tempora
14820 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65  ry.** files, the
14830 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20   opening of the 
14840 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
14850 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
14860 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63  here is an.** ac
14870 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69  tual need to wri
14880 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
14890 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
148a0 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
148b0 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72  ady reserved for
148c0 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72   writing, this r
148d0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
148e0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c  p..**.** If exFl
148f0 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61  ag is true, go a
14900 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20  head and get an 
14910 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
14920 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d  n the file.** im
14930 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61  mediately instea
14940 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74  d of waiting unt
14950 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75  il we try to flu
14960 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
14970 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20  he.** exFlag is 
14980 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61  ignored if a tra
14990 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
149a0 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69  ady active..*/.i
149b0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
149c0 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
149d0 61 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a  a, int exFlag){.
149e0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
149f0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
14a00 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
14a10 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
14a20 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
14a30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
14a40 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
14a50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
14a60 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
14a70 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
14a80 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
14a90 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
14aa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
14ab0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
14ac0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
14ad0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
14ae0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
14af0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
14b00 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
14b10 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
14b20 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
14b30 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51  se{.      if( SQ
14b40 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
14b50 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 78 46 6c 61  ED_LOCK || exFla
14b60 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  g ){.        rc 
14b70 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
14b80 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 52 45 53  lock(pPager, RES
14b90 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
14ba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14bb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14bc0 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
14bd0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
14be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14bf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14c00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
14c10 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
14c20 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
14c30 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20       if( exFlag 
14c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
14c50 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
14c60 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
14c70 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
14c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14c90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14ca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14cb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
14cd0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
14ce0 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32   0;.      TRACE2
14cf0 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
14d00 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
14d10 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  h);.      if( pP
14d20 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
14d30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
14d40 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
14d50 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
14d60 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
14d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14d80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
14da0 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
14db0 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
14dc0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
14dd0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
14de0 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
14df0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
14e00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
14e10 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
14e20 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
14e30 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
14e40 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
14e50 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
14e60 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
14e70 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
14e80 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
14e90 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
14ea0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
14eb0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
14ec0 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
14ed0 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
14ee0 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
14ef0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
14f00 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
14f10 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
14f20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
14f30 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
14f40 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
14f50 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
14f60 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
14f70 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
14f80 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
14f90 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
14fa0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
14fb0 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
14fc0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
14fd0 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
14fe0 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
14ff0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
15000 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
15010 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
15020 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
15030 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
15040 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
15050 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
15060 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
15070 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
15080 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
15090 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
150a0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
150b0 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
150c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
150d0 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
150e0 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
150f0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
15100 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
15110 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
15120 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
15130 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15140 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
15150 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
15160 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
15170 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65  rMask ){ .    re
15180 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
15190 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
151a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
151b0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
151c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
151d0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
151e0 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
151f0 74 65 72 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  ter );..  /* Mar
15200 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
15210 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
15220 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
15230 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
15240 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
15250 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
15260 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
15270 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20  */.  pPg->dirty 
15280 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
15290 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
152a0 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61  g->inStmt || pPa
152b0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
152c0 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
152d0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
152e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
152f0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
15300 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
15310 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
15320 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
15330 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
15340 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
15350 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
15360 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
15370 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
15380 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
15390 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
153a0 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
153b0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
153c0 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
153d0 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
153e0 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
153f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
15400 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
15410 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
15420 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
15430 62 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b  begin(pData, 0);
15440 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15460 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15470 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15480 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
15490 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
154a0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
154b0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
154c0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
154d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
154e0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
154f0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
15500 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15510 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
15520 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
15530 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
15540 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
15550 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
15560 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
15570 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
15580 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
15590 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
155a0 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
155b0 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
155c0 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
155d0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
155e0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
155f0 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
15600 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
15610 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
15620 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
15630 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
15640 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
15650 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
15660 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
15670 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
15680 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
15690 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
156a0 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
156b0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
156c0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
156d0 50 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20  Pg;.        u32 
156e0 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69  saved;.        i
156f0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
15700 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
15710 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
15720 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
15730 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  er);.          T
15740 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
15750 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  d page %d\n", pP
15760 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d  ager->fd.h, pPg-
15770 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
15780 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
15790 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
157a0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f         pHist->pO
157b0 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  rig = sqliteMall
157c0 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
157d0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
157e0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
157f0 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
15800 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
15810 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f  t->pOrig, PGHDR_
15820 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
15830 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
15840 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15850 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15860 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
15870 0a 20 20 20 20 20 20 20 20 20 20 43 4f 44 45 43  .          CODEC
15880 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
15890 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
158a0 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
158b0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
158c0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
158d0 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
158e0 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a    saved = *(u32*
158f0 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  )PGHDR_TO_EXTRA(
15900 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
15910 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62          store32b
15920 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20  its(cksum, pPg, 
15930 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  );.          szP
15950 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g = pPager->page
15960 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20  Size+8;.        
15970 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50    store32bits(pP
15980 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34  g->pgno, pPg, -4
15990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
159a0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
159b0 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
159c0 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d  ((char*)pData)[-
159d0 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20  4], szPg);.     
159e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
159f0 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b  rnalOff += szPg;
15a00 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
15a10 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  4("JOURNAL %d pa
15a20 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
15a30 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
15a40 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
15a50 66 64 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  fd.h, pPg->pgno,
15a60 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
15a70 0a 20 20 20 20 20 20 20 20 20 20 43 4f 44 45 43  .          CODEC
15a80 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
15a90 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  pPg->pgno, 0);. 
15aa0 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29           *(u32*)
15ab0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
15ac0 50 67 2c 20 70 50 61 67 65 72 29 20 3d 20 73 61  Pg, pPager) = sa
15ad0 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ved;.          i
15ae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15b00 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
15b10 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
15b20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
15b30 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
15b40 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20  GER_ERR_FULL;.  
15b50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15b60 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
15b70 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
15b80 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
15b90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
15ba0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
15bb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
15bc0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
15bd0 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
15be0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
15bf0 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  &7);.          p
15c00 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
15c10 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
15c20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
15c30 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
15c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
15c50 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
15c60 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
15c70 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
15c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67  .            pag
15c90 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
15ca0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  st(pPg);.       
15cb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15cc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15cd0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
15ce0 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
15cf0 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
15d00 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
15d10 20 20 20 20 20 20 20 20 54 52 41 43 45 34 28 22          TRACE4("
15d20 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
15d30 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
15d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15d50 20 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20    pPager->fd.h, 
15d60 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
15d70 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
15d80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
15d90 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
15da0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
15db0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
15dc0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69    }.      pPg->i
15dd0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
15de0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
15df0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
15e00 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
15e10 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
15e20 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
15e30 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
15e40 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
15e50 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
15e60 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
15e70 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
15e80 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
15e90 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
15ea0 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
15eb0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
15ec0 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
15ed0 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
15ee0 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
15ef0 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
15f00 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
15f10 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
15f20 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
15f30 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
15f40 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
15f50 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
15f60 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
15f70 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
15f80 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
15f90 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
15fa0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
15fb0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
15fc0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
15fd0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
15fe0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
15ff0 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t->pStmt==0 );. 
16000 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
16010 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
16020 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
16030 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
16040 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
16050 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
16060 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
16070 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Stmt, PGHDR_TO_D
16080 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
16090 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
160a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
160b0 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
160c0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
160d0 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c  ", pPager->fd.h,
160e0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
160f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16100 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50    store32bits(pP
16110 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34  g->pgno, pPg, -4
16120 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
16130 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
16140 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
16150 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16160 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
16170 65 72 2d 3e 73 74 66 64 2c 28 28 63 68 61 72 2a  er->stfd,((char*
16180 29 70 44 61 74 61 29 2d 34 2c 20 70 50 61 67 65  )pData)-4, pPage
16190 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a  r->pageSize+4);.
161a0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
161b0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
161c0 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  page %d\n", pPag
161d0 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d 3e 70  er->fd.h, pPg->p
161e0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  gno);.        CO
161f0 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
16200 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29  a, pPg->pgno, 0)
16210 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16230 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16240 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
16250 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
16260 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
16270 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
16280 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ULL;.          r
16290 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
162a0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
162b0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
162c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
162d0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
162e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
162f0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
16300 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
16310 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
16320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
16330 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
16340 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
16350 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
16360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
16370 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
16380 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
16390 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50  ->dbSize<(int)pP
163a0 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
163b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
163c0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  pPg->pgno;.    i
163d0 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
163e0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
163f0 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
16400 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
16410 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
16420 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
16430 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16440 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
16450 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
16460 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
16470 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
16480 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
16490 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
164a0 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
164b0 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
164c0 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
164d0 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
164e0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
164f0 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
16500 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65  te3pager_iswrite
16510 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61  able(void *pData
16520 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
16530 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
16540 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
16550 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a   pPg->dirty;.}..
16560 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
16570 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
16580 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
16590 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
165a0 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
165b0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
165c0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76   sqlite3pager_ov
165d0 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
165e0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
165f0 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
16600 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
16610 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
16620 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
16630 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
16640 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
16650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16670 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
16680 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
16690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
166a0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c     memcpy(pPage,
166b0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
166c0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
166d0 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
166e0 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
166f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
16710 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
16720 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
16730 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
16740 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
16750 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
16760 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70  ation on page "p
16770 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65  gno" back to the
16780 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
16790 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
167a0 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
167b0 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
167c0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
167d0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
167e0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
167f0 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
16800 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
16810 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
16820 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
16830 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
16840 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
16850 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
16860 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
16870 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
16880 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
16890 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
168a0 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
168b0 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  * sqlite3pager_d
168c0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62  ont_rollback() b
168d0 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
168e0 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
168f0 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
16900 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
16910 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
16920 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
16930 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
16940 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
16950 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
16960 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
16970 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
16980 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
16990 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70  alls to sqlite3p
169a0 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
169b0 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
169c0 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
169d0 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
169e0 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
169f0 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
16a00 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
16a10 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
16a20 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
16a30 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
16a40 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
16a50 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
16a60 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
16a70 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
16a80 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
16a90 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
16aa0 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
16ab0 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
16ac0 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
16ad0 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
16ae0 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
16af0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
16b00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16b10 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
16b20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e  used,.** the don
16b30 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  t_rollback() rou
16b40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
16b50 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
16b60 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a   page contains.*
16b70 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  * critical data,
16b80 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
16b90 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
16ba0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  s rolled back in
16bb0 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65   spite.** of the
16bc0 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
16bd0 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   call..*/.void s
16be0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
16bf0 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  _write(Pager *pP
16c00 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
16c10 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
16c20 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72  .  if( MEMDB ) r
16c30 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20  eturn;..  pPg = 
16c40 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
16c50 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50  ger, pgno);.  pP
16c60 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
16c70 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  k = 1;.  if( pPg
16c80 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29   && pPg->dirty )
16c90 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
16ca0 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
16cb0 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
16cc0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
16cd0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
16ce0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
16cf0 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
16d00 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
16d10 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
16d20 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
16d30 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
16d40 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
16d50 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
16d60 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
16d70 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
16d80 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
16d90 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
16da0 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
16db0 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
16dc0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
16dd0 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
16de0 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
16df0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
16e00 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
16e10 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
16e20 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
16e30 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
16e40 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
16e50 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
16e60 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
16e70 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
16e80 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
16e90 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
16ea0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
16eb0 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
16ec0 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
16ed0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
16ee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43  else{.      TRAC
16ef0 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
16f00 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
16f10 20 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66   pgno, pPager->f
16f20 64 2e 68 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  d.h);.      pPg-
16f30 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
16f40 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
16f50 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
16f60 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
16f70 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
16f80 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
16f90 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
16fa0 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
16fb0 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
16fc0 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
16fd0 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
16fe0 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
16ff0 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
17000 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
17010 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
17020 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
17030 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
17040 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
17050 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ck(void *pData){
17060 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
17070 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
17080 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
17090 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
170a0 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  ger;..  if( pPag
170b0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
170c0 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50  _EXCLUSIVE || pP
170d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
170e0 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
170f0 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
17100 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
17110 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
17120 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65  ck || MEMDB ) re
17130 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
17140 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
17150 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
17160 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
17170 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
17180 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
17190 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
171a0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
171b0 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
171c0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
171d0 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
171e0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
171f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
17200 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
17210 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
17220 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
17230 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
17240 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  ;.      page_add
17250 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
17260 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  g);.    }.    TR
17270 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
17280 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
17290 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
172a0 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
172b0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
172c0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21  ->stmtInUse && !
172d0 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28  pPg->inStmt && (
172e0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
172f0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
17300 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
17310 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
17320 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
17330 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
17340 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
17350 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
17360 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  t!=0 );.    pPag
17370 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
17380 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
17390 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
173a0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
173b0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
173c0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  }.}.../*.** Clea
173d0 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c  r a PgHistory bl
173e0 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ock.*/.static vo
173f0 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  id clearHistory(
17400 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
17410 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
17420 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20  pHist->pOrig);. 
17430 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
17440 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69  t->pStmt);.  pHi
17450 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20  st->pOrig = 0;. 
17460 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
17470 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  0;.}../*.** Comm
17480 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
17490 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
174a0 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
174b0 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
174c0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
174d0 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
174e0 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
174f0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
17500 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
17510 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
17520 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
17530 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
17540 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
17550 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
17560 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61  3pager_commit(Pa
17570 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
17580 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
17590 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
175a0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41  ger->errMask==PA
175b0 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
175c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
175d0 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
175e0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
175f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17600 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
17610 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
17620 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17630 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
17640 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
17650 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
17660 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
17670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
17680 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
17690 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
176a0 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
176b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
176c0 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f    }.  TRACE2("CO
176d0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67  MMIT %d\n", pPag
176e0 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28  er->fd.h);.  if(
176f0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
17700 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
17710 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
17720 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
17730 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63  ( pPg ){.      c
17740 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44  learHistory(PGHD
17750 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
17760 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70  Pager));.      p
17770 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
17780 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
17790 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
177a0 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
177b0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
177c0 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
177d0 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
177e0 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72   pPg = pPg->pDir
177f0 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ty;.    }.#ifnde
17800 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72  f NDEBUG.    for
17810 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
17820 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
17830 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
17840 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
17850 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
17860 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
17870 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
17880 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
17890 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
178a0 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
178b0 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
178c0 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
178d0 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
178e0 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  f.    pPager->pS
178f0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
17900 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
17910 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
17920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17930 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
17940 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
17950 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20   ){.    /* Exit 
17960 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64  early (without d
17970 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f  oing the time-co
17980 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f  nsuming sqlite3O
17990 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20  sSync() calls). 
179a0 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68     ** if there h
179b0 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e  ave been no chan
179c0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
179d0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
179e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
179f0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
17a00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
17a10 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
17a20 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
17a30 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20  dbSize = -1;.   
17a40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
17a50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17a60 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
17a70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
17a80 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72  ager_sync(pPager
17a90 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
17aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17ab0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f   goto commit_abo
17ac0 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  rt;.  }.  rc = p
17ad0 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
17ae0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
17af0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
17b00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20  .  return rc;.. 
17b10 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
17b20 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
17b30 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20  rong during the 
17b40 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
17b50 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72    */.commit_abor
17b60 74 3a 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  t:.  sqlite3page
17b70 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
17b80 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
17b90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
17ba0 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
17bb0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
17bc0 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
17bd0 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
17be0 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
17bf0 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
17c00 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
17c10 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
17c20 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
17c30 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
17c40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17c50 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
17c60 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
17c70 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
17c80 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
17c90 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
17ca0 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45  protocol (SQLITE
17cb0 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e  _PROTOCOL) or un
17cc0 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
17cd0 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
17ce0 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
17cf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
17d00 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
17d10 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
17d20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
17d30 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
17d40 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
17d50 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
17d60 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
17d70 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
17d80 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
17d90 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
17da0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
17db0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
17dc0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67  ger_rollback(Pag
17dd0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17de0 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28  nt rc;.  TRACE2(
17df0 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
17e00 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
17e10 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
17e20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
17e30 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
17e40 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
17e50 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
17e60 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
17e70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
17e80 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
17e90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
17ea0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
17eb0 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
17ec0 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
17ed0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
17ee0 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  r))->pOrig );.  
17ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
17f00 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
17f10 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
17f20 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b  ager))->pStmt );
17f30 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
17f40 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
17f50 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f    pHist = PGHDR_
17f60 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
17f70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  r);.      if( pH
17f80 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
17f90 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
17fa0 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
17fb0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61  Hist->pOrig, pPa
17fc0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17fd0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
17fe0 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64  ROLLBACK-PAGE %d
17ff0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   of %d\n", p->pg
18000 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  no, pPager->fd.h
18010 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18020 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
18030 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
18040 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
18050 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  no, pPager->fd.h
18060 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18070 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
18080 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ist);.      p->d
18090 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
180a0 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  p->inJournal = 0
180b0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d  ;.      p->inStm
180c0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
180d0 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70  pPrevStmt = p->p
180e0 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20  NextStmt = 0;.. 
180f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
18100 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
18110 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
18120 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f  einiter(PGHDR_TO
18130 5f 44 41 54 41 28 70 29 2c 20 70 50 61 67 65 72  _DATA(p), pPager
18140 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
18150 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
18160 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  }.    pPager->pS
18170 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
18180 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
18190 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
181a0 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e  ;.    memoryTrun
181b0 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
181c0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
181d0 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
181e0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
181f0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
18200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18210 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
18220 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
18230 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
18240 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
18250 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
18260 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
18270 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
18280 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75  e = -1;.    retu
18290 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
182a0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
182b0 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  k!=0 && pPager->
182c0 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45  errMask!=PAGER_E
182d0 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  RR_FULL ){.    i
182e0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
182f0 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
18300 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
18310 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
18320 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
18330 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
18340 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
18350 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18360 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
18370 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
18380 32 2c 20 72 63 33 3b 0a 20 20 20 20 72 63 20 3d  2, rc3;.    rc =
18390 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
183a0 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
183b0 20 72 63 32 20 3d 20 70 61 67 65 72 5f 74 72 75   rc2 = pager_tru
183c0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
183d0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
183e0 29 3b 0a 20 20 20 20 72 63 33 20 3d 20 70 61 67  );.    rc3 = pag
183f0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
18400 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
18410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18420 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
18430 0a 20 20 20 20 20 20 69 66 28 20 72 63 33 20 29  .      if( rc3 )
18440 20 72 63 20 3d 20 72 63 33 3b 0a 20 20 20 20 7d   rc = rc3;.    }
18450 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
18460 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
18470 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
18480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18490 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
184a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 20  QLITE_CORRUPT;  
184b0 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20  /* bkpt-CORRUPT 
184c0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  */.    pPager->e
184d0 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
184e0 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ERR_CORRUPT;.  }
184f0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
18500 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
18510 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18520 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
18530 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
18540 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
18550 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
18560 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
18570 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
18580 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
18590 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
185a0 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  r_isreadonly(Pag
185b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
185c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
185d0 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
185e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
185f0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
18600 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
18610 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
18620 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28  ite3pager_stats(
18630 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
18640 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39    static int a[9
18650 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
18660 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
18670 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
18680 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
18690 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
186a0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
186b0 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
186c0 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
186d0 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
186e0 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Mask;.  a[6] = p
186f0 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
18700 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
18710 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50  iss;.  a[8] = pP
18720 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72  ager->nOvfl;.  r
18730 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn a;.}../*.*
18740 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
18750 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
18760 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
18770 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
18780 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
18790 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
187a0 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
187b0 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
187c0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
187d0 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
187e0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
187f0 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
18800 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
18810 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
18820 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
18830 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
18840 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
18850 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  begin(Pager *pPa
18860 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
18870 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
18880 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
18890 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  E];.  assert( !p
188a0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
188b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
188c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
188d0 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d  );.  TRACE2("STM
188e0 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 70  T-BEGIN %d\n", p
188f0 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
18900 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
18910 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
18920 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
18930 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
18940 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
18950 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18960 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
18970 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18980 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
18990 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
189a0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
189b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
189c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
189d0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
189e0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
189f0 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
18a00 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
18a10 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
18a20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d  pPager->aInStmt=
18a30 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
18a40 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  3OsLock(&pPager-
18a50 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
18a60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
18a70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
18a80 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
18a90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
18aa0 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
18ab0 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73  >jfd, &pPager->s
18ac0 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
18ad0 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
18ae0 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
18af0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18b00 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61  stmtJSize == pPa
18b10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
18b20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
18b30 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
18b40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18b50 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
18b60 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
18b70 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
18b80 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
18b90 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
18ba0 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
18bb0 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
18bc0 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
18bd0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
18be0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
18bf0 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50  ntemp(zTemp, &pP
18c00 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
18c10 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
18c20 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
18c30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
18c40 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  mtOpen = 1;.    
18c50 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
18c60 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
18c70 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
18c80 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
18c90 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65  TE_OK;. .stmt_be
18ca0 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  gin_failed:.  if
18cb0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
18cc0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  t ){.    sqliteF
18cd0 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  ree(pPager->aInS
18ce0 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
18cf0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
18d00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18d10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
18d20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
18d30 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
18d40 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67  _stmt_commit(Pag
18d50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
18d60 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
18d70 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
18d80 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
18d90 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
18da0 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70  -COMMIT %d\n", p
18db0 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
18dc0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
18dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
18de0 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66  eek(&pPager->stf
18df0 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20  d, 0);.      /* 
18e00 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
18e10 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  e(&pPager->stfd,
18e20 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
18e30 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
18e40 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
18e50 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
18e60 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
18e70 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
18e80 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
18e90 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
18ea0 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
18eb0 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73  xtStmt;.      as
18ec0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d  sert( pPg->inStm
18ed0 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  t );.      pPg->
18ee0 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
18ef0 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
18f00 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
18f10 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
18f20 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
18f30 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
18f40 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
18f50 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
18f60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
18f70 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
18f80 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
18f90 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
18fa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
18fb0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
18fc0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
18fd0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
18fe0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
18ff0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
19000 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
19010 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
19020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19030 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
19040 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
19050 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
19060 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  mt_rollback(Page
19070 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
19080 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
19090 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
190a0 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d  .    TRACE2("STM
190b0 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
190c0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
190d0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
190e0 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
190f0 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  Pg;.      for(pP
19100 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
19110 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
19120 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20  NextStmt){.     
19130 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
19140 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
19150 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
19160 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
19170 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
19180 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
19190 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
191a0 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  ), pHist->pStmt,
191b0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
191c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
191d0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
191e0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
191f0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
19200 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
19210 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
19220 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
19230 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
19240 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63       memoryTrunc
19250 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
19260 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
19270 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
19280 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73      rc = pager_s
19290 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  tmt_playback(pPa
192a0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
192b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
192c0 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
192d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
192e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
192f0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
19300 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
19310 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19320 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19330 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
19340 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19350 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
19360 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
19370 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  filename(Pager *
19380 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
19390 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
193a0 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
193b0 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
193c0 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
193d0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
193e0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
193f0 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67  ager_dirname(Pag
19400 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
19410 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44  eturn pPager->zD
19420 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a  irectory;.}../*.
19430 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
19440 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
19450 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
19460 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
19470 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75  sqlite3pager_jou
19480 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
19490 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
194a0 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
194b0 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  al;.}../*.** Set
194c0 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
194d0 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
194e0 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
194f0 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65  et_codec(.  Page
19500 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
19510 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64  d (*xCodec)(void
19520 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
19530 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
19540 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72  cArg.){.  pPager
19550 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65  ->xCodec = xCode
19560 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  c;.  pPager->pCo
19570 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41  decArg = pCodecA
19580 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rg;.}../*.** Thi
19590 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
195a0 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
195b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
195c0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
195d0 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
195e0 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
195f0 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
19600 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
19610 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
19620 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
19630 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b  {.  void *pPage;
19640 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72  .  PgHdr *pPgHdr
19650 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  ;.  u32 change_c
19660 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63  ounter;.  int rc
19670 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  ;..  /* Open pag
19680 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
19690 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
196a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
196b0 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
196c0 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66  1, &pPage);.  if
196d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
196e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
196f0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
19700 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
19710 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19720 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
19730 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63  .  /* Read the c
19740 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20  urrent value at 
19750 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50  byte 24. */.  pP
19760 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50  gHdr = DATA_TO_P
19770 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63  GHDR(pPage);.  c
19780 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
19790 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70  retrieve32bits(p
197a0 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f  PgHdr, 24);..  /
197b0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
197c0 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
197d0 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
197e0 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
197f0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
19800 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69  r++;.  store32bi
19810 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  ts(change_counte
19820 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a  r, pPgHdr, 24);.
19830 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68  .  /* Release th
19840 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
19850 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61  . */.  sqlite3pa
19860 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
19870 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19880 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
19890 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
198a0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
198b0 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
198c0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
198d0 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
198e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
198f0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
19900 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
19910 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
19920 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
19930 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
19940 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
19950 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
19960 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
19970 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
19980 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
19990 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
199a0 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
199b0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
199c0 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72   synced, all dir
199d0 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ty pages written
199e0 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
199f0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
19a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
19a10 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20  ynced. The only 
19a20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65  thing that.** re
19a30 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
19a40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
19a50 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
19a60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
19a70 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  r.** master jour
19a80 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
19a90 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
19aa0 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
19ab0 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
19ac0 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
19ad0 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
19ae0 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
19af0 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  an sqlite3pager_
19b00 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  sync() call..*/.
19b10 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
19b20 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  _sync(Pager *pPa
19b30 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
19b40 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
19b50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19b60 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
19b70 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
19b80 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
19b90 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
19ba0 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
19bb0 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
19bc0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
19bd0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
19be0 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
19bf0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
19c00 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45  ER_SYNCED && !ME
19c10 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
19c20 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
19c30 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
19c40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19c50 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
19c60 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73  .    /* If a mas
19c70 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19c80 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
19c90 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
19ca0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  o the.    ** jou
19cb0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
19cc0 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  no sync is requi
19cd0 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e  red. This happen
19ce0 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20  s when it is.   
19cf0 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65   ** written, the
19d00 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61  n the process fa
19d10 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66  ils to upgrade f
19d20 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74  rom a RESERVED t
19d30 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  o an.    ** EXCL
19d40 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20  USIVE lock. The 
19d50 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72  next time the pr
19d60 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63  ocess tries to c
19d70 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  ommit the.    **
19d80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
19d90 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68   m-j name will h
19da0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
19db0 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
19dc0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
19dd0 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20  ->setMaster ){. 
19de0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
19df0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
19e00 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
19e10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19e20 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
19e30 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  exit;.      rc =
19e40 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
19e50 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
19e60 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
19e70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19e80 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
19e90 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
19ea0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
19eb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19ec0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
19ed0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
19ee0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
19ef0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
19f00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19f10 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
19f20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
19f30 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
19f40 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
19f50 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
19f60 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
19f70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
19f80 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
19f90 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
19fa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
19fb0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
19fc0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
19fd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19fe0 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66  sSync(&pPager->f
19ff0 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  d);.    }..    p
1a000 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1a010 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
1a020 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72  ..sync_exit:.  r
1a030 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1a040 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a050 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
1a060 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
1a070 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1a080 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Data to location
1a090 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
1a0a0 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  e. .**.** There 
1a0b0 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
1a0c0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72  ences to the cur
1a0d0 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20  rent page pgno. 
1a0e0 49 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a  If current page.
1a0f0 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  ** pgno is not a
1a100 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f  lready in the ro
1a110 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
1a120 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  it is not writte
1a130 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79  n there by.** by
1a140 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54   this routine. T
1a150 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20  he same applies 
1a160 74 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74  to the page pDat
1a170 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65  a refers to on e
1a180 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20  ntry to.** this 
1a190 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
1a1a0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1a1b0 20 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f   page refered to
1a1c0 20 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e   by pData remain
1a1d0 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
1a1e0 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
1a1f0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
1a200 68 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e  h page pData (i.
1a210 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
1a220 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
1a230 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
1a240 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
1a250 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
1a260 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1a270 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
1a280 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
1a290 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
1a2a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1a2b0 73 20 63 61 6c 6c 65 64 2c 20 68 6f 77 65 76 65  s called, howeve
1a2c0 72 20 69 74 20 69 73 20 0a 2a 2a 20 69 6c 6c 65  r it is .** ille
1a2d0 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  gal to call this
1a2e0 20 72 6f 75 74 69 6e 65 20 69 66 20 61 20 73 74   routine if a st
1a2f0 61 74 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  atment transacti
1a300 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
1a310 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1a320 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65 72  r_movepage(Pager
1a330 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 2a   *pPager, void *
1a340 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e 6f  pData, Pgno pgno
1a350 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1a360 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1a370 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72 20  pData);.  PgHdr 
1a380 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20  *pPgOld; .  int 
1a390 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  h;..  assert( !p
1a3a0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1a3b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1a3c0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
1a3d0 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
1a3e0 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61  om it's hash-cha
1a3f0 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
1a400 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1a410 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1a420 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
1a430 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
1a440 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 20 65  ge-number pgno e
1a450 78 69 73 74 73 2c 20 72 65 6d 6f 76 65 20 69 74  xists, remove it
1a460 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20  .  ** from it's 
1a470 68 61 73 68 20 63 68 61 69 6e 2e 0a 20 20 2a 2f  hash chain..  */
1a480 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
1a490 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1a4a0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
1a4b0 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gOld ){.    asse
1a4c0 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66  rt( pPgOld->nRef
1a4d0 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  ==0 );.    unlin
1a4e0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
1a4f0 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  r, pPgOld);.    
1a500 70 50 67 4f 6c 64 2d 3e 64 69 72 74 79 20 3d 20  pPgOld->dirty = 
1a510 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61  0;.  }..  /* Cha
1a520 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
1a530 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
1a540 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
1a550 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
1a560 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e  n. */.  pPg->pgn
1a570 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
1a580 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
1a590 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1a5a0 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
1a5b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a5c0 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1a5d0 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ash==0 );.    pP
1a5e0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1a5f0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1a600 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
1a610 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
1a620 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67  aHash[h];.  pPag
1a630 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1a640 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76  Pg;.  pPg->pPrev
1a650 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67  Hash = 0;..  pPg
1a660 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70  ->dirty = 1;.  p
1a670 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1a680 65 20 3d 20 31 3b 0a 0a 20 20 72 65 74 75 72 6e  e = 1;..  return
1a690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1a6a0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
1a6b0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1a6c0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1a6d0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1a6e0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
1a6f0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66 69   state of the fi
1a700 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20  le lock for the 
1a710 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
1a720 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1a730 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f   is one of NO_LO
1a740 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
1a750 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a   RESERVED_LOCK,.
1a760 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c  ** PENDING_LOCK,
1a770 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
1a780 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
1a790 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74  e3pager_lockstat
1a7a0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1a7b0 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53 54  {.#ifdef OS_TEST
1a7c0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1a7d0 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70  ->fd->fd.locktyp
1a7e0 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  e;.#else.  retur
1a7f0 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c 6f 63  n pPager->fd.loc
1a800 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a  ktype;.#endif.}.
1a810 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1a820 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1a830 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67   Print a listing
1a840 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63   of all referenc
1a850 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ed pages and the
1a860 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f  ir ref count..*/
1a870 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
1a880 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72  er_refdump(Pager
1a890 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
1a8a0 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
1a8b0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
1a8c0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1a8d0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
1a8e0 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
1a8f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
1a900 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1a910 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72  f("PAGE %3d addr
1a920 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20  =%p nRef=%d\n", 
1a930 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  .       pPg->pgn
1a940 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
1a950 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
1a960 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.