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

Artifact 9ce238f9540eb56b21fef085dc038dffca75835b:


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: 31 20 32 30 30 34 2f 31 31 2f 30 33 20 30 38 3a  1 2004/11/03 08:
0360: 34 34 3a 30 36 20 64 61 6e 69 65 6c 6b 31 39 37  44:06 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 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
152f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
15300 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
15310 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
15320 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
15330 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72  ds to be.  ** wr
15340 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
15350 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
15360 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
15370 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  nt journal.  ** 
15380 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
15390 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
153a0 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
153b0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
153c0 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
153d0 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
153e0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a  it does not..  *
153f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
15400 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
15410 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20  _UNLOCK );.  rc 
15420 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
15430 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a  egin(pData, 0);.
15440 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15450 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
15460 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
15470 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
15480 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
15490 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  D );.  if( !pPag
154a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
154b0 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
154c0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
154d0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
154e0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
154f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15500 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
15510 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
15520 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
15530 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
15540 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70  seJournal );.  p
15550 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
15560 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65  e = 1;..  /* The
15570 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
15580 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
15590 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
155a0 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a  SERVED or an.  *
155b0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
155c0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
155d0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
155e0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
155f0 61 67 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  age to.  ** the 
15600 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
15610 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
15620 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
15630 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d    */.  if( !pPg-
15640 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
15650 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
15660 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20  l || MEMDB) ){. 
15670 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
15680 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
15690 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
156a0 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20       int szPg;. 
156b0 20 20 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a       u32 saved;.
156c0 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
156d0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
156e0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
156f0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
15700 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
15710 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41    TRACE3("JOURNA
15720 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
15730 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70   pPager->fd.h, p
15740 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
15750 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
15760 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20  ->pOrig==0 );.  
15770 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72        pHist->pOr
15780 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ig = sqliteMallo
15790 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
157a0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
157b0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
157c0 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ig ){.          
157d0 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
157e0 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
157f0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
15800 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
15810 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
15820 65 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  e{.        u32 c
15830 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 43 4f  ksum;.        CO
15840 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
15850 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
15860 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
15870 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
15880 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
15890 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
158a0 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
158b0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
158c0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
158d0 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
158e0 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 70 50 61  (cksum, pPg, pPa
158f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15900 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
15910 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
15920 38 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  8;.        store
15930 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f  32bits(pPg->pgno
15940 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20  , pPg, -4);.    
15950 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15960 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
15970 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70  >jfd, &((char*)p
15980 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29  Data)[-4], szPg)
15990 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
159a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
159b0 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 54 52  szPg;.        TR
159c0 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE4("JOURNAL %d
159d0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
159e0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
159f0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
15a00 3e 66 64 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f  >fd.h, pPg->pgno
15a10 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
15a20 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28  ;.        CODEC(
15a30 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
15a40 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  Pg->pgno, 0);.  
15a50 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48        *(u32*)PGH
15a60 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
15a70 20 70 50 61 67 65 72 29 20 3d 20 73 61 76 65 64   pPager) = saved
15a80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15a90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15aa0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15ab0 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
15ac0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
15ad0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
15ae0 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
15af0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ULL;.          r
15b00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
15b10 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
15b20 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
15b30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15b40 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
15b50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
15b60 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
15b70 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
15b80 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
15b90 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  ;.        pPg->n
15ba0 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
15bb0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
15bc0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
15bd0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
15be0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
15bf0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
15c00 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
15c10 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
15c20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
15c30 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
15c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15c60 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
15c70 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
15c80 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
15c90 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
15ca0 20 20 20 54 52 41 43 45 34 28 22 41 50 50 45 4e     TRACE4("APPEN
15cb0 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
15cc0 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
15cd0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
15ce0 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d 3e 70 67  r->fd.h, pPg->pg
15cf0 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
15d00 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  c);.    }.    if
15d10 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
15d20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
15d30 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
15d40 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 69 6e     }.    pPg->in
15d50 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 7d  Journal = 1;.  }
15d60 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74  ..  /* If the st
15d70 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
15d80 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
15d90 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
15da0 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  t,.  ** then wri
15db0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
15dc0 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
15dd0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
15de0 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ote that.  ** th
15df0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
15e00 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
15e10 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
15e20 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
15e30 6d 61 74 0a 20 20 2a 2a 20 69 6e 20 74 68 61 74  mat.  ** in that
15e40 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
15e50 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
15e60 68 65 61 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  header..  */.  i
15e70 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
15e80 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
15e90 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
15ea0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
15eb0 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
15ec0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
15ed0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
15ee0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
15ef0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
15f00 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
15f10 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
15f20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
15f30 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
15f40 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
15f50 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
15f60 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 48 69 73  =0 );.      pHis
15f70 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  t->pStmt = sqlit
15f80 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
15f90 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
15fa0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
15fb0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
15fc0 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
15fd0 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f  pStmt, PGHDR_TO_
15fe0 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
15ff0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
16000 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
16010 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
16020 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
16030 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50  pPager->fd.h, pP
16040 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 65  g->pgno);.    }e
16050 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  lse{.      store
16060 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f  32bits(pPg->pgno
16070 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20  , pPg, -4);.    
16080 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
16090 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
160a0 2c 20 37 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 7);.      rc =
160b0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
160c0 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 28  &pPager->stfd, (
160d0 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c  (char*)pData)-4,
160e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
160f0 65 2b 34 29 3b 0a 20 20 20 20 20 20 54 52 41 43  e+4);.      TRAC
16100 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
16110 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
16120 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50  pPager->fd.h, pP
16130 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
16140 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
16150 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
16160 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
16170 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
16190 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
161a0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ger);.        pP
161b0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
161c0 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b   PAGER_ERR_FULL;
161d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
161e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
161f0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
16200 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ec++;.      asse
16210 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
16220 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
16230 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
16240 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
16250 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
16260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
16270 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
16280 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  t(pPg);.  }..  /
16290 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
162a0 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
162b0 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
162c0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
162d0 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  <(int)pPg->pgno 
162e0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
162f0 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
16300 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  o;.    if( !MEMD
16310 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  B && pPager->dbS
16320 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize==PENDING_BYT
16330 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
16340 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
16350 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20  er->dbSize++;.  
16360 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16370 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
16380 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
16390 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
163a0 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
163b0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
163c0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70  d.** to sqlite3p
163d0 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49  ager_write().  I
163e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
163f0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
16400 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
16410 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
16420 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
16430 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
16440 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69  _iswriteable(voi
16450 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
16460 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
16470 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
16480 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
16490 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
164a0 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
164b0 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  t of a single pa
164c0 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f  ge with the info
164d0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74  rmation in the t
164e0 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  hird.** argument
164f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16500 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28  pager_overwrite(
16510 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
16520 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
16530 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a  pData){.  void *
16540 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pPage;.  int rc;
16550 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
16560 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
16570 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b  , pgno, &pPage);
16580 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
165a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
165b0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
165c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
165d0 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  K ){.      memcp
165e0 79 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20  y(pPage, pData, 
165f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
16610 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
16620 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
16630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16640 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
16650 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
16660 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
16670 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
16680 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
16690 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
166a0 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63   page "pgno" bac
166b0 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
166c0 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
166d0 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
166e0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
166f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
16700 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
16710 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
16720 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
16730 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
16740 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
16750 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
16760 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
16770 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
16780 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
16790 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
167a0 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
167b0 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
167c0 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
167d0 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
167e0 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
167f0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
16800 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
16810 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
16820 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
16830 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
16840 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
16850 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
16860 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
16870 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
16880 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
16890 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
168a0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
168b0 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
168c0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
168d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
168e0 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
168f0 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
16900 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
16910 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
16920 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
16930 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
16940 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
16950 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
16960 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
16970 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
16980 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
16990 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
169a0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
169b0 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
169c0 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
169d0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
169e0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
169f0 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
16a00 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
16a10 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
16a20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
16a30 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
16a40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
16a50 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
16a60 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
16a70 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
16a80 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
16a90 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f  ause the page co
16aa0 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63  ntains.** critic
16ab0 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
16ac0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
16ad0 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64  e it gets rolled
16ae0 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a   back in spite.*
16af0 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f  * of the dont_ro
16b00 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
16b10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
16b20 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50  ger_dont_write(P
16b30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
16b40 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
16b50 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d  r *pPg;..  if( M
16b60 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a  EMDB ) return;..
16b70 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
16b80 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
16b90 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79  o);.  pPg->alway
16ba0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
16bb0 20 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d   if( pPg && pPg-
16bc0 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66  >dirty ){.    if
16bd0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
16be0 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
16bf0 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
16c00 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
16c10 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
16c20 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
16c30 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
16c40 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
16c50 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
16c60 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
16c70 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
16c80 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
16c90 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
16ca0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
16cb0 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
16cc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16cd0 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
16ce0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
16cf0 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
16d00 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
16d10 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
16d20 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
16d30 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
16d40 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
16d50 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
16d60 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
16d70 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
16d80 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
16d90 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
16da0 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
16db0 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
16dc0 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
16dd0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
16de0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
16df0 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
16e00 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
16e10 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
16e20 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
16e30 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
16e40 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70  f %d\n", pgno, p
16e50 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
16e60 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
16e70 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
16e80 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
16e90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
16ea0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
16eb0 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
16ec0 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
16ed0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
16ee0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
16ef0 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
16f00 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
16f10 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
16f20 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
16f30 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
16f40 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
16f50 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
16f60 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ournal..*/.void 
16f70 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
16f80 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20  t_rollback(void 
16f90 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
16fa0 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
16fb0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
16fc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
16fd0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
16fe0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
16ff0 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e!=PAGER_EXCLUSI
17000 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  VE || pPager->jo
17010 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72  urnalOpen==0 ) r
17020 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
17030 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
17040 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61   || pPager->alwa
17050 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45  ysRollback || ME
17060 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  MDB ) return;.  
17070 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
17080 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
17090 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
170a0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
170b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
170c0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
170d0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
170e0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
170f0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
17100 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
17110 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
17120 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
17130 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
17140 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
17150 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
17160 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
17170 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
17180 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
17190 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
171a0 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f  }.    TRACE3("DO
171b0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
171c0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
171d0 67 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d  g->pgno, pPager-
171e0 3e 66 64 2e 68 29 3b 0a 20 20 7d 0a 20 20 69 66  >fd.h);.  }.  if
171f0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
17200 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53  Use && !pPg->inS
17210 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  tmt && (int)pPg-
17220 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
17230 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  tmtSize ){.    a
17240 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
17250 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
17260 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
17270 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
17280 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17290 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
172a0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
172b0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
172c0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
172d0 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61  o&7);.    page_a
172e0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
172f0 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  pPg);.  }.}.../*
17300 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
17310 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
17320 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
17330 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
17340 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
17350 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
17360 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46  Orig);.  sqliteF
17370 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
17380 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
17390 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
173a0 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pStmt = 0;.}../*
173b0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
173c0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
173d0 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
173e0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
173f0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
17400 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
17410 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
17420 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
17430 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
17440 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
17450 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
17460 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
17470 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
17480 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
17490 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
174a0 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
174b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
174c0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
174d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
174e0 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f  Mask==PAGER_ERR_
174f0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
17500 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
17510 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
17520 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
17540 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
17550 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
17560 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
17570 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
17580 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
17590 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
175a0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
175b0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
175c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
175d0 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
175e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
175f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52  _ERROR;.  }.  TR
17600 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
17610 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
17620 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
17630 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
17640 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
17650 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
17660 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
17670 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
17680 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
17690 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
176a0 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
176b0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
176c0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
176d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
176e0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
176f0 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
17700 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
17710 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
17720 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
17730 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
17740 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
17750 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
17760 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
17770 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
17780 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
17790 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
177a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
177b0 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
177c0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
177d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
177e0 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
177f0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
17800 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
17810 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
17820 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
17830 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
17840 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
17850 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
17860 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
17870 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  f( pPager->dirty
17880 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Cache==0 ){.    
17890 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77  /* Exit early (w
178a0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65  ithout doing the
178b0 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20   time-consuming 
178c0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
178d0 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66  calls).    ** if
178e0 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
178f0 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74   no changes to t
17900 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17910 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
17920 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
17930 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  c==0 );.    rc =
17940 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
17950 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
17960 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
17970 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
17980 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
17990 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
179a0 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20  lOpen );.  rc = 
179b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
179c0 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  c(pPager, 0);.  
179d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
179e0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f  K ){.    goto co
179f0 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a  mmit_abort;.  }.
17a00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
17a10 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
17a20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
17a30 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ze = -1;.  retur
17a40 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  n rc;..  /* Jump
17a50 20 68 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e   here if anythin
17a60 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72  g goes wrong dur
17a70 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
17a80 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d  rocess..  */.com
17a90 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 73 71 6c  mit_abort:.  sql
17aa0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
17ab0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ck(pPager);.  re
17ac0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17ad0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
17ae0 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
17af0 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
17b00 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
17b10 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
17b20 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
17b30 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
17b40 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
17b50 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
17b60 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
17b70 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
17b80 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
17b90 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
17ba0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
17bb0 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
17bc0 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
17bd0 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
17be0 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   (SQLITE_PROTOCO
17bf0 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  L) or unless som
17c00 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
17c10 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
17c20 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
17c30 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
17c40 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
17c50 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
17c60 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
17c70 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
17c80 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
17c90 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
17ca0 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
17cb0 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
17cc0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
17cd0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
17ce0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
17cf0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
17d00 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
17d10 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
17d20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43   TRACE2("ROLLBAC
17d30 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  K %d\n", pPager-
17d40 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 4d 45  >fd.h);.  if( ME
17d50 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72  MDB ){.    PgHdr
17d60 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
17d70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20  Pager->pAll; p; 
17d80 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  p=p->pNextAll){.
17d90 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
17da0 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73  *pHist;.      as
17db0 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73  sert( !p->always
17dc0 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
17dd0 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20    if( !p->dirty 
17de0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
17df0 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
17e00 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
17e10 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72  p, pPager))->pOr
17e20 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ig );.        as
17e30 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
17e40 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
17e50 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
17e60 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  pStmt );.       
17e70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
17e80 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20   }..      pHist 
17e90 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
17ea0 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  p, pPager);.    
17eb0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
17ec0 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  ig ){.        me
17ed0 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
17ee0 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f  TA(p), pHist->pO
17ef0 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  rig, pPager->pag
17f00 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
17f10 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b  TRACE3("ROLLBACK
17f20 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e  -PAGE %d of %d\n
17f30 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 70 50 61 67  ", p->pgno, pPag
17f40 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20  er->fd.h);.     
17f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17f60 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
17f70 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
17f80 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 70 50 61 67  ", p->pgno, pPag
17f90 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20  er->fd.h);.     
17fa0 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69   }.      clearHi
17fb0 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20  story(pHist);.  
17fc0 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30      p->dirty = 0
17fd0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75  ;.      p->inJou
17fe0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
17ff0 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  p->inStmt = 0;. 
18000 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d       p->pPrevStm
18010 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74  t = p->pNextStmt
18020 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
18030 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
18040 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
18050 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
18060 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
18070 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
18080 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
18090 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50     .    }.    pP
180a0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
180b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
180c0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ize = pPager->or
180d0 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65  igDbSize;.    me
180e0 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
180f0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
18100 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
18110 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
18120 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
18130 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
18140 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
18150 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72  if( !pPager->dir
18160 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67  tyCache || !pPag
18170 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18180 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
18190 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
181a0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
181b0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
181c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
181d0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
181e0 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20  ->errMask!=0 && 
181f0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
18200 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20  =PAGER_ERR_FULL 
18210 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
18220 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
18230 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
18240 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
18250 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
18260 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
18270 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
18280 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
18290 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
182a0 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
182b0 20 20 69 6e 74 20 72 63 32 2c 20 72 63 33 3b 0a    int rc2, rc3;.
182c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
182d0 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
182e0 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70  er);.    rc2 = p
182f0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
18300 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6f 72  ager, pPager->or
18310 69 67 44 62 53 69 7a 65 29 3b 0a 20 20 20 20 72  igDbSize);.    r
18320 63 33 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  c3 = pager_unwri
18330 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
18340 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18360 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69  c = rc2;.      i
18370 66 28 20 72 63 33 20 29 20 72 63 20 3d 20 72 63  f( rc3 ) rc = rc
18380 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  3;.    }.  }else
18390 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
183a0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
183b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
183c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
183d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
183e0 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d  RRUPT;  /* bkpt-
183f0 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 70  CORRUPT */.    p
18400 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
18410 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  = PAGER_ERR_CORR
18420 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  UPT;.  }.  pPage
18430 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
18440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18450 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
18460 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
18470 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
18480 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
18490 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
184a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
184b0 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
184c0 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
184d0 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64  ite3pager_isread
184e0 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
184f0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
18500 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
18510 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
18520 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
18530 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
18540 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
18550 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65  int *sqlite3page
18560 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70  r_stats(Pager *p
18570 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
18580 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30   int a[9];.  a[0
18590 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
185a0 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
185b0 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
185c0 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
185d0 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
185e0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
185f0 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
18600 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
18610 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20  ger->errMask;.  
18620 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
18630 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
18640 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
18650 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f  [8] = pPager->nO
18660 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  vfl;.  return a;
18670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
18680 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
18690 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  back point..**.*
186a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
186b0 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
186c0 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
186d0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
186e0 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
186f0 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a   new statement j
18700 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65  ournal is create
18710 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  d that can be us
18720 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ed to rollback.*
18730 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73  * changes of a s
18740 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  ingle SQL comman
18750 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65  d within a large
18760 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  r transaction..*
18770 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
18780 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61  er_stmt_begin(Pa
18790 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
187a0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
187b0 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
187c0 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73  NAME_SIZE];.  as
187d0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
187e0 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73  tmtInUse );.  as
187f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
18800 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41  Size>=0 );.  TRA
18810 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
18820 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
18830 64 2e 68 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  d.h);.  if( MEMD
18840 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
18850 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
18860 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
18870 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
18880 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
18890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
188a0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
188b0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
188c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
188d0 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
188e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
188f0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
18900 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18910 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72  Open );.  pPager
18920 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->aInStmt = sqli
18930 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
18940 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
18950 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
18960 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  aInStmt==0 ){.  
18970 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28    sqlite3OsLock(
18980 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  &pPager->fd, SHA
18990 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72  RED_LOCK);.    r
189a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
189b0 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  EM;.  }.#ifndef 
189c0 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71  NDEBUG.  rc = sq
189d0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
189e0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  &pPager->jfd, &p
189f0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
18a00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
18a10 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
18a20 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  iled;.  assert( 
18a30 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
18a40 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e == pPager->jou
18a50 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69  rnalOff );.#endi
18a60 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f.  pPager->stmt
18a70 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  JSize = pPager->
18a80 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
18a90 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
18aa0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
18ab0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  .  pPager->stmtH
18ac0 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  drOff = 0;.  pPa
18ad0 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d  ger->stmtCksum =
18ae0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
18af0 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  it;.  if( !pPage
18b00 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
18b10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
18b20 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54  ager_opentemp(zT
18b30 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  emp, &pPager->st
18b40 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fd);.    if( rc 
18b50 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
18b60 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
18b70 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
18b80 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
18b90 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
18ba0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
18bb0 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
18bc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18bd0 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
18be0 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
18bf0 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
18c00 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
18c10 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
18c20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
18c30 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
18c40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18c50 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
18c60 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
18c70 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
18c80 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
18c90 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
18ca0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
18cb0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
18cc0 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43  *pNext;.    TRAC
18cd0 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
18ce0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
18cf0 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20 21 4d  d.h);.    if( !M
18d00 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71  EMDB ){.      sq
18d10 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
18d20 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
18d30 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
18d40 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65  sTruncate(&pPage
18d50 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a  r->stfd, 0); */.
18d60 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
18d70 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
18d80 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  t );.      pPage
18d90 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
18da0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50      }.    for(pP
18db0 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
18dc0 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
18dd0 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
18de0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
18df0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
18e00 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  g->inStmt );.   
18e10 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
18e20 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
18e30 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
18e40 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
18e50 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
18e60 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
18e70 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
18e80 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
18e90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
18ea0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
18eb0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
18ec0 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
18ed0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
18ee0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
18ef0 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20  tmtNRec = 0;.   
18f00 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
18f10 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
18f20 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
18f30 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
18f40 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
18f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18f60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
18f70 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
18f80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18f90 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62  pager_stmt_rollb
18fa0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
18fb0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
18fc0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
18fd0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41  InUse ){.    TRA
18fe0 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41  CE2("STMT-ROLLBA
18ff0 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  CK %d\n", pPager
19000 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69 66 28  ->fd.h);.    if(
19010 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
19020 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
19030 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
19040 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
19050 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  g=pPg->pNextStmt
19060 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
19070 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
19080 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
19090 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
190a0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
190b0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
190c0 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
190d0 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74  DATA(pPg), pHist
190e0 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d  ->pStmt, pPager-
190f0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
19100 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
19110 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
19120 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
19130 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
19140 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
19150 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
19160 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
19170 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d  tSize;.      mem
19180 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
19190 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
191a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
191b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
191c0 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
191d0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
191e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70    }.    sqlite3p
191f0 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
19200 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
19210 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
19220 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
19230 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
19240 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
19250 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
19260 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
19270 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
19280 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
19290 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
192a0 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65  e3pager_filename
192b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
192c0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
192d0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ->zFilename;.}..
192e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
192f0 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
19300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
19310 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
19320 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72  sqlite3pager_dir
19330 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
19340 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
19350 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
19360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19370 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
19380 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
19390 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
193a0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
193b0 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65  ager_journalname
193c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
193d0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
193e0 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
193f0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
19400 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
19410 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
19420 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63  3pager_set_codec
19430 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
19440 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  r,.  void (*xCod
19450 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
19460 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
19470 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
19480 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
19490 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
194a0 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
194b0 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f   pCodecArg;.}../
194c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
194d0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
194e0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
194f0 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
19500 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
19510 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
19520 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
19530 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19540 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
19550 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
19560 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64  *pPager){.  void
19570 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72   *pPage;.  PgHdr
19580 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20   *pPgHdr;.  u32 
19590 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
195a0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
195b0 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
195c0 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
195d0 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ing. */.  rc = s
195e0 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
195f0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67  pPager, 1, &pPag
19600 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
19610 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
19620 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
19630 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
19640 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
19650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
19660 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65  urn rc;..  /* Re
19670 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ad the current v
19680 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e  alue at byte 24.
19690 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44   */.  pPgHdr = D
196a0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61  ATA_TO_PGHDR(pPa
196b0 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f  ge);.  change_co
196c0 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65  unter = retrieve
196d0 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32  32bits(pPgHdr, 2
196e0 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  4);..  /* Increm
196f0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
19700 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
19710 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
19720 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
19730 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73  e_counter++;.  s
19740 74 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e 67  tore32bits(chang
19750 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48 64  e_counter, pPgHd
19760 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65  r, 24);..  /* Re
19770 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
19780 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73  eference. */.  s
19790 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
197a0 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  f(pPage);.  retu
197b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
197c0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
197d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
197e0 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
197f0 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
19800 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
19810 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
19820 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
19830 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
19840 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
19850 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
19860 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
19870 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
19880 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
19890 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
198a0 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
198b0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
198c0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
198d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
198e0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
198f0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
19900 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
19910 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
19920 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19930 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
19940 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
19950 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
19960 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
19970 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
19980 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
19990 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
199a0 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
199b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
199c0 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
199d0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
199e0 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
199f0 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
19a00 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
19a10 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
19a20 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
19a30 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63  e3pager_sync() c
19a40 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  all..*/.int sqli
19a50 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61  te3pager_sync(Pa
19a60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
19a70 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
19a80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
19a90 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
19aa0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
19ab0 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
19ac0 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19ad0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
19ae0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
19af0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
19b00 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
19b10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
19b20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19b30 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
19b40 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70  D && !MEMDB && p
19b50 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
19b60 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
19b70 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
19b80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19b90 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Open );..    /* 
19ba0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
19bb0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
19bc0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
19bd0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
19be0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
19bf0 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
19c00 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
19c10 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
19c20 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
19c30 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
19c40 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
19c50 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
19c60 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
19c70 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
19c80 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
19c90 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
19ca0 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
19cb0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
19cc0 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
19cd0 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
19ce0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
19cf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19d00 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
19d10 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
19d20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
19d30 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
19d40 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
19d50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
19d60 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
19d70 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
19d80 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
19d90 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
19da0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19db0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
19dc0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63  c_exit;.      rc
19dd0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
19de0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
19df0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19e00 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
19e10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19e20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
19e30 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
19e40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
19e50 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
19e60 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
19e70 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  s(pPager);.    r
19e80 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
19e90 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
19ea0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19eb0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
19ec0 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53  _exit;..    /* S
19ed0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
19ee0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
19ef0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
19f00 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
19f10 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
19f20 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
19f30 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  }..    pPager->s
19f40 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
19f50 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  CED;.  }..sync_e
19f60 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  xit:.  return rc
19f70 3b 0a 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 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  UUM../*.** Move 
19fa0 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
19fb0 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20  ied by pData to 
19fc0 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
19fd0 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
19fe0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
19ff0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
1a000 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1a010 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65  e pgno. If curre
1a020 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20  nt page.** pgno 
1a030 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
1a040 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
1a050 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
1a060 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20  t written there 
1a070 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f  by.** by this ro
1a080 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20  utine. The same 
1a090 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70  applies to the p
1a0a0 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73  age pData refers
1a0b0 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a   to on entry to.
1a0c0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1a0d0 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
1a0e0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65  s to the page re
1a0f0 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74  fered to by pDat
1a100 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  a remain valid. 
1a110 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
1a120 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
1a130 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1a140 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20  Data (i.e. data 
1a150 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
1a160 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
1a170 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
1a180 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
1a190 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1a1a0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1a1b0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
1a1c0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
1a1d0 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
1a1e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1a1f0 2c 20 68 6f 77 65 76 65 72 20 69 74 20 69 73 20  , however it is 
1a200 0a 2a 2a 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63  .** illegal to c
1a210 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
1a220 20 69 66 20 61 20 73 74 61 74 6d 65 6e 74 20 74   if a statment t
1a230 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
1a240 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
1a250 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61  ite3pager_movepa
1a260 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1a270 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 50  , void *pData, P
1a280 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
1a290 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
1a2a0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
1a2b0 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
1a2c0 20 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73   .  int h;..  as
1a2d0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
1a2e0 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73  tmtInUse );.  as
1a2f0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
1a300 30 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  0 );..  /* Unlin
1a310 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
1a320 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20  hash-chain */.  
1a330 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
1a340 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20  pPager, pPg);.. 
1a350 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
1a360 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65   contains a page
1a370 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
1a380 72 20 70 67 6e 6f 20 65 78 69 73 74 73 2c 20 72  r pgno exists, r
1a390 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
1a3a0 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
1a3b0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c  in..  */.  pPgOl
1a3c0 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  d = pager_lookup
1a3d0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
1a3e0 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
1a3f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f      assert( pPgO
1a400 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  ld->nRef==0 );. 
1a410 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61     unlinkHashCha
1a420 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c  in(pPager, pPgOl
1a430 64 29 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d 3e  d);.    pPgOld->
1a440 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  dirty = 0;.  }..
1a450 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
1a460 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
1a470 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69  pPg and insert i
1a480 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68  t into the new h
1a490 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20  ash-chain. */.  
1a4a0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
1a4b0 3b 0a 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61  ;.  h = pager_ha
1a4c0 73 68 28 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  sh(pgno);.  if( 
1a4d0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
1a4e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a4f0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
1a500 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
1a510 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
1a520 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
1a530 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  h = pPg;.  }.  p
1a540 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
1a550 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
1a560 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
1a570 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50  h[h] = pPg;.  pP
1a580 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
1a590 3b 0a 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20  ;..  pPg->dirty 
1a5a0 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 1;.  pPager->d
1a5b0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a  irtyCache = 1;..
1a5c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a5d0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
1a5e0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1a5f0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1a600 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
1a610 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1a620 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
1a630 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20  f the file lock 
1a640 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
1a650 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ger..** The retu
1a660 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20  rn value is one 
1a670 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52  of NO_LOCK, SHAR
1a680 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
1a690 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49  D_LOCK,.** PENDI
1a6a0 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c  NG_LOCK, or EXCL
1a6b0 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69  USIVE_LOCK..*/.i
1a6c0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1a6d0 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20  lockstate(Pager 
1a6e0 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
1a6f0 20 4f 53 5f 54 45 53 54 0a 20 20 72 65 74 75 72   OS_TEST.  retur
1a700 6e 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 66 64  n pPager->fd->fd
1a710 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6c 73 65  .locktype;.#else
1a720 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1a730 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23  ->fd.locktype;.#
1a740 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a  endif.}.#endif..
1a750 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1a760 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  ST./*.** Print a
1a770 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20   listing of all 
1a780 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  referenced pages
1a790 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63   and their ref c
1a7a0 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
1a7b0 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 64 75  lite3pager_refdu
1a7c0 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  mp(Pager *pPager
1a7d0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1a7e0 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
1a7f0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
1a800 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
1a810 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
1a820 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Ref<=0 ) continu
1a830 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e;.    sqlite3De
1a840 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20  bugPrintf("PAGE 
1a850 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %3d addr=%p nRef
1a860 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
1a870 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52  pPg->pgno, PGHDR
1a880 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1a890 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d  Pg->nRef);.  }.}
1a8a0 0a 23 65 6e 64 69 66 0a                          .#endif.