/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 868c67e4ff8a1785c06caaf483fddb5a95013af0:


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: 33 20 32 30 30 34 2f 31 31 2f 30 35 20 31 36 3a  3 2004/11/05 16:
0360: 33 37 3a 30 33 20 64 61 6e 69 65 6c 6b 31 39 37  37:03 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 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
17aa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17ab0 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
17ac0 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20  abort;.  }.  rc 
17ad0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
17ae0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ock(pPager);.  p
17af0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
17b00 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
17b10 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
17b20 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
17b30 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74  s wrong during t
17b40 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
17b50 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61  s..  */.commit_a
17b60 62 6f 72 74 3a 0a 20 20 73 71 6c 69 74 65 33 70  bort:.  sqlite3p
17b70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
17b80 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
17b90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
17ba0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
17bb0 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
17bc0 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
17bd0 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
17be0 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
17bf0 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
17c00 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
17c10 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
17c20 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
17c30 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
17c40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
17c50 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
17c60 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
17c70 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
17c80 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
17c90 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
17ca0 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
17cb0 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
17cc0 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
17cd0 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
17ce0 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
17cf0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
17d00 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
17d10 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
17d20 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
17d30 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
17d40 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
17d50 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
17d60 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
17d70 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
17d80 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
17d90 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
17da0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
17db0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
17dc0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
17dd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
17de0 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43    int rc;.  TRAC
17df0 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
17e00 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
17e10 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
17e20 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
17e30 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
17e40 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
17e50 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
17e60 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
17e70 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
17e80 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
17e90 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
17ea0 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
17eb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
17ec0 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
17ed0 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
17ee0 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
17ef0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17f00 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
17f10 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
17f20 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
17f30 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
17f40 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
17f50 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
17f60 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
17f70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
17f80 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
17f90 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
17fa0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
17fb0 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
17fc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17fd0 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
17fe0 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45  3("ROLLBACK-PAGE
17ff0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d   %d of %d\n", p-
18000 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66  >pgno, pPager->f
18010 64 2e 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  d.h);.      }els
18020 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  e{.        TRACE
18030 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c  3("PAGE %d is cl
18040 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d  ean on %d\n", p-
18050 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66  >pgno, pPager->f
18060 64 2e 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d.h);.      }.  
18070 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
18080 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
18090 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
180a0 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
180b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
180c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
180d0 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  p->pPrevStmt = p
180e0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
180f0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
18100 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
18110 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
18120 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52  >xReiniter(PGHDR
18130 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50 61  _TO_DATA(p), pPa
18140 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
18150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
18160 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
18170 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
18180 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
18190 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
181a0 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54  ize;.    memoryT
181b0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
181c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
181d0 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
181e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
181f0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
18200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18210 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
18220 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
18230 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
18240 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
18250 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
18260 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
18270 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
18280 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
18290 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
182a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
182b0 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65  Mask!=0 && pPage
182c0 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45  r->errMask!=PAGE
182d0 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
182e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
182f0 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
18300 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
18310 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
18320 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
18330 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
18340 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
18350 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
18360 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
18370 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERVED ){.    int
18380 20 72 63 32 2c 20 72 63 33 3b 0a 20 20 20 20 72   rc2, rc3;.    r
18390 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64  c = pager_reload
183a0 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
183b0 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
183c0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
183d0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
183e0 69 7a 65 29 3b 0a 20 20 20 20 72 63 33 20 3d 20  ize);.    rc3 = 
183f0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
18400 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
18410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18420 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
18430 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c2;.      if( rc
18440 33 20 29 20 72 63 20 3d 20 72 63 33 3b 0a 20 20  3 ) rc = rc3;.  
18450 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
18460 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
18470 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
18480 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
18490 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
184a0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
184b0 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55  ;  /* bkpt-CORRU
184c0 50 54 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  PT */.    pPager
184d0 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
184e0 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
184f0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
18500 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
18510 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18520 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
18530 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18540 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
18550 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
18560 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
18570 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
18580 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
18590 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
185a0 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
185b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
185c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
185d0 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
185e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
185f0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
18600 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
18610 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
18620 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61  sqlite3pager_sta
18630 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
18640 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
18650 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  a[9];.  a[0] = p
18660 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
18670 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
18680 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
18690 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
186a0 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
186b0 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
186c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
186d0 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
186e0 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20  errMask;.  a[6] 
186f0 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
18700 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
18710 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
18720 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
18730 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f    return a;.}../
18740 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
18750 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
18760 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
18770 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
18780 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
18790 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
187a0 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
187b0 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
187c0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
187d0 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
187e0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
187f0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
18800 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
18810 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
18820 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
18830 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
18840 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
18850 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  mt_begin(Pager *
18860 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
18870 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  c;.  char zTemp[
18880 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
18890 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28  SIZE];.  assert(
188a0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
188b0 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
188c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
188d0 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22  =0 );.  TRACE2("
188e0 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
188f0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
18900 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
18910 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
18920 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70  InUse = 1;.    p
18930 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
18940 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
18950 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
18960 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
18970 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
18980 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50  alOpen ){.    pP
18990 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
189a0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  en = 1;.    retu
189b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
189c0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
189d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
189e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
189f0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
18a00 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
18a10 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
18a20 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
18a30 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  mt==0 ){.    sql
18a40 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
18a50 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
18a60 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OCK);.    return
18a70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18a80 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
18a90 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  G.  rc = sqlite3
18aa0 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
18ab0 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
18ac0 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
18ad0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
18ae0 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
18af0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18b00 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20  r->stmtJSize == 
18b10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18b20 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  ff );.#endif.  p
18b30 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
18b40 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
18b50 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
18b60 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
18b70 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50  er->dbSize;.  pP
18b80 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
18b90 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
18ba0 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67  stmtCksum = pPag
18bb0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
18bc0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74   if( !pPager->st
18bd0 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  mtOpen ){.    rc
18be0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
18bf0 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
18c00 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
18c10 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
18c20 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
18c30 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  led;.    pPager-
18c40 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >stmtOpen = 1;. 
18c50 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
18c60 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
18c70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
18c80 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
18c90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74  QLITE_OK;. .stmt
18ca0 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
18cb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
18cc0 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
18cd0 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
18ce0 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
18cf0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
18d00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18d10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
18d20 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  it a statement..
18d30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
18d40 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
18d50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
18d60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
18d70 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
18d80 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
18d90 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53  t;.    TRACE2("S
18da0 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
18db0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
18dc0 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
18dd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18de0 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
18df0 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  stfd, 0);.      
18e00 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  /* sqlite3OsTrun
18e10 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74  cate(&pPager->st
18e20 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
18e30 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
18e40 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a  ger->aInStmt );.
18e50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
18e60 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
18e70 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
18e80 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
18e90 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
18ea0 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
18eb0 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
18ec0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
18ed0 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
18ee0 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
18ef0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
18f00 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
18f10 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
18f20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
18f30 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
18f40 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
18f50 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
18f60 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
18f70 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
18f80 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48  tmt);.        pH
18f90 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
18fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18fb0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
18fc0 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
18fd0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
18fe0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
18ff0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
19000 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
19010 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
19020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19030 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
19040 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
19050 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
19060 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50  _stmt_rollback(P
19070 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19080 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
19090 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
190a0 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22   ){.    TRACE2("
190b0 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
190c0 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
190d0 68 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  h);.    if( MEMD
190e0 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  B ){.      PgHdr
190f0 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
19100 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
19110 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
19120 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
19130 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
19140 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
19150 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
19160 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
19170 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
19180 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
19190 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
191a0 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
191b0 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
191c0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
191d0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
191e0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
191f0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
19200 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
19210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
19220 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
19230 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
19240 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
19250 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
19260 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19270 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
19280 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
19290 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
192a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
192b0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
192c0 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
192d0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
192e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
192f0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
19300 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
19310 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19320 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
19330 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
19340 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19350 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
19360 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
19370 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
19380 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
19390 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
193a0 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
193b0 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
193c0 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
193d0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
193e0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
193f0 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28  e3pager_dirname(
19400 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19410 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
19420 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
19430 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19440 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
19450 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
19460 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
19470 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
19480 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  journalname(Page
19490 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
194a0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
194b0 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
194c0 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
194d0 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
194e0 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
194f0 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50  r_set_codec(.  P
19500 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
19510 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76  void (*xCodec)(v
19520 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
19530 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
19540 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
19550 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
19560 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
19570 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
19580 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ecArg;.}../*.** 
19590 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
195a0 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
195b0 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
195c0 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
195d0 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
195e0 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
195f0 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
19600 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19610 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
19620 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
19630 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61  er){.  void *pPa
19640 67 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  ge;.  PgHdr *pPg
19650 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67  Hdr;.  u32 chang
19660 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74  e_counter;.  int
19670 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20   rc;..  /* Open 
19680 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
19690 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
196a0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
196b0 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
196c0 72 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, 1, &pPage);. 
196d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
196e0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
196f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
19700 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
19710 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19720 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
19730 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  c;..  /* Read th
19740 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
19750 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  at byte 24. */. 
19760 20 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54   pPgHdr = DATA_T
19770 4f 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a  O_PGHDR(pPage);.
19780 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
19790 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74   = retrieve32bit
197a0 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a  s(pPgHdr, 24);..
197b0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
197c0 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
197d0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
197e0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
197f0 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
19800 6e 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33  nter++;.  store3
19810 32 62 69 74 73 28 63 68 61 6e 67 65 5f 63 6f 75  2bits(change_cou
19820 6e 74 65 72 2c 20 70 50 67 48 64 72 2c 20 32 34  nter, pPgHdr, 24
19830 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
19840 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
19850 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nce. */.  sqlite
19860 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
19870 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ge);.  return SQ
19880 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19890 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
198a0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
198b0 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
198c0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
198d0 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
198e0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
198f0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
19900 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
19910 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
19920 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
19930 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
19940 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
19950 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
19960 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
19970 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
19980 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
19990 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
199a0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
199b0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
199c0 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
199d0 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
199e0 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
199f0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
19a00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19a10 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
19a20 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
19a30 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
19a40 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
19a50 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
19a60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19a70 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
19a80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
19a90 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
19aa0 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
19ab0 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
19ac0 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
19ad0 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
19ae0 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
19af0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67  to an sqlite3pag
19b00 65 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a  er_sync() call..
19b10 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
19b20 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
19b30 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
19b40 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
19b50 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
19b60 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
19b70 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
19b80 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
19b90 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
19ba0 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67  e3pager_sync(Pag
19bb0 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
19bc0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
19bd0 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20   Pgno nTrunc){. 
19be0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19bf0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  _OK;..  /* If th
19c00 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
19c10 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
19c20 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
19c30 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
19c40 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
19c50 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
19c60 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
19c70 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
19c80 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
19c90 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
19ca0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
19cb0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
19cc0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
19cd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19ce0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
19cf0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
19d00 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19d10 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
19d20 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
19d30 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
19d40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
19d50 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
19d60 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
19d70 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
19d80 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
19d90 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
19da0 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
19db0 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
19dc0 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
19dd0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
19de0 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
19df0 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
19e00 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
19e10 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
19e20 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
19e30 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
19e40 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
19e50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
19e60 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
19e70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
19e80 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
19e90 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  ounter(pPager);.
19ea0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19eb0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
19ec0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
19ed0 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72  rc = writeMaster
19ee0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
19ef0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
19f00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19f10 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
19f20 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  it;.      rc = s
19f30 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
19f40 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
19f50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
19f60 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
19f70 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
19f80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
19f90 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75  UUM.    if( nTru
19fa0 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  nc!=0 ){.      r
19fb0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
19fc0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
19fd0 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20  , nTrunc);.     
19fe0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19ff0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1a000 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  xit;.    }.#endi
1a010 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  f..    /* Write 
1a020 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1a030 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1a040 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  file */.    pPg 
1a050 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
1a060 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
1a070 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  er);.    rc = pa
1a080 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1a090 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  st(pPg);.    if(
1a0a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a0b0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1a0c0 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
1a0d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1a0e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
1a0f0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
1a100 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a110 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  3OsSync(&pPager-
1a120 3e 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >fd);.    }..   
1a130 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1a140 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
1a150 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20   }..sync_exit:. 
1a160 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1a170 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a180 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
1a190 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
1a1a0 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
1a1b0 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69   pData to locati
1a1c0 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
1a1d0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile. .**.** Ther
1a1e0 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
1a1f0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63  erences to the c
1a200 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f  urrent page pgno
1a210 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67  . If current pag
1a220 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74  e.** pgno is not
1a230 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1a240 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1a250 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74  , it is not writ
1a260 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20  ten there by.** 
1a270 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
1a280 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65   The same applie
1a290 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44  s to the page pD
1a2a0 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e  ata refers to on
1a2b0 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69   entry to.** thi
1a2c0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1a2d0 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
1a2e0 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20  he page refered 
1a2f0 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61  to by pData rema
1a300 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
1a310 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
1a320 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
1a330 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28  ith page pData (
1a340 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
1a350 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
1a360 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
1a370 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
1a380 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
1a390 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1a3a0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
1a3b0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
1a3c0 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
1a3d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1a3e0 20 69 73 20 63 61 6c 6c 65 64 2c 20 68 6f 77 65   is called, howe
1a3f0 76 65 72 20 69 74 20 69 73 20 0a 2a 2a 20 69 6c  ver it is .** il
1a400 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74 68  legal to call th
1a410 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 61 20  is routine if a 
1a420 73 74 61 74 6d 65 6e 74 20 74 72 61 6e 73 61 63  statment transac
1a430 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
1a440 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1a450 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67  ger_movepage(Pag
1a460 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
1a470 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67   *pData, Pgno pg
1a480 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
1a490 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
1a4a0 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64  R(pData);.  PgHd
1a4b0 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e  r *pPgOld; .  in
1a4c0 74 20 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t h;..  assert( 
1a4d0 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
1a4e0 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  se );.  assert( 
1a4f0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
1a500 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20    /* Unlink pPg 
1a510 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63  from it's hash-c
1a520 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  hain */.  unlink
1a530 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
1a540 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  , pPg);..  /* If
1a550 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
1a560 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
1a570 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
1a580 20 65 78 69 73 74 73 2c 20 72 65 6d 6f 76 65 20   exists, remove 
1a590 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27  it.  ** from it'
1a5a0 73 20 68 61 73 68 20 63 68 61 69 6e 2e 0a 20 20  s hash chain..  
1a5b0 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  */.  pPgOld = pa
1a5c0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1a5d0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
1a5e0 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73  pPgOld ){.    as
1a5f0 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52  sert( pPgOld->nR
1a600 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c  ef==0 );.    unl
1a610 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
1a620 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20  ger, pPgOld);.  
1a630 20 20 70 50 67 4f 6c 64 2d 3e 64 69 72 74 79 20    pPgOld->dirty 
1a640 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
1a650 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e  hange the page n
1a660 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e  umber for pPg an
1a670 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
1a680 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68   the new hash-ch
1a690 61 69 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70  ain. */.  pPg->p
1a6a0 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20  gno = pgno;.  h 
1a6b0 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e  = pager_hash(pgn
1a6c0 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  o);.  if( pPager
1a6d0 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20  ->aHash[h] ){.  
1a6e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a6f0 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
1a700 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
1a710 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
1a720 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
1a730 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  g;.  }.  pPg->pN
1a740 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
1a750 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50  ->aHash[h];.  pP
1a760 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
1a770 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72   pPg;.  pPg->pPr
1a780 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70  evHash = 0;..  p
1a790 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
1a7a0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1a7b0 63 68 65 20 3d 20 31 3b 0a 0a 20 20 72 65 74 75  che = 1;..  retu
1a7c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a7d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1a7e0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1a7f0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1a800 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
1a810 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1a820 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
1a830 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68  file lock for th
1a840 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
1a850 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
1a860 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f  ue is one of NO_
1a870 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
1a880 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
1a890 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ,.** PENDING_LOC
1a8a0 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  K, or EXCLUSIVE_
1a8b0 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  LOCK..*/.int sql
1a8c0 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74  ite3pager_lockst
1a8d0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
1a8e0 72 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45  r){.#ifdef OS_TE
1a8f0 53 54 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ST.  return pPag
1a900 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74  er->fd->fd.lockt
1a910 79 70 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ype;.#else.  ret
1a920 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c  urn pPager->fd.l
1a930 6f 63 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a  ocktype;.#endif.
1a940 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1a950 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
1a960 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
1a970 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
1a980 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
1a990 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
1a9a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
1a9b0 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67  ager_refdump(Pag
1a9c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
1a9d0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
1a9e0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
1a9f0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
1aa00 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
1aa10 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
1aa20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1aa30 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1aa40 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
1aa50 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
1aa60 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
1aa70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
1aa80 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
1aa90 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
1aaa0 66 0a                                            f.