/ Hex Artifact Content
Login

Artifact a96b9c43664670576e41eac699277c7862d604d8:


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 32 33  : pager.c,v 1.23
0350: 36 20 32 30 30 36 2f 30 31 2f 31 31 20 32 31 3a  6 2006/01/11 21:
0360: 34 31 3a 32 32 20 64 72 68 20 45 78 70 20 24 0a  41:22 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28  .#define TRACE1(
0440: 58 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  X)       sqlite3
0450: 44 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23  DebugPrintf(X).#
0460: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0470: 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  Y)     sqlite3De
0480: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23  bugPrintf(X,Y).#
0490: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
04a0: 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65  Y,Z)   sqlite3De
04b0: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29  bugPrintf(X,Y,Z)
04c0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
04d0: 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33  X,Y,Z,W) sqlite3
04e0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04f0: 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Z,W).#define TRA
0500: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0530: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
0540: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
0550: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0560: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c  define TRACE4(X,
0580: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0590: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
05a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
05b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
05c0: 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 64   macros are used
05d0: 20 77 69 74 68 69 6e 20 74 68 65 20 54 52 41 43   within the TRAC
05e0: 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76  EX() macros abov
05f0: 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75  e.** to print ou
0600: 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  t file-descripto
0610: 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52  rs. .**.** PAGER
0620: 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69  ID() takes a poi
0630: 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
0640: 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20 61  struct as it's a
0650: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0660: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0670: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0680: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
0690: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
06a0: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
06b0: 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e   as it's argumen
06c0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  t..*/.#define PA
06d0: 47 45 52 49 44 28 70 29 20 46 49 4c 45 48 41 4e  GERID(p) FILEHAN
06e0: 44 4c 45 49 44 28 26 28 70 29 2d 3e 66 64 29 0a  DLEID(&(p)->fd).
06f0: 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44  #define FILEHAND
0700: 4c 45 49 44 28 66 64 29 20 28 73 71 6c 69 74 65  LEID(fd) (sqlite
0710: 33 4f 73 46 69 6c 65 48 61 6e 64 6c 65 28 26 66  3OsFileHandle(&f
0720: 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  d))../*.** The p
0730: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0740: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0750: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0760: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0770: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
0780: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
0790: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07a0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07b0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07d0: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
07e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
07f0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0820: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0830: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0860: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
0870: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0880: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0890: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08a0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08b0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
08c0: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
08d0: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
08e0: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0900: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0910: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0920: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0950: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0960: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0970: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
0980: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
0990: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09a0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
09d0: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
09e0: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
09f0: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a10: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a20: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a30: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a40: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a50: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0a60: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0a70: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0a80: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0aa0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0ab0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0ac0: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0af0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b00: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b10: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b20: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b30: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b50: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0b60: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0b70: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0ba0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bb0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0bc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0bd0: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0be0: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0bf0: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c00: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c10: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c20: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c30: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0c60: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0c70: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0c80: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ca0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cb0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0cc0: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0cf0: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d00: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74 68   is to remove th
0d10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0d20: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
0d30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
0d50: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
0d70: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0d80: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0d90: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0da0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0db0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0dc0: 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 6f  te3pager_get() o
0dd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0de0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0df0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0e00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0e10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0e20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0e30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0e40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0e50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0e60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0e70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0e80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 70 61 67   that sqlite3pag
0e90: 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61  er_write() is ca
0ea0: 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20  lled, the state 
0eb0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a  transitions to.*
0ec0: 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
0ed0: 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71  .  (Note that sq
0ee0: 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28  lite_page_write(
0ef0: 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a  ) can only be.**
0f00: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75   called on an ou
0f10: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77  tstanding page w
0f20: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
0f30: 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a  the pager must.*
0f40: 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48  * be in PAGER_SH
0f50: 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74  ARED before it t
0f60: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41  ransitions to PA
0f70: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a  GER_RESERVED.).*
0f80: 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  * The transition
0f90: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
0fa0: 49 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20  IVE occurs when 
0fb0: 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
0fc0: 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74  es.** are made t
0fd0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
0fe0: 69 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73  ile.  After an s
0ff0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
1000: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
1010: 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite_pager_commit
1020: 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f  (), the state go
1030: 65 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  es back to PAGER
1040: 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66  _SHARED..*/.#def
1050: 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  ine PAGER_UNLOCK
1060: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
1070: 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20  PAGER_SHARED    
1080: 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    1   /* same as
1090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a   SHARED_LOCK */.
10a0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45  #define PAGER_RE
10b0: 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a  SERVED    2   /*
10c0: 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56 45   same as RESERVE
10d0: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
10e0: 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  e PAGER_EXCLUSIV
10f0: 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20  E   4   /* same 
1100: 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  as EXCLUSIVE_LOC
1110: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1120: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35  ER_SYNCED      5
1130: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ../*.** If the S
1140: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52  QLITE_BUSY_RESER
1150: 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69  VED_LOCK macro i
1160: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61 74  s set to true at
1170: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a   compile-time,.*
1180: 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74  * then failed at
1190: 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20  tempts to get a 
11a0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69  reserved lock wi
11b0: 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ll invoke the bu
11c0: 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  sy callback..** 
11d0: 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20 64  This is off by d
11e0: 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20  efault.  To see 
11f0: 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  why, consider th
1200: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e  e following scen
1210: 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70  ario:.** .** Sup
1220: 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61 6c  pose thread A al
1230: 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61 72  ready has a shar
1240: 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74  ed lock and want
1250: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
1260: 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61  k..** Thread B a
1270: 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 73  lready has a res
1280: 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77  erved lock and w
1290: 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76  ants an exclusiv
12a0: 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62  e lock.  If.** b
12b0: 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65 20  oth threads are 
12c0: 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73 79  using their busy
12d0: 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d   callbacks, it m
12e0: 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74  ight be a long t
12f0: 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e  ime.** be for on
1300: 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64 73  e of the threads
1310: 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c   give up and all
1320: 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f  ows the other to
1330: 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74   proceed..** But
1340: 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20 74   if the thread t
1350: 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65  rying to get the
1360: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67   reserved lock g
1370: 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a  ives up quickly.
1380: 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72 20  ** (if it never 
1390: 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79  invokes its busy
13a0: 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20   callback) then 
13b0: 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77  the contention w
13c0: 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76  ill be.** resolv
13d0: 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23  ed quickly..*/.#
13e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55  ifndef SQLITE_BU
13f0: 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
1400: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1410: 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
1420: 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OCK 0.#endif../*
1430: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72  .** This macro r
1440: 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20  ounds values up 
1450: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 76  so that if the v
1460: 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72 65  alue is an addre
1470: 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72  ss it.** is guar
1480: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20  anteed to be an 
1490: 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73 20  address that is 
14a0: 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d  aligned to an 8-
14b0: 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a  byte boundary..*
14c0: 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f  /.#define FORCE_
14d0: 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28  ALIGNMENT(X)   (
14e0: 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a  ((X)+7)&~7)../*.
14f0: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
1500: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
1510: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
1520: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
1530: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
1540: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
1550: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
1560: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
1570: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
1580: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
1590: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
15a0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
15b0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
15c0: 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75  Client code shou
15d0: 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 70  ld call sqlite3p
15e0: 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20  ager_write() on 
15f0: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1600: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1610: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1620: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1630: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1640: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a  3pager_write().*
1650: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  * is called, the
1660: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
1670: 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74  ontents are writ
1680: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c  ten into the rol
1690: 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  lback.** journal
16a0: 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75   and PgHdr.inJou
16b0: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e  rnal and PgHdr.n
16c0: 65 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e  eedSync are set.
16d0: 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a    Later, once.**
16e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67   the journal pag
16f0: 65 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e  e has made it on
1700: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
1710: 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53  ace, PgHdr.needS
1720: 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  ync.** is cleare
1730: 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64  d.  The modified
1740: 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20   page cannot be 
1750: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
1760: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a  o the original.*
1770: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1780: 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61  until the journa
1790: 6c 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e  l pages has been
17a0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
17b0: 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72  and the.** PgHdr
17c0: 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65  .needSync has be
17d0: 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  en cleared..**.*
17e0: 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74  * The PgHdr.dirt
17f0: 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68  y flag is set wh
1800: 65 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  en sqlite3pager_
1810: 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  write() is calle
1820: 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61  d and.** is clea
1830: 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74  red again when t
1840: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1850: 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
1860: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  to the original.
1870: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1880: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1890: 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72 3b  uct PgHdr PgHdr;
18a0: 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a  .struct PgHdr {.
18b0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
18e0: 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65   which this page
18f0: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67   belongs */.  Pg
1900: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1920: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1930: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
1940: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48  .  PgHdr *pNextH
1950: 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b  ash, *pPrevHash;
1960: 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73    /* Hash collis
1970: 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67  ion chain for Pg
1980: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67  Hdr.pgno */.  Pg
1990: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
19a0: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
19b0: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
19c0: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
19d0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
19e0: 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tAll;           
19f0: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
1a00: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
1a10: 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74  PgHdr *pNextStmt
1a20: 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f  , *pPrevStmt;  /
1a30: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
1a40: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
1a50: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
1a60: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a80: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1a90: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1aa0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74  nal */.  u8 inSt
1ab0: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
1ac0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1ad0: 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  if in the statem
1ae0: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
1af0: 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20 20  /.  u8 dirty;   
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65     /* TRUE if we
1b20: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 62   need to write b
1b30: 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ack changes */. 
1b40: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20  /* Sync journal 
1b70: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
1b80: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
1b90: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b   alwaysRollback;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
1bc0: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73  lback() for this
1bd0: 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74   page */.  short
1be0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c00: 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20  ber of users of 
1c10: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
1c20: 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20  gHdr *pDirty;   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72   Dirty pages sor
1c50: 74 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e  ted by PgHdr.pgn
1c60: 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  o */.#ifdef SQLI
1c70: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1c80: 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23   u32 pageHash;.#
1c90: 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65  endif.  /* pPage
1ca0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1cb0: 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66  s of page data f
1cc0: 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65  ollow this heade
1cd0: 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e  r */.  /* Pager.
1ce0: 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
1cf0: 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f  local data follo
1d00: 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  w the page data 
1d10: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
1d20: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
1d30: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
1d40: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
1d50: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
1d60: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
1d70: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
1d80: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
1d90: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
1da0: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
1db0: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
1dc0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
1dd0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1de0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
1df0: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
1e00: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
1e10: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
1e20: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1e30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
1e40: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
1e50: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
1e60: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
1e70: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
1e80: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
1e90: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
1ea0: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
1eb0: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
1ec0: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
1ed0: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
1ee0: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
1ef0: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
1f00: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
1f10: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
1f20: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
1f30: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
1f40: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
1f50: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
1f60: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
1f70: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
1f80: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
1f90: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
1fa0: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
1fb0: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
1fc0: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
1fd0: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
1fe0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
1ff0: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
2000: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
2010: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
2020: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
2030: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
2040: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
2050: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
2060: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
2070: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
2080: 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c  efine CODEC(P,D,
2090: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
20a0: 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  ec ){ P->xCodec(
20b0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
20c0: 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64  ,X); }.#else.# d
20d0: 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c  efine CODEC(P,D,
20e0: 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  N,X).#endif../*.
20f0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
2100: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
2110: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2120: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
2130: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
2140: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2150: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2160: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2170: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2180: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
2190: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
21a0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
21b0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
21c0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
21d0: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
21e0: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
21f0: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
2200: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
2210: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
2220: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
2230: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
2240: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2250: 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67  )../*.** How big
2260: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
2270: 68 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72  h table used for
2280: 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d   locating in-mem
2290: 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20 62 79 20  ory pages.** by 
22a0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
22b0: 73 20 6d 61 63 72 6f 20 6c 6f 6f 6b 73 20 61 20  s macro looks a 
22c0: 6c 69 74 74 6c 65 20 73 69 6c 6c 79 2c 20 62 75  little silly, bu
22d0: 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 0a 2a  t is evaluated.*
22e0: 2a 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  * at compile-tim
22f0: 65 2c 20 6e 6f 74 20 72 75 6e 2d 74 69 6d 65 20  e, not run-time 
2300: 28 61 74 20 6c 65 61 73 74 20 66 6f 72 20 67 63  (at least for gc
2310: 63 20 74 68 69 73 20 69 73 20 74 72 75 65 29 2e  c this is true).
2320: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47  .*/.#define N_PG
2330: 5f 48 41 53 48 20 28 5c 0a 20 20 28 4d 41 58 5f  _HASH (\.  (MAX_
2340: 50 41 47 45 53 3e 31 30 32 34 29 3f 32 30 34 38  PAGES>1024)?2048
2350: 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53  : \.  (MAX_PAGES
2360: 3e 35 31 32 29 3f 31 30 32 34 3a 20 5c 0a 20 20  >512)?1024: \.  
2370: 28 4d 41 58 5f 50 41 47 45 53 3e 32 35 36 29 3f  (MAX_PAGES>256)?
2380: 35 31 32 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41  512: \.  (MAX_PA
2390: 47 45 53 3e 31 32 38 29 3f 32 35 36 3a 20 5c 0a  GES>128)?256: \.
23a0: 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 36 34 29    (MAX_PAGES>64)
23b0: 3f 31 32 38 3a 36 34 20 5c 0a 29 0a 0a 2f 2a 0a  ?128:64 \.)../*.
23c0: 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e  ** Hash a page n
23d0: 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  umber.*/.#define
23e0: 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20   pager_hash(PN) 
23f0: 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53   ((PN)&(N_PG_HAS
2400: 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f  H-1))../*.** A o
2410: 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69  pen page cache i
2420: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
2430: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2440: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
2450: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 75 38  uct Pager {.  u8
2460: 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20   journalOpen;   
2470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2480: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
2490: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73  e descriptors is
24a0: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a   valid */.  u8 j
24b0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20  ournalStarted;  
24c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24d0: 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75  if header of jou
24e0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a  rnal is synced *
24f0: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
2500: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2510: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
2520: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
2530: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
2540: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
2550: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2560: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
2570: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
2580: 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20    u8 stmtOpen;  
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25a0: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61   True if the sta
25b0: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
25c0: 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75  l is open */.  u
25d0: 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20  8 stmtInUse;    
25e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25f0: 75 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73  ue we are in a s
2600: 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
2610: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  saction */.  u8 
2620: 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20  stmtAutoopen;   
2630: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
2640: 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68   stmt journal wh
2650: 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  en main journal 
2660: 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38  is opened*/.  u8
2670: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
2680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2690: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
26a0: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
26b0: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d0: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
26e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
26f0: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
2700: 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20  .  u8 state;    
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2720: 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20  * PAGER_UNLOCK, 
2730: 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56  _SHARED, _RESERV
2740: 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38  ED, etc. */.  u8
2750: 20 65 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20   errMask;       
2760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2770: 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64   of several kind
2780: 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  s of errors */. 
2790: 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20   u8 tempFile;   
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74  zFilename is a t
27c0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f  emporary file */
27d0: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27f0: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
2800: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
2810: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
2820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2830: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
2840: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
2850: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
2860: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63  */.  u8 dirtyCac
2870: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  he;             
2880: 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
2890: 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68  ed pages have ch
28a0: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c  anged */.  u8 al
28b0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
28c0: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
28d0: 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
28e0: 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  ) for all pages 
28f0: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
2920: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
2930: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
2940: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2950: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
2960: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
2970: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
2980: 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65   */.  int dbSize
2990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
29b0: 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
29c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62   */.  int origDb
29d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
29e0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
29f0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
2a00: 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73  hange */.  int s
2a10: 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  tmtSize;        
2a20: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2a30: 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70  f database (in p
2a40: 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65  ages) at stmt_be
2a50: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  gin() */.  int n
2a60: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
2a70: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a80: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
2a90: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2aa0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
2ab0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
2ac0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
2ad0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
2ae0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
2af0: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65  */.  int stmtNRe
2b00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2b20: 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75  cords in stmt su
2b30: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  bjournal */.  in
2b40: 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  t nExtra;       
2b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2b60: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
2b70: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2b80: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2b90: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
2ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2bb0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
2bc0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
2bd0: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2be0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
2bf0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
2c00: 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  ory pages */.  i
2c10: 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20 20 20  nt nMaxPage;    
2c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69             /* Hi
2c30: 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20 6f 66  gh water mark of
2c40: 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   nPage */.  int 
2c50: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
2c60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2c70: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
2c80: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
2c90: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
2ca0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
2cb0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2cc0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
2cd0: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
2ce0: 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  che */.  u8 *aIn
2cf0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2d00: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2d10: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d30: 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53  le */.  u8 *aInS
2d40: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
2d50: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
2d60: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
2d70: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
2d80: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
2d90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2da0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2db0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2dc0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2de0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
2df0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
2e00: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
2e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
2e20: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
2e30: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
2e40: 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c  files */.  OsFil
2e50: 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20  e *fd, *jfd;    
2e60: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2e70: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
2e80: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
2e90: 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20  nal */.  OsFile 
2ea0: 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20 20  *stfd;          
2eb0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
2ec0: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
2ed0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
2ee0: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
2ef0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
2f00: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
2f10: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
2f20: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64 72  ndler */.  PgHdr
2f30: 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74   *pFirst, *pLast
2f40: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
2f50: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
2f60: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
2f70: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  ynced;        /*
2f80: 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65   First free page
2f90: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64   with PgHdr.need
2fa0: 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  Sync==0 */.  PgH
2fb0: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
2fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2fd0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
2fe0: 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b  .  PgHdr *pStmt;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3000: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
3010: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
3020: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
3030: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3050: 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66  Current byte off
3060: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
3070: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
3080: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
3090: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
30a0: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
30b0: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
30c0: 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  er */.  i64 stmt
30d0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
30e0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75      /* First jou
30f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
3100: 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  ten this stateme
3110: 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  nt */.  i64 stmt
3120: 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  Cksum;          
3130: 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74      /* cksumInit
3140: 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20   when statement 
3150: 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  was started */. 
3160: 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20   i64 stmtJSize; 
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3180: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
3190: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
31a0: 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  */.  int sectorS
31b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
31c0: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
31d0: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
31e0: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65  ollback */.#ifde
31f0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
3200: 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c  int nHit, nMiss,
3210: 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43   nOvfl;     /* C
3220: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69  ache hits, missi
3230: 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72  ng, and LRU over
3240: 66 6c 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  flows */.  int n
3250: 52 65 61 64 2c 6e 57 72 69 74 65 3b 20 20 20 20  Read,nWrite;    
3260: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
3270: 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72  se pages read/wr
3280: 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a  itten */.#endif.
3290: 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75    void (*xDestru
32a0: 63 74 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29  ctor)(void*,int)
32b0: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
32c0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65  outine when free
32d0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76  ing pages */.  v
32e0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
32f0: 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f  (void*,int);   /
3300: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
3310: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
3320: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
3330: 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
3340: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
3350: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
3360: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
3370: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
3380: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
3390: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
33a0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
33b0: 28 29 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61  () */.  PgHdr *a
33c0: 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b  Hash[N_PG_HASH];
33d0: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
33e0: 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75  e to map page nu
33f0: 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f  mber to PgHdr */
3400: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3410: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
3420: 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20  AGEMENT.  Pager 
3430: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
3440: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20        /* Linked 
3450: 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 69  list of pagers i
3460: 6e 20 74 68 69 73 20 74 68 72 65 61 64 20 2a 2f  n this thread */
3470: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
3480: 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54  * If SQLITE_TEST
3490: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
34a0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
34b0: 61 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e  ariable given in
34c0: 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74  .** the argument
34d0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
34e0: 45 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20  E_TEST.# define 
34f0: 54 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b  TEST_INCR(x)  x+
3500: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
3510: 20 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65   TEST_INCR(x).#e
3520: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  ndif../*.** Thes
3530: 65 20 61 72 65 20 62 69 74 73 20 74 68 61 74 20  e are bits that 
3540: 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61  can be set in Pa
3550: 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2a 0a  ger.errMask..**.
3560: 2a 2a 20 54 4f 44 4f 3a 20 4d 61 79 62 65 20 77  ** TODO: Maybe w
3570: 65 20 6a 75 73 74 20 77 61 6e 74 20 61 20 76 61  e just want a va
3580: 72 69 61 62 6c 65 20 2d 20 50 61 67 65 72 2e 65  riable - Pager.e
3590: 72 72 43 6f 64 65 2e 20 43 61 6e 20 77 65 20 72  rrCode. Can we r
35a0: 65 61 6c 6c 79 20 0a 2a 2a 20 20 20 20 20 20 20  eally .**       
35b0: 68 61 76 65 20 74 77 6f 20 73 69 6d 75 6c 74 61  have two simulta
35c0: 6e 65 6f 75 73 20 65 72 72 6f 72 20 63 6f 6e 64  neous error cond
35d0: 69 74 69 6f 6e 73 3f 0a 2a 2a 0a 2a 2a 20 52 65  itions?.**.** Re
35e0: 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 61 6e  covering from an
35f0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
3600: 4c 49 54 45 5f 4c 4f 43 4b 2c 20 53 51 4c 49 54  LITE_LOCK, SQLIT
3610: 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 0a 2a 2a  E_CORRUPT or .**
3620: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 65 72   SQLITE_IOERR er
3630: 72 6f 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d  ror is not a sim
3640: 70 6c 65 20 6d 61 74 74 65 72 2c 20 70 61 72 74  ple matter, part
3650: 69 63 75 6c 61 72 6c 79 20 69 66 20 74 68 65 20  icularly if the 
3660: 70 61 67 65 72 20 0a 2a 2a 20 63 61 63 68 65 20  pager .** cache 
3670: 69 73 20 73 68 61 72 65 64 20 62 65 74 77 65 65  is shared betwee
3680: 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6e 6e 65  n multiple conne
3690: 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  ctions..**.** SQ
36a0: 4c 49 54 45 5f 46 55 4c 4c 20 28 50 41 47 45 52  LITE_FULL (PAGER
36b0: 5f 45 52 52 5f 46 55 4c 4c 29 3a 0a 2a 2a 20 20  _ERR_FULL):.**  
36c0: 20 20 20 43 6c 65 61 72 65 64 20 77 68 65 6e 20     Cleared when 
36d0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
36e0: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
36f0: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  **.** SQLITE_COR
3700: 52 55 50 54 20 28 50 41 47 45 52 5f 45 52 52 5f  RUPT (PAGER_ERR_
3710: 43 4f 52 52 55 50 54 29 3a 0a 2a 2a 20 20 20 20  CORRUPT):.**    
3720: 20 43 61 6e 6e 6f 74 20 62 65 20 63 6c 65 61 72   Cannot be clear
3730: 65 64 2e 20 54 68 65 20 75 70 70 65 72 20 6c 61  ed. The upper la
3740: 79 65 72 20 6d 75 73 74 20 63 6c 6f 73 65 20 74  yer must close t
3750: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 72  he current pager
3760: 20 0a 2a 2a 20 20 20 20 20 61 6e 64 20 6f 70 65   .**     and ope
3770: 6e 20 61 20 6e 65 77 20 6f 6e 65 20 6f 6e 20 74  n a new one on t
3780: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 74 6f 20  he same file to 
3790: 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
37a0: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20  SQLITE_PROTOCOL 
37b0: 28 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 29  (PAGER_ERR_LOCK)
37c0: 3a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 65 72  :.**     This er
37d0: 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  ror only occurs 
37e0: 69 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  if an internal e
37f0: 72 72 6f 72 20 6f 63 63 75 72 73 20 6f 72 20 61  rror occurs or a
3800: 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 0a  nother process .
3810: 2a 2a 20 20 20 20 20 69 73 20 6e 6f 74 20 66 6f  **     is not fo
3820: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 73 71 6c 69  llowing the sqli
3830: 74 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  te locking proto
3840: 63 6f 6c 20 28 69 2e 65 2e 20 73 6f 6d 65 6f 6e  col (i.e. someon
3850: 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 6d 61 6e  e is .**     man
3860: 69 70 75 6c 61 74 69 6e 67 20 74 68 65 20 64 61  ipulating the da
3870: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e  tabase file usin
3880: 67 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  g something othe
3890: 72 20 74 68 61 6e 20 73 71 6c 69 74 65 29 2e 0a  r than sqlite)..
38a0: 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20 68  **     This is h
38b0: 61 6e 64 6c 65 64 20 69 6e 20 74 68 65 20 73 61  andled in the sa
38c0: 6d 65 20 77 61 79 20 61 73 20 64 61 74 61 62 61  me way as databa
38d0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2d 20  se corruption - 
38e0: 74 68 65 20 65 72 72 6f 72 20 0a 2a 2a 20 20 20  the error .**   
38f0: 20 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 65 61    cannot be clea
3900: 72 65 64 20 65 78 63 65 70 74 20 62 79 20 63 6c  red except by cl
3910: 6f 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  osing the curren
3920: 74 20 70 61 67 65 72 20 61 6e 64 20 6f 70 65 6e  t pager and open
3930: 69 6e 67 20 0a 2a 2a 20 20 20 20 20 61 20 62 72  ing .**     a br
3940: 61 6e 64 20 6e 65 77 20 6f 6e 65 20 6f 6e 20 74  and new one on t
3950: 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a  he same file..**
3960: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
3970: 20 28 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b   (PAGER_ERR_DISK
3980: 29 3a 0a 2a 2a 20 20 20 20 20 43 6c 65 61 72 65  ):.**     Cleare
3990: 64 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  d when the trans
39a0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
39b0: 20 62 61 63 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e   back..*/.#defin
39c0: 65 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  e PAGER_ERR_FULL
39d0: 20 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20       0x01  /* a 
39e0: 77 72 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a  write() failed *
39f0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
3a00: 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30  ERR_LOCK     0x0
3a10: 32 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74  2  /* error in t
3a20: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  he locking proto
3a30: 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  col */.#define P
3a40: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
3a50: 20 20 30 78 30 34 20 20 2f 2a 20 64 61 74 61 62    0x04  /* datab
3a60: 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63  ase or journal c
3a70: 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65  orruption */.#de
3a80: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44  fine PAGER_ERR_D
3a90: 49 53 4b 20 20 20 20 20 30 78 30 38 20 20 2f 2a  ISK     0x08  /*
3aa0: 20 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f   general disk I/
3ab0: 4f 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61  O error - bad ha
3ac0: 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a  rd drive? */../*
3ad0: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
3ae0: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
3af0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
3b00: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
3b10: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
3b20: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
3b30: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
3b40: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
3b50: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
3b60: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
3b70: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
3b80: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
3b90: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
3ba0: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
3bb0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
3bc0: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
3bd0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
3be0: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
3bf0: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
3c00: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
3c10: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
3c20: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
3c30: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
3c40: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
3c50: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
3c60: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
3c70: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
3c80: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
3c90: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
3ca0: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
3cb0: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
3cc0: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
3cd0: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
3ce0: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
3cf0: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
3d00: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
3d10: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
3d20: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
3d30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
3d40: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
3d50: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
3d60: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
3d70: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
3d80: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
3d90: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
3da0: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
3db0: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
3dc0: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
3dd0: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
3de0: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
3df0: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
3e00: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
3e10: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
3e20: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
3e30: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
3e40: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
3e50: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
3e60: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
3e70: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
3e80: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
3e90: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
3ea0: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
3eb0: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
3ec0: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
3ed0: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
3ee0: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
3ef0: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
3f00: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
3f10: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
3f20: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
3f30: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
3f40: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
3f50: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
3f60: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
3f70: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
3f80: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
3f90: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
3fa0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
3fb0: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
3fc0: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
3fd0: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
3fe0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3ff0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
4000: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
4010: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
4020: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
4030: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
4040: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
4050: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
4060: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
4070: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
4080: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
4090: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
40a0: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
40b0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
40c0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
40d0: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
40e0: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
40f0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
4100: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
4110: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
4120: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
4130: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
4140: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
4150: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
4160: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
4170: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
4180: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
4190: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
41a0: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
41b0: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
41c0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
41d0: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
41e0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
41f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
4200: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
4210: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
4220: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
4230: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
4240: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
4250: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
4260: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
4270: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
4280: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
4290: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
42a0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
42b0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
42c0: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
42d0: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
42e0: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
42f0: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
4300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
4310: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
4320: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
4330: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
4340: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
4350: 2f 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  /*.** The defaul
4360: 74 20 73 69 7a 65 20 6f 66 20 61 20 64 69 73 6b  t size of a disk
4370: 20 73 65 63 74 6f 72 0a 2a 2f 0a 23 64 65 66 69   sector.*/.#defi
4380: 6e 65 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f  ne PAGER_SECTOR_
4390: 53 49 5a 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  SIZE 512../*.** 
43a0: 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45  Page number PAGE
43b0: 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76  R_MJ_PGNO is nev
43c0: 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51  er used in an SQ
43d0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69  Lite database (i
43e0: 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64  t is.** reserved
43f0: 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f   for working aro
4400: 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f  und a windows/po
4410: 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c  six incompatibil
4420: 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75  ity). It is.** u
4430: 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  sed in the journ
4440: 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  al to signify th
4450: 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  at the remainder
4460: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4470: 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f  file .** is devo
4480: 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61  ted to storing a
4490: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
44a0: 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65  name - there are
44b0: 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74   no more pages t
44c0: 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  o.** roll back. 
44d0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72  See comments for
44e0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d   function writeM
44f0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
4500: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f  or details..*/./
4510: 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  * #define PAGER_
4520: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44  MJ_PGNO(x) (PEND
4530: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
4540: 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65  ageSize)) */.#de
4550: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
4560: 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f  NO(x) ((PENDING_
4570: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
4580: 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  ize))+1)../*.** 
4590: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  The maximum lega
45a0: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  l page number is
45b0: 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a   (2^31 - 1)..*/.
45c0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41  #define PAGER_MA
45d0: 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34  X_PGNO 214748364
45e0: 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  7../*.** Enable 
45f0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
4600: 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65  tracking (for de
4610: 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a  bugging) here:.*
4620: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4630: 44 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65  DEBUG.  int page
4640: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4650: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
4660: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
4670: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
4680: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
4690: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
46a0: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
46b0: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
46c0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
46d0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
46e0: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
46f0: 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20  %p nRef=%d\n",. 
4700: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50        p->pgno, P
4710: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
4720: 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a   p->nRef.    );.
4730: 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20      cnt++;   /* 
4740: 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74  Something to set
4750: 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e   a breakpoint on
4760: 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65   */.  }.# define
4770: 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67   REFINFO(X)  pag
4780: 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65  er_refinfo(X).#e
4790: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46  lse.# define REF
47a0: 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a  INFO(X).#endif..
47b0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
47c0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
47d0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
47e0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
47f0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
4800: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
4810: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
4820: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
4830: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
4840: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
4850: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
4860: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
4870: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
4880: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
4890: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
48a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
48b0: 65 61 64 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ead32bits(OsFile
48c0: 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29   *fd, u32 *pRes)
48d0: 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69  {.  u32 res;.  i
48e0: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  nt rc;.  rc = sq
48f0: 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
4900: 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73  &res, sizeof(res
4910: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4920: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
4930: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4940: 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61  4];.    memcpy(a
4950: 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20 20 20  c, &res, 4);.   
4960: 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32   res = (ac[0]<<2
4970: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
4980: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
4990: 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52  ac[3];.  }.  *pR
49a0: 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65 74 75  es = res;.  retu
49b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
49c0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
49d0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
49e0: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
49f0: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
4a00: 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
4a10: 76 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 63  void put32bits(c
4a20: 68 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61 6c  har *ac, u32 val
4a30: 29 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61  ){.  ac[0] = (va
4a40: 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20  l>>24) & 0xff;. 
4a50: 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31   ac[1] = (val>>1
4a60: 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  6) & 0xff;.  ac[
4a70: 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20  2] = (val>>8) & 
4a80: 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20  0xff;.  ac[3] = 
4a90: 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f  val & 0xff;.}../
4aa0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
4ab0: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
4ac0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
4ad0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
4ae0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
4af0: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
4b00: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
4b10: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
4b20: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
4b30: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
4b40: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20  OsFile *fd, u32 
4b50: 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  val){.  unsigned
4b60: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70   char ac[4];.  p
4b70: 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c  ut32bits(ac, val
4b80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
4b90: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
4ba0: 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c, 4);.}../*.** 
4bb0: 57 72 69 74 65 20 74 68 65 20 33 32 2d 62 69 74  Write the 32-bit
4bc0: 20 69 6e 74 65 67 65 72 20 27 76 61 6c 27 20 69   integer 'val' i
4bd0: 6e 74 6f 20 74 68 65 20 70 61 67 65 20 69 64 65  nto the page ide
4be0: 6e 74 69 66 69 65 64 20 62 79 20 70 61 67 65 20  ntified by page 
4bf0: 68 65 61 64 65 72 0a 2a 2a 20 27 70 27 20 61 74  header.** 'p' at
4c00: 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27   offset 'offset'
4c10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4c20: 20 73 74 6f 72 65 33 32 62 69 74 73 28 75 33 32   store32bits(u32
4c30: 20 76 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20   val, PgHdr *p, 
4c40: 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75  int offset){.  u
4c50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63  nsigned char *ac
4c60: 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69  ;.  ac = &((unsi
4c70: 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52  gned char*)PGHDR
4c80: 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66  _TO_DATA(p))[off
4c90: 73 65 74 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  set];.  put32bit
4ca0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 7d 0a 0a 2f  s(ac, val);.}../
4cb0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
4cc0: 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  it integer at of
4cd0: 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66 72  fset 'offset' fr
4ce0: 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  om the page iden
4cf0: 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 67  tified by.** pag
4d00: 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f  e header 'p'..*/
4d10: 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74 72  .static u32 retr
4d20: 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64 72  ieve32bits(PgHdr
4d30: 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29   *p, int offset)
4d40: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
4d50: 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28  r *ac;.  ac = &(
4d60: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
4d70: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
4d80: 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65 74  )[offset];.  ret
4d90: 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20  urn (ac[0]<<24) 
4da0: 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20  | (ac[1]<<16) | 
4db0: 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b  (ac[2]<<8) | ac[
4dc0: 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  3];.}.../*.** Co
4dd0: 6e 76 65 72 74 20 74 68 65 20 62 69 74 73 20 69  nvert the bits i
4de0: 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72  n the pPager->er
4df0: 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70  rMask into an ap
4e00: 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75  proprate.** retu
4e10: 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  rn code..*/.stat
4e20: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
4e30: 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  code(Pager *pPag
4e40: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
4e50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
4e60: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
4e70: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43   & PAGER_ERR_LOC
4e80: 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K )    rc = SQLI
4e90: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69  TE_PROTOCOL;.  i
4ea0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
4eb0: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44  sk & PAGER_ERR_D
4ec0: 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51  ISK )    rc = SQ
4ed0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66  LITE_IOERR;.  if
4ee0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
4ef0: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55  k & PAGER_ERR_FU
4f00: 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  LL )    rc = SQL
4f10: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20  ITE_FULL;.  if( 
4f20: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4f30: 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  & PAGER_ERR_CORR
4f40: 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UPT ) rc = SQLIT
4f50: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74  E_CORRUPT;.  ret
4f60: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4f70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
4f80: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
4f90: 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63  when an error oc
4fa0: 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
4fb0: 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  pager.** code to
4fc0: 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72   set the appropr
4fd0: 69 61 74 65 20 62 69 74 73 20 69 6e 20 50 61 67  iate bits in Pag
4fe0: 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 73  er.errMask..*/.s
4ff0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
5000: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
5010: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
5020: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
5030: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
5040: 4f 54 4f 43 4f 4c 3a 0a 20 20 20 20 20 20 70 50  OTOCOL:.      pP
5050: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
5060: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 3b   PAGER_ERR_LOCK;
5070: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5080: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
5090: 45 52 52 3a 0a 20 20 20 20 20 20 70 50 61 67 65  ERR:.      pPage
50a0: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
50b0: 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20  GER_ERR_DISK;.  
50c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
50d0: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
50e0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
50f0: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
5100: 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
5110: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5120: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 0a  SQLITE_CORRUPT:.
5130: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
5140: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
5150: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  RR_CORRUPT;.    
5160: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
5170: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
5180: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
5190: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
51a0: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
51b0: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
51c0: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
51d0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
51e0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
51f0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20   *pPage){.  u32 
5200: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
5210: 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  i;.  unsigned ch
5220: 61 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73  ar *pData = (uns
5230: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48  igned char *)PGH
5240: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65  DR_TO_DATA(pPage
5250: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5260: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
5270: 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20  ageSize; i++){. 
5280: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b     hash = (hash+
5290: 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d  i)^pData[i];.  }
52a0: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
52b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
52c0: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
52d0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
52e0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
52f0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
5300: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
5310: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
5320: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
5330: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
5340: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
5350: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
5360: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
5370: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
5380: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
5390: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
53a0: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
53b0: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
53c0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
53d0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
53e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
53f0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
5400: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
5410: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
5420: 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 4d 45 4d  ->errMask || MEM
5430: 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79  DB || pPg->dirty
5440: 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e   || .      pPg->
5450: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
5460: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
5470: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
5480: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
5490: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68  #endif../*.** Wh
54a0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
54b0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
54c0: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
54d0: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
54e0: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
54f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5500: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
5510: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
5520: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
5530: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
5540: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5550: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a  iteMalloc(). *pz
5560: 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74  Master is.** set
5570: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
5580: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
5590: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
55a0: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a  The caller must.
55b0: 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20  ** sqliteFree() 
55c0: 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  *pzMaster..**.**
55d0: 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   If no master jo
55e0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
55f0: 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61  is present *pzMa
5600: 73 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30  ster is set to 0
5610: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
5620: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
5630: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
5640: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69  sterJournal(OsFi
5650: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
5660: 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  **pzMaster){.  i
5670: 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e  nt rc;.  u32 len
5680: 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75  ;.  i64 szJ;.  u
5690: 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20  32 cksum;.  int 
56a0: 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  i;.  unsigned ch
56b0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
56c0: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
56d0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
56e0: 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74  er */..  *pzMast
56f0: 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  er = 0;..  rc = 
5700: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
5710: 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a  e(pJrnl, &szJ);.
5720: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5730: 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20  _OK || szJ<16 ) 
5740: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5750: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
5760: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b  (pJrnl, szJ-16);
5770: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5780: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
5790: 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33  ;. .  rc = read3
57a0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65  2bits(pJrnl, &le
57b0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
57c0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
57d0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
57e0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26  d32bits(pJrnl, &
57f0: 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
5800: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5810: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
5820: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
5830: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29  Jrnl, aMagic, 8)
5840: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5850: 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28  TE_OK || memcmp(
5860: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
5870: 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75  Magic, 8) ) retu
5880: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5890: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72  qlite3OsSeek(pJr
58a0: 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b  nl, szJ-16-len);
58b0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
58c0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
58d0: 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  ;..  *pzMaster =
58e0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
58f0: 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20  alloc(len+1);.  
5900: 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29  if( !*pzMaster )
5910: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5920: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
5930: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
5940: 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61  ead(pJrnl, *pzMa
5950: 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66  ster, len);.  if
5960: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5970: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
5980: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
5990: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
59a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
59b0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
59c0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
59d0: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
59e0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
59f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
5a00: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
5a10: 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72  um -= (*pzMaster
5a20: 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  )[i];.  }.  if( 
5a30: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
5a40: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
5a50: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
5a60: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
5a70: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
5a80: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
5a90: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
5aa0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
5ab0: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
5ac0: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
5ad0: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
5ae0: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
5af0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5b00: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
5b10: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
5b20: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
5b30: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
5b40: 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61  sqliteFree(*pzMa
5b50: 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61  ster);.    *pzMa
5b60: 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ster = 0;.  }els
5b70: 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65  e{.    (*pzMaste
5b80: 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  r)[len] = '\0';.
5b90: 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e    }.   .  return
5ba0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5bb0: 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f  *.** Seek the jo
5bc0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
5bd0: 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  iptor to the nex
5be0: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
5bf0: 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75  y where a.** jou
5c00: 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20  rnal header may 
5c10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
5c20: 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  en. Pager.journa
5c30: 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20  lOff is updated 
5c40: 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20  with.** the new 
5c50: 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a  seek offset..**.
5c60: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
5c70: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
5c80: 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66  .**.** Input Off
5c90: 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
5ca0: 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a   Output Offset.*
5cb0: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
5cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20  ---------.** 0  
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20         0.** 512 
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30        512.** 100
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30         512.** 20
5d40: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
5d50: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
5d60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5d70: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eekJournalHdr(Pa
5d80: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
5d90: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
5da0: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
5db0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
5dc0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
5dd0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
5de0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5df0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
5e00: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5e10: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
5e20: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
5e30: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
5e40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
5e50: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
5e60: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
5e70: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
5e80: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61  pPager) );.  pPa
5e90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
5ea0: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75  = offset;.  retu
5eb0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  rn sqlite3OsSeek
5ec0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
5ed0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5ee0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
5ef0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
5f00: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
5f10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5f20: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
5f30: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
5f40: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
5f50: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
5f60: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
5f70: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
5f80: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
5f90: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
5fa0: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
5fb0: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
5fc0: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
5fd0: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
5fe0: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
5ff0: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
6000: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
6010: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
6020: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
6030: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
6040: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
6050: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
6060: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
6070: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
6080: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
6090: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
60a0: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
60b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
60c0: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
60d0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
60e0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
60f0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
6100: 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20   - 24) bytes of 
6110: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
6120: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
6130: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
6140: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68  r *pPager){.  ch
6150: 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  ar zHeader[sizeo
6160: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6170: 2b 31 36 5d 3b 0a 0a 20 20 69 6e 74 20 72 63 20  +16];..  int rc 
6180: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
6190: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
61a0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
61b0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
61c0: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
61d0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
61e0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  ( pPager->stmtHd
61f0: 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70  rOff==0 ){.    p
6200: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
6210: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
6220: 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70 50  nalHdr;.  }.  pP
6230: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6240: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
6250: 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  SZ(pPager);..  /
6260: 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a  * FIX ME: .  **.
6270: 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f    ** Possibly fo
6280: 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e  r a pager not in
6290: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74   no-sync mode, t
62a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63  he journal magic
62b0: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a   should not.  **
62c0: 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69   be written unti
62d0: 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64  l nRec is filled
62e0: 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e   in as part of n
62f0: 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  ext syncJournal(
6300: 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ). .  **.  ** Ac
6310: 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65  tually maybe the
6320: 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68   whole journal h
6330: 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20  eader should be 
6340: 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
6350: 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54  at.  ** point. T
6360: 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e  hink about this.
6370: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a  .  */.  memcpy(z
6380: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
6390: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
63a0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
63b0: 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65   /* The nRec Fie
63c0: 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20 66  ld. 0xFFFFFFFF f
63d0: 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e  or no-sync journ
63e0: 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  als. */.  put32b
63f0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6400: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6410: 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53  c)], pPager->noS
6420: 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66 66  ync ? 0xffffffff
6430: 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20   : 0);.  /* The 
6440: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
6450: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
6460: 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f   .  sqlite3Rando
6470: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61  mness(sizeof(pPa
6480: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c  ger->cksumInit),
6490: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
64a0: 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74  nit);.  put32bit
64b0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
64c0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
64d0: 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  +4], pPager->cks
64e0: 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68  umInit);.  /* Th
64f0: 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61  e initial databa
6500: 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  se size */.  put
6510: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6520: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6530: 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72  agic)+8], pPager
6540: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20  ->dbSize);.  /* 
6550: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
6560: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
6570: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75   process */.  pu
6580: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6590: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
65a0: 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67  Magic)+12], pPag
65b0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
65c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
65d0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
65e0: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
65f0: 65 6f 66 28 7a 48 65 61 64 65 72 29 29 3b 0a 0a  eof(zHeader));..
6600: 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
6610: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
6620: 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73   written success
6630: 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20  fully. Seek the 
6640: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
6650: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
6660: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
6670: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
6680: 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ctor..  */.  if(
6690: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
66a0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
66b0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
66c0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
66d0: 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20  urnalOff-1);.   
66e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
66f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
6700: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
6710: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
6720: 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  00", 1);.    }. 
6730: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6740: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
6750: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
6760: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
6770: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
6780: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
6790: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
67a0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
67b0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
67c0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
67d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
67e0: 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  file. See commen
67f0: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
6800: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
6810: 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69  r() for a descri
6820: 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  ption of.** the 
6830: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
6840: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
6850: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
6860: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
6870: 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f   *nRec is set to
6880: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
6890: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
68a0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
68b0: 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65  ader and *dbSize
68c0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
68d0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
68e0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
68f0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
6900: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
6910: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
6920: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
6930: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
6940: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
6950: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
6960: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6970: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
6980: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
6990: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
69a0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
69b0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
69c0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
69d0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65  eturned and *nRe
69e0: 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72  c and *dbSize ar
69f0: 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a  e not set.  If J
6a00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
6a10: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
6a20: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6a30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
6a40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
6a50: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
6a60: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
6a70: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
6a80: 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75  ager, .  i64 jou
6a90: 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20  rnalSize,.  u32 
6aa0: 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a  *pNRec, .  u32 *
6ab0: 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74  pDbSize.){.  int
6ac0: 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
6ad0: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
6ae0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
6af0: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
6b00: 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  ader */..  rc = 
6b10: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
6b20: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
6b30: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6b40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
6b50: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
6b60: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
6b70: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
6b80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6b90: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
6ba0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
6bb0: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
6bc0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
6bd0: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
6be0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6bf0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
6c00: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
6c10: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
6c20: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
6c30: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
6c40: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
6c50: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6c60: 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69  jfd, pNRec);.  i
6c70: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6c80: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
6c90: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
6ca0: 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  d, &pPager->cksu
6cb0: 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63  mInit);.  if( rc
6cc0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6cd0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6ce0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
6cf0: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
6d00: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6d10: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
6d20: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
6d30: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
6d40: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
6d50: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
6d60: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
6d70: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
6d80: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
6d90: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
6da0: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
6db0: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
6dc0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
6dd0: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
6de0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
6df0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6e00: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
6e10: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
6e20: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
6e30: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
6e40: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
6e50: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
6e60: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6e70: 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26  r->jfd, (u32 *)&
6e80: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
6e90: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
6ea0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
6eb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6ec0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
6ed0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  SZ(pPager);.  rc
6ee0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
6ef0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
6f00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6f10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
6f20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
6f30: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
6f40: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6f50: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
6f60: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
6f70: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
6f80: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
6f90: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
6fa0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
6fb0: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
6fc0: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
6fd0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
6fe0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
6ff0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
7000: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
7010: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
7020: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
7030: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
7040: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
7050: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
7060: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
7070: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
7080: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
7090: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
70a0: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
70b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
70c0: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
70d0: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
70e0: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
70f0: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
7100: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
7110: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
7120: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
7130: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
7140: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
7150: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
7160: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
7170: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
7180: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
7190: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
71a0: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
71b0: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
71c0: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
71d0: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
71e0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
71f0: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
7200: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
7210: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
7220: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
7230: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
7240: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
7250: 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20  u32 cksum = 0;. 
7260: 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f   char zBuf[sizeo
7270: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7280: 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a  +2*4];..  if( !z
7290: 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72  Master || pPager
72a0: 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74  ->setMaster) ret
72b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
72c0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
72d0: 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d  er = 1;..  len =
72e0: 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29   strlen(zMaster)
72f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
7300: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
7310: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69  sum += zMaster[i
7320: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
7330: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
7340: 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
7350: 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
7360: 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
7370: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
7380: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
7390: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
73a0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
73b0: 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
73c0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
73d0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
73e0: 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
73f0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
7400: 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
7410: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
7420: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
7430: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
7440: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7450: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7460: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
7470: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
7480: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7490: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
74a0: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
74b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
74c0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
74d0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
74e0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
74f0: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
7500: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7510: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7520: 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c   put32bits(zBuf,
7530: 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69   len);.  put32bi
7540: 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73  ts(&zBuf[4], cks
7550: 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a  um);.  memcpy(&z
7560: 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c  Buf[8], aJournal
7570: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
7580: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
7590: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
75a0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
75b0: 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66  , zBuf, 8+sizeof
75c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
75d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
75e0: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
75f0: 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e  noSync;.  return
7600: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
7610: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
7620: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
7630: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
7640: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
7650: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
7660: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61  al..**.** The Pa
7670: 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61  ger keeps a sepa
7680: 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67  rate list of pag
7690: 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  es that are curr
76a0: 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20  ently in.** the 
76b0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
76c0: 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  l.  This helps t
76d0: 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  he sqlite3pager_
76e0: 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a  stmt_commit().**
76f0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43   routine run MUC
7700: 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65  H faster for the
7710: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
7720: 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e  re there are man
7730: 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65  y.** pages in me
7740: 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20  mory but only a 
7750: 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73  few are in the s
7760: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
7770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7780: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
7790: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
77a0: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
77b0: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
77c0: 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  r;.  if( pPg->in
77d0: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
77e0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
77f0: 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 50  revStmt==0 && pP
7800: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20  g->pNextStmt==0 
7810: 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53  );.  pPg->pPrevS
7820: 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  tmt = 0;.  if( p
7830: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
7840: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
7850: 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
7860: 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
7870: 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65  NextStmt = pPage
7880: 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61 67  r->pStmt;.  pPag
7890: 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b  er->pStmt = pPg;
78a0: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
78b0: 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   1;.}.static voi
78c0: 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72  d page_remove_fr
78d0: 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  om_stmt_list(PgH
78e0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
78f0: 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72  !pPg->inStmt ) r
7900: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
7910: 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a 20  ->pPrevStmt ){. 
7920: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
7930: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
7940: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
7950: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d   pPg->pPrevStmt-
7960: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 67  >pNextStmt = pPg
7970: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7980: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7990: 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ( pPg->pPager->p
79a0: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
79b0: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53   pPg->pPager->pS
79c0: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
79d0: 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Stmt;.  }.  if( 
79e0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29  pPg->pNextStmt )
79f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7a00: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
7a10: 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  revStmt==pPg );.
7a20: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74      pPg->pNextSt
7a30: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
7a40: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a  pPg->pPrevStmt;.
7a50: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
7a60: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
7a70: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
7a80: 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
7a90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
7aa0: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
7ab0: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
7ac0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
7ad0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
7ae0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
7af0: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
7b00: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
7b10: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
7b20: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
7b30: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
7b40: 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50  .  PgHdr *p = pP
7b50: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65  ager->aHash[page
7b60: 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20  r_hash(pgno)];. 
7b70: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
7b80: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
7b90: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
7ba0: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
7bb0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
7bc0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
7bd0: 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69   and clear the i
7be0: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
7bf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
7c00: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
7c10: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
7c20: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
7c30: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
7c40: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
7c50: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
7c60: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
7c70: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
7c80: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
7c90: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
7ca0: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
7cb0: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
7cc0: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
7cd0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
7ce0: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
7cf0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
7d00: 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70   *pNext;.  if( p
7d10: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29  Pager->errMask )
7d20: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
7d30: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
7d40: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
7d50: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
7d60: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
7d70: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
7d80: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
7d90: 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50  pFirst = 0;.  pP
7da0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
7db0: 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
7dc0: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  ->pLast = 0;.  p
7dd0: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b  Pager->pAll = 0;
7de0: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
7df0: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
7e00: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
7e10: 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  ));.  pPager->nP
7e20: 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  age = 0;.  if( p
7e30: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
7e40: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
7e50: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
7e60: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
7e70: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
7e80: 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
7e90: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
7ea0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7eb0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
7ec0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
7ed0: 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  = -1;.  pPager->
7ee0: 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73 65  nRef = 0;.  asse
7ef0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
7f00: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a  nalOpen==0 );.}.
7f10: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
7f20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7f30: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61  ed, the pager ha
7f40: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
7f50: 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61  le open and.** a
7f60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
7f70: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
7f80: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
7f90: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65 61  is routine relea
7fa0: 73 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ses.** the datab
7fb0: 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71  ase lock and acq
7fc0: 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c  uires a SHARED l
7fd0: 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65  ock in its place
7fe0: 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  .  The journal.*
7ff0: 2a 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65  * file is delete
8000: 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a  d and closed..**
8010: 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64  .** TODO: Consid
8020: 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a  er keeping the j
8030: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8040: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   for temporary d
8050: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69  atabases..** Thi
8060: 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  s might give a p
8070: 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f  erformance impro
8080: 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77  vement on window
8090: 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a  s where opening.
80a0: 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20  ** a file is an 
80b0: 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74  expensive operat
80c0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
80d0: 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65  nt pager_unwrite
80e0: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
80f0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
8100: 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  g;.  int rc;.  a
8110: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
8120: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
8130: 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
8140: 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
8150: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8160: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
8170: 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
8180: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
8190: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
81a0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
81b0: 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  e(&pPager->stfd)
81c0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
81d0: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
81e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
81f0: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
8200: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
8210: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
8220: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
8230: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
8240: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
8250: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
8260: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
8270: 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  e( pPager->aInJo
8280: 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
8290: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
82a0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  = 0;.    for(pPg
82b0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
82c0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
82d0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
82e0: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
82f0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
8300: 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
8310: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
8320: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
8330: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
8340: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
8350: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
8360: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
8370: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
8380: 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
8390: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
83a0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
83b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
83c0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
83d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
83e0: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
83f0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
8400: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
8410: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
8420: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
8430: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
8440: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
8450: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
8460: 41 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ARED;.  pPager->
8470: 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a  origDbSize = 0;.
8480: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
8490: 74 65 72 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ter = 0;.  retur
84a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
84b0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
84c0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  n a checksum for
84d0: 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74   the page of dat
84e0: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  a..**.** This is
84f0: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
8500: 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61  ksum.  It is rea
8510: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
8520: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
8530: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
8540: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75   and the page nu
8550: 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69  mber.  We experi
8560: 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  mented with.** a
8570: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
8580: 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75   entire data, bu
8590: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
85a0: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
85b0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
85c0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
85d0: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
85e0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
85f0: 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ata and.** the c
8600: 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
8610: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
8620: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
8630: 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  .  If journal.**
8640: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
8650: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
8660: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
8670: 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61  ost likely scena
8680: 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f  rio.** is that o
8690: 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
86a0: 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
86b0: 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
86c0: 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63  d.  It is.** muc
86d0: 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
86e0: 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
86f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
8700: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
8710: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
8720: 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
8730: 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
8740: 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
8750: 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
8760: 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
8770: 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
8780: 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
8790: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a  corruption..**.*
87a0: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69  * FIX ME:  Consi
87b0: 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79  der adding every
87c0: 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62   200th (or so) b
87d0: 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  yte of the data 
87e0: 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  to the.** checks
87f0: 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66  um.  That way if
8800: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73   a single page s
8810: 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64  pans 3 or more d
8820: 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a  isk sectors and.
8830: 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64  ** only the midd
8840: 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72  le sector is cor
8850: 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74  rupt, we will st
8860: 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f  ill have a reaso
8870: 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20  nable.** chance 
8880: 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63  of failing the c
8890: 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73  hecksum and thus
88a0: 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70   detecting the p
88b0: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  roblem..*/.stati
88c0: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
88d0: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
88e0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73   Pgno pgno, cons
88f0: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
8900: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
8910: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
8920: 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
8930: 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20  >pageSize-200;. 
8940: 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
8950: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
8960: 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
8970: 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
8980: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
8990: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
89a0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
89b0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
89c0: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
89d0: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
89e0: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
89f0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
8a00: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
8a10: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
8a20: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
8a30: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
8a40: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
8a50: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
8a60: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
8a70: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8a80: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
8a90: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
8aa0: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
8ab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
8ac0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
8ad0: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
8ae0: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
8af0: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
8b00: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
8b10: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
8b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
8b30: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
8b40: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
8b50: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b70: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
8b80: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
8b90: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
8ba0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
8bb0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
8bc0: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
8bd0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
8be0: 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54    u8 aData[SQLIT
8bf0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d  E_MAX_PAGE_SIZE]
8c00: 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61  ;  /* Temp stora
8c10: 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f  ge for a page */
8c20: 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20  ..  /* useCksum 
8c30: 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66  should be true f
8c40: 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  or the main jour
8c50: 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  nal and false fo
8c60: 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  r.  ** statement
8c70: 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69   journals.  Veri
8c80: 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20  fy that this is 
8c90: 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
8ca0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a    */.  assert( j
8cb0: 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20  fd == (useCksum 
8cc0: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
8cd0: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b  pPager->stfd) );
8ce0: 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ...  rc = read32
8cf0: 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29  bits(jfd, &pgno)
8d00: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8d10: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
8d20: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
8d30: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61 44  3OsRead(jfd, &aD
8d40: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
8d50: 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  eSize);.  if( rc
8d60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8d70: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
8d80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
8d90: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8da0: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
8db0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
8dc0: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
8dd0: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
8de0: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
8df0: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
8e00: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
8e10: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
8e20: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
8e30: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
8e40: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
8e50: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
8e60: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
8e70: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
8e80: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
8e90: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
8ea0: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
8eb0: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
8ec0: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
8ed0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
8ee0: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
8ef0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
8f00: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
8f10: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8f20: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
8f30: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
8f40: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
8f50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8f60: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b  .  }.  if( useCk
8f70: 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sum ){.    rc = 
8f80: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
8f90: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
8fa0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
8fb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
8fc0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
8fd0: 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
8fe0: 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  m(pPager, pgno, 
8ff0: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
9000: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9010: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
9020: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
9030: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
9040: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
9050: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
9060: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
9070: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9080: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
9090: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
90a0: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
90b0: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
90c0: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
90d0: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
90e0: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
90f0: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
9100: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
9110: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9120: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
9130: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
9140: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
9150: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
9160: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
9170: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
9180: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
9190: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
91a0: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
91b0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
91c0: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
91d0: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
91e0: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
91f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
9200: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
9210: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
9220: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
9230: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
9240: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
9250: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
9260: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
9270: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
9280: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
9290: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
92a0: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
92b0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
92c0: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
92d0: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
92e0: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
92f0: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
9300: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
9310: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
9320: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
9330: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
9340: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
9350: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
9360: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
9370: 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74 68 65  tents are in the
9380: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
9390: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
93a0: 68 65 72 77 69 73 65 2c 20 69 66 20 61 20 66 75  herwise, if a fu
93b0: 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75  ll ROLLBACK occu
93c0: 72 73 20 61 66 74 65 72 20 74 68 65 20 73 74 61  rs after the sta
93d0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  tement.  ** roll
93e0: 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20 52 4f  back the full RO
93f0: 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74 20  LLBACK will not 
9400: 72 65 73 74 6f 72 65 20 74 68 65 20 70 61 67 65  restore the page
9410: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
9420: 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20  .  ** content.  
9430: 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  Two conditions m
9440: 75 73 74 20 62 65 20 6d 65 74 20 62 65 66 6f 72  ust be met befor
9450: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
9460: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66   database.  ** f
9470: 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61  iles. (1) the da
9480: 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 6c  tabase must be l
9490: 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
94a0: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
94b0: 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20  ginal.  ** page 
94c0: 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20 74 68  content is in th
94d0: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
94e0: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
94f0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
9500: 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72 20 65  .  ** cache or e
9510: 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b 65 64  lse it is marked
9520: 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
9530: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61  .  */.  pPg = pa
9540: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
9550: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
9560: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
9570: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
9580: 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b 0a  VE || pPg!=0 );.
9590: 20 20 54 52 41 43 45 33 28 22 50 4c 41 59 42 41    TRACE3("PLAYBA
95a0: 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  CK %d page %d\n"
95b0: 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
95c0: 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  ), pgno);.  if( 
95d0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
95e0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
95f0: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67  & (pPg==0 || pPg
9600: 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20 29  ->needSync==0) )
9610: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
9620: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
9630: 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69  >fd, (pgno-1)*(i
9640: 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
9650: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ize);.    if( rc
9660: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9670: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9680: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9690: 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  >fd, aData, pPag
96a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
96b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
96c0: 20 29 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20   ) pPg->dirty = 
96d0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  0;.  }.  if( pPg
96e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
96f0: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
9700: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
9710: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
9720: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
9730: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
9740: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
9750: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
9760: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
9770: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
9780: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
9790: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
97a0: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
97b0: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
97c0: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
97d0: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
97e0: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
97f0: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
9800: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 70  .    ** sqlite3p
9810: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 2e  ager_rollback().
9820: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
9830: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20   *pData;.    /* 
9840: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
9850: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
9860: 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70  o==1 ); */.    p
9870: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
9880: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
9890: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
98a0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
98b0: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
98c0: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
98d0: 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20  or ){  /*** FIX 
98e0: 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68 69 73  ME:  Should this
98f0: 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a   be xReinit? ***
9900: 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
9910: 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
9920: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
9930: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ize);.    }.#ifd
9940: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
9950: 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
9960: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
9970: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
9980: 65 6e 64 69 66 0a 20 20 20 20 43 4f 44 45 43 28  endif.    CODEC(
9990: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
99a0: 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
99b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
99c0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
99d0: 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
99e0: 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
99f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
9a00: 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
9a10: 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
9a20: 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
9a30: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9a40: 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
9a50: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
9a60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
9a70: 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
9a80: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
9a90: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9aa0: 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
9ab0: 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
9ac0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
9ad0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9ae0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
9af0: 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20  es of all child 
9b00: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20  journals..** To 
9b10: 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72  tell if a master
9b20: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
9b30: 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74  deleted, check t
9b40: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  o each of the.**
9b50: 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61   children.  If a
9b60: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  ll children are 
9b70: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
9b80: 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  r do not refer t
9b90: 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74  o.** a different
9ba0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c   master journal,
9bb0: 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65   then this maste
9bc0: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
9bd0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
9be0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
9bf0: 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68  lmaster(const ch
9c00: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
9c10: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61  int rc;.  int ma
9c20: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20  ster_open = 0;. 
9c30: 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20   OsFile *master 
9c40: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  = 0;.  char *zMa
9c50: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
9c60: 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
9c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9c80: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
9c90: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
9ca0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
9cb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9cc0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  e */..  /* Open 
9cd0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9ce0: 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76  al file exclusiv
9cf0: 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65  ely in case some
9d00: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
9d10: 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74   ** is running t
9d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
9d30: 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61  . Not that it ma
9d40: 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66  kes too much dif
9d50: 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
9d60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
9d70: 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74  enReadOnly(zMast
9d80: 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20  er, &master);.  
9d90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9da0: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
9db0: 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72  er_out;.  master
9dc0: 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20  _open = 1;.  rc 
9dd0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
9de0: 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61  ize(master, &nMa
9df0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
9e00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9e10: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
9e20: 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
9e30: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
9e40: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
9e50: 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
9e60: 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
9e70: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
9e80: 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
9e90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
9ea0: 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
9eb0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
9ec0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
9ed0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
9ee0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20  asterJournal. . 
9ef0: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
9f00: 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72  rJournal = (char
9f10: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
9f20: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
9f30: 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
9f40: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
9f50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
9f60: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
9f70: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9f80: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
9f90: 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73 74  lite3OsRead(mast
9fa0: 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
9fb0: 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al, nMasterJourn
9fc0: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  al);.    if( rc!
9fd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
9fe0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
9ff0: 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  ..    zJournal =
a000: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
a010: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  .    while( (zJo
a020: 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
a030: 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
a040: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  rnal ){.      if
a050: 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
a060: 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20  xists(zJournal) 
a070: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
a080: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
a090: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
a0a0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a0b0: 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
a0c0: 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
a0d0: 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
a0e0: 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
a0f0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
a100: 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65         ** so, re
a110: 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
a120: 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
a130: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
a140: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a150: 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61    OsFile *journa
a160: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  l = 0;.        i
a170: 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 72  nt c;..        r
a180: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
a190: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e  nReadOnly(zJourn
a1a0: 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  al, &journal);. 
a1b0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
a1c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a1d0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
a1e0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
a1f0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
a200: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
a210: 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d  nal(journal, &zM
a220: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
a230: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
a240: 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(&journal);.   
a250: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
a260: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a270: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
a280: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
a290: 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  }..        c = z
a2a0: 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20  MasterPtr!=0 && 
a2b0: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
a2c0: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
a2d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
a2e0: 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a  ee(zMasterPtr);.
a2f0: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
a300: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
a310: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
a320: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
a330: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a340: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
a350: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
a360: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
a370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
a380: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
a390: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
a3a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
a3b0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
a3c0: 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61  zMaster);..delma
a3d0: 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
a3e0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
a3f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
a400: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
a410: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
a420: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
a430: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
a440: 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  &master);.  }.  
a450: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a460: 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70  .** Make every p
a470: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
a480: 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61 74   agree with what
a490: 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e   is on disk.  In
a4a0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a   other words,.**
a4b0: 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73 6b   reread the disk
a4c0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
a4d0: 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68 65  ate of the cache
a4e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
a4f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
a500: 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  fter a rollback 
a510: 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66  in which some of
a520: 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68 65   the dirty cache
a530: 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65  .** pages had ne
a540: 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
a550: 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57   out to disk.  W
a560: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62  e need to roll b
a570: 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65  ack the.** cache
a580: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
a590: 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
a5a0: 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72 65  do that is to re
a5b0: 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e  read the old con
a5c0: 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f  tent.** back fro
a5d0: 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73  m the disk..*/.s
a5e0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
a5f0: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67  reload_cache(Pag
a600: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
a610: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
a620: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a630: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
a640: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
a650: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
a660: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
a670: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
a680: 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20 21  SIZE];.    if( !
a690: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
a6a0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
a6b0: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
a6c0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
a6d0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ize ){.      rc 
a6e0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
a6f0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
a700: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
a710: 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29  4)(pPg->pgno-1))
a720: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
a730: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a740: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a750: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
a760: 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
a770: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
a780: 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
a790: 33 28 22 52 45 46 45 54 43 48 20 25 64 20 70 61  3("REFETCH %d pa
a7a0: 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
a7b0: 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
a7c0: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
a7d0: 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
a7e0: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
a7f0: 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   zBuf, pPg->pgno
a800: 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 2);.    }else{
a810: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42  .      memset(zB
a820: 75 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  uf, 0, pPager->p
a830: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
a840: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
a850: 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a  f==0 || memcmp(z
a860: 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  Buf, PGHDR_TO_DA
a870: 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
a880: 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
a890: 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
a8a0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a  _TO_DATA(pPg), z
a8b0: 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
a8c0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
a8d0: 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
a8e0: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ter ){.        p
a8f0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
a900: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
a910: 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
a920: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  eSize);.      }e
a930: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
a940: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
a950: 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
a960: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
a970: 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra);.      }.   
a980: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64   }.    pPg->need
a990: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
a9a0: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69  g->dirty = 0;.#i
a9b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
a9c0: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
a9d0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
a9e0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
a9f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
aa00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
aa10: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d  * Truncate the m
aa20: 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20  ain file of the 
aa30: 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74  given pager to t
aa40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
aa50: 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e  es.** indicated.
aa60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
aa70: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
aa80: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
aa90: 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
aaa0: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
aab0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
aac0: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  E );.  return sq
aad0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
aae0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
aaf0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
ab00: 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  4)nPage);.}../*.
ab10: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
ab20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
ab30: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
ab40: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
ab50: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
ab60: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
ab70: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
ab80: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
ab90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
aba0: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
abb0: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
abc0: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
abd0: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
abe0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
abf0: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
ac00: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
ac10: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
ac20: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
ac30: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
ac40: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
ac50: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
ac60: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
ac70: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
ac80: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
ac90: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
aca0: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
acb0: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
acc0: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
acd0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
ace0: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
acf0: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
ad00: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
ad10: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
ad20: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
ad30: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
ad40: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
ad50: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
ad60: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
ad70: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
ad80: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
ad90: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
ada0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
adb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
adc0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
add0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
ade0: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
adf0: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
ae00: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
ae10: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
ae20: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
ae30: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
ae40: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
ae50: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
ae60: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
ae70: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
ae80: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
ae90: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
aea0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
aeb0: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
aec0: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
aed0: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
aee0: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
aef0: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
af00: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
af10: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
af20: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
af30: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
af40: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
af50: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
af60: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
af70: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
af80: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
af90: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
afa0: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
afb0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
afc0: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
afd0: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
afe0: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
aff0: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
b000: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
b010: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
b020: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
b030: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
b040: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
b050: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
b060: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
b070: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
b080: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
b090: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
b0a0: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
b0b0: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
b0c0: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
b0d0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
b0e0: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
b0f0: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
b100: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
b110: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
b120: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
b130: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
b140: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
b150: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
b160: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
b170: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
b180: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
b190: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
b1a0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
b1b0: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
b1c0: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
b1d0: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
b1e0: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
b1f0: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
b200: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
b210: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
b220: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
b230: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
b240: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
b250: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
b260: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
b270: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
b280: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
b290: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
b2a0: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
b2b0: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
b2c0: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
b2d0: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
b2e0: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
b2f0: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
b300: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
b310: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
b320: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
b330: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
b340: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
b350: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
b360: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
b370: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
b380: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
b390: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
b3a0: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
b3b0: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
b3c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
b3d0: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
b3e0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
b3f0: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
b400: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
b410: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
b420: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
b430: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
b440: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
b450: 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
b460: 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
b470: 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
b480: 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
b490: 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
b4a0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
b4b0: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
b4c0: 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
b4d0: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
b4e0: 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
b4f0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
b500: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
b510: 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
b520: 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
b530: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
b540: 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
b550: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
b560: 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
b570: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
b580: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
b590: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
b5a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
b5b0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
b5c0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
b5d0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
b5e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
b5f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b600: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
b610: 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
b620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b630: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
b640: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
b650: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b670: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
b680: 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
b690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b6a0: 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
b6b0: 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
b6c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b6e0: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
b6f0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
b700: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
b710: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
b720: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
b730: 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
b740: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  y */..  /* Figur
b750: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
b760: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
b770: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
b780: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
b790: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
b7a0: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
b7b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
b7c0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
b7d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
b7e0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
b7f0: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
b800: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b810: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
b820: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
b830: 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
b840: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
b850: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
b860: 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
b870: 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
b880: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
b890: 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
b8a0: 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
b8b0: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
b8c0: 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
b8d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
b8e0: 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
b8f0: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
b900: 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
b910: 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72  k..  */.  rc = r
b920: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
b930: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
b940: 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72  Master);.  asser
b950: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
b960: 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  NE );.  if( rc!=
b970: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d  SQLITE_OK || (zM
b980: 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74 65  aster && !sqlite
b990: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d  3OsFileExists(zM
b9a0: 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73  aster)) ){.    s
b9b0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
b9c0: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
b9d0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  = 0;.    if( rc=
b9e0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
b9f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ba00: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
ba10: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  back;.  }.  sqli
ba20: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
ba30: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61  ->jfd, 0);.  pPa
ba40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ba50: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
ba60: 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
ba70: 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20  either when the 
ba80: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
ba90: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20   call returns.  
baa0: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ** SQLITE_DONE o
bab0: 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  r an IO error oc
bac0: 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65  curs. */.  while
bad0: 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52  ( 1 ){..    /* R
bae0: 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
baf0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
bb00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bb10: 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
bb20: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
bb30: 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
bb40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bb50: 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
bb60: 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
bb70: 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
bb80: 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
bb90: 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65  ss must of faile
bba0: 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
bbb0: 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
bbc0: 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
bbd0: 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
bbe0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
bbf0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
bc00: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
bc10: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
bc20: 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69  c, &mxPg);.    i
bc30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bc40: 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72   ){ .      if( r
bc50: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
bc60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
bc70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
bc80: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
bc90: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
bca0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
bcb0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
bcc0: 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61  then this journa
bcd0: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  l was created by
bce0: 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a   a process.    *
bcf0: 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d  * working in no-
bd00: 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20  sync mode. This 
bd10: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
bd20: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
bd30: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  al.    ** file c
bd40: 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73  onsists of pages
bd50: 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  , there are no m
bd60: 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ore journal head
bd70: 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20  ers. Compute.   
bd80: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
bd90: 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74   nRec based on t
bda0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a  his assumption..
bdb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
bdc0: 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
bdd0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
bde0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bdf0: 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
be00: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
be10: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
be20: 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
be30: 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
be40: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
be50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
be60: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
be70: 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
be80: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
be90: 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
bea0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
beb0: 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27  file back to it'
bec0: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
bed0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
bee0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
bef0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
bf00: 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
bf10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
bf20: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
bf30: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61  ager) ){.      a
bf40: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
bf50: 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20  rigDbSize==0 || 
bf60: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
bf70: 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20  ze==mxPg );.    
bf80: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
bf90: 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
bfa0: 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
bfb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
bfc0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
bfd0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
bfe0: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
bff0: 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
c000: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63      }..    /* rc
c010: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
c020: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f  (pPager->jfd, JO
c030: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
c040: 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66  ger)); */.    if
c050: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c060: 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62  ) goto end_playb
c070: 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43  ack;.  .    /* C
c080: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
c090: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
c0a0: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
c0b0: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
c0c0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
c0d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
c0e0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
c0f0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
c100: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
c110: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
c120: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
c130: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c140: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
c150: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
c160: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
c170: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
c180: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c190: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
c1a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c1b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c1c0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
c1d0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
c1e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c1f0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65  }.  }..  /* Page
c200: 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
c210: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
c220: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65  journal but neve
c230: 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68  r synced.  ** wh
c240: 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64  ere not restored
c250: 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f   by the loop abo
c260: 76 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ve.  We have to 
c270: 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20  restore those.  
c280: 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65 61 64  ** pages by read
c290: 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72  ing them back fr
c2a0: 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
c2b0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
c2c0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
c2d0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65  ITE_OK );.  page
c2e0: 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
c2f0: 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61  Pager);..end_pla
c300: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
c310: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c320: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
c330: 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
c340: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73  ;.  }.  if( zMas
c350: 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ter ){.    /* If
c360: 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
c370: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
c380: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
c390: 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20  l return true,. 
c3a0: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
c3b0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
c3c0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
c3d0: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
c3e0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c3f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c400: 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
c410: 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20  ster(zMaster);. 
c420: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
c430: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
c440: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
c450: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
c460: 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
c470: 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
c480: 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
c490: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
c4a0: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
c4b0: 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
c4c0: 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52  ent PAGER_SECTOR
c4d0: 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65  _SIZE.  ** value
c4e0: 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
c4f0: 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
c500: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
c510: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
c520: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41  >sectorSize = PA
c530: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  GER_SECTOR_SIZE;
c540: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c550: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
c560: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
c570: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
c580: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
c590: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
c5a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
c5b0: 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a  rnal but with.**
c5c0: 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69   a few extra twi
c5d0: 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  sts..**.**    (1
c5e0: 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  )  The number of
c5f0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
c600: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
c610: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20  he start of.**  
c620: 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65         the state
c630: 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  ment is stored i
c640: 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  n pPager->stmtSi
c650: 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
c660: 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
c670: 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
c680: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
c690: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
c6a0: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61  ing back the sta
c6b0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20  tement journal, 
c6c0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  also.**         
c6d0: 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67  playback all pag
c6e0: 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  es of the transa
c6f0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65  ction journal be
c700: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ginning.**      
c710: 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61     at offset pPa
c720: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a  ger->stmtJSize..
c730: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
c740: 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
c750: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
c760: 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c780: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
c790: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
c7a0: 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20  4 hdrOff;.  int 
c7b0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
c7c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c7d0: 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  f Records */.  i
c7e0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
c7f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
c800: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
c810: 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50   rc;..  szJ = pP
c820: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c830: 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
c840: 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73   .  {.    i64 os
c850: 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73  _szJ;.    rc = s
c860: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
c870: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f  (pPager->jfd, &o
c880: 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20  s_szJ);.    if( 
c890: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
c8a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61  return rc;.    a
c8b0: 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73  ssert( szJ==os_s
c8c0: 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  zJ );.  }.#endif
c8d0: 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66  ..  /* Set hdrOf
c8e0: 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73  f to be the offs
c8f0: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
c900: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
c910: 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  ritten.  ** this
c920: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
c930: 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65  action, or the e
c940: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
c950: 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  f no journal.  *
c960: 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  * header was wri
c970: 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  tten..  */.  hdr
c980: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
c990: 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65  mtHdrOff;.  asse
c9a0: 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
c9b0: 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20  Sync || !hdrOff 
c9c0: 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66  );.  if( !hdrOff
c9d0: 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d   ){.    hdrOff =
c9e0: 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   szJ;.  }.  .  /
c9f0: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
ca00: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
ca10: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
ca20: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
ca30: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
ca40: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
ca50: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
ca60: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
ca70: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
ca80: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
ca90: 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
caa0: 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f  ->stmtSize;..  /
cab0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
cac0: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
cad0: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
cae0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
caf0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
cb00: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
cb10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cb20: 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  pen );.  sqlite3
cb30: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73  OsSeek(pPager->s
cb40: 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20  tfd, 0);.  nRec 
cb50: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
cb60: 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
cb70: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
cb80: 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  out of the state
cb90: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ment journal and
cba0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
cbb0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
cbc0: 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
cbd0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
cbe0: 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73  nal omits checks
cbf0: 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61  ums from.  ** ea
cc00: 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20  ch record since 
cc10: 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65  power-failure re
cc20: 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d  covery is not im
cc30: 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65  portant to state
cc40: 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ment.  ** journa
cc50: 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
cc60: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
cc70: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
cc80: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
cc90: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
cca0: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
ccb0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
ccc0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
ccd0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
cce0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
ccf0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
cd00: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c   }..  /* Now rol
cd10: 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63  l some pages bac
cd20: 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73  k from the trans
cd30: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20  action journal. 
cd40: 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a  Pager.stmtJSize.
cd50: 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a    ** was the siz
cd60: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
cd70: 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
cd80: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
cd90: 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65  arted, so.  ** e
cda0: 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20  verything after 
cdb0: 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
cdc0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69   rolled back, ei
cdd0: 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ther into the.  
cde0: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
cdf0: 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f   memory cache, o
ce00: 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a  r both..  **.  *
ce10: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a  * If it is not z
ce20: 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ero, then Pager.
ce30: 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68  stmtHdrOff is th
ce40: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
ce50: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
ce60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
ce70: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64  header written d
ce80: 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65  uring this state
ce90: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
cea0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
ceb0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
cec0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
ced0: 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
cee0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cef0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
cf00: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
cf10: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
cf20: 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65  urnalOff = pPage
cf30: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20  r->stmtJSize;.  
cf40: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
cf50: 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
cf60: 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28  Cksum;.  assert(
cf70: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
cf80: 70 50 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d  pPager)<(pPager-
cf90: 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a  >pageSize+8) );.
cfa0: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
cfb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28  >journalOff <= (
cfc0: 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e  hdrOff-(pPager->
cfd0: 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a  pageSize+8)) ){.
cfe0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
cff0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
d000: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
d010: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73  >jfd, 1);.    as
d020: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
d030: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
d040: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d050: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d060: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
d070: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
d080: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20  ournalOff < szJ 
d090: 29 7b 0a 20 20 20 20 75 33 32 20 6e 52 65 63 3b  ){.    u32 nRec;
d0a0: 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
d0b0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
d0c0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
d0d0: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75 6d  szJ, &nRec, &dum
d0e0: 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  my);.    if( rc!
d0f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d100: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
d110: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
d120: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74       goto end_st
d130: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
d140: 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d   }.    if( nRec=
d150: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  =0 ){.      nRec
d160: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
d170: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
d180: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
d190: 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
d1a0: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
d1b0: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 && pPager->jo
d1c0: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20  urnalOff < szJ; 
d1d0: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i--){.      rc =
d1e0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d1f0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d200: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
d210: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d220: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d230: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d240: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
d250: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
d260: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
d270: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
d280: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65  lOff = szJ;.  .e
d290: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d2a0: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
d2b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
d2c0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
d2d0: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
d2e0: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
d2f0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65  TE_CORRUPT;.  }e
d300: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
d310: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
d320: 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  J;.    /* pager_
d330: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
d340: 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72  ger); */.  }.  r
d350: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d360: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
d370: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
d380: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
d390: 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
d3a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d3b0: 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65  3pager_set_cache
d3c0: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
d3d0: 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
d3e0: 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30  .  if( mxPage>10
d3f0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
d400: 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b  mxPage = mxPage;
d410: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
d420: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
d430: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
d440: 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
d450: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
d460: 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
d470: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
d480: 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
d490: 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
d4a0: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
d4b0: 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
d4c0: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
d4d0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
d4e0: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
d4f0: 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
d500: 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
d510: 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
d520: 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
d530: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
d540: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
d550: 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
d560: 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
d570: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
d580: 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
d590: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
d5a0: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
d5b0: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
d5d0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
d5e0: 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
d5f0: 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
d600: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
d610: 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
d620: 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
d630: 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
d640: 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
d650: 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
d660: 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
d670: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
d680: 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
d690: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d6a0: 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
d6b0: 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
d6c0: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
d6d0: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
d6e0: 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
d6f0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
d700: 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
d710: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
d720: 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
d730: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
d740: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
d750: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
d760: 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
d770: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
d780: 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
d790: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
d7a0: 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
d7b0: 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
d7c0: 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
d7d0: 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
d7e0: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
d7f0: 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
d800: 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
d810: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d820: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
d830: 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
d840: 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
d850: 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
d860: 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
d870: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
d880: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
d890: 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
d8b0: 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
d8c0: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
d8d0: 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
d8e0: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
d8f0: 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
d900: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
d910: 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
d920: 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
d930: 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
d940: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d950: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
d960: 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  AS.void sqlite3p
d970: 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f  ager_set_safety_
d980: 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  level(Pager *pPa
d990: 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b  ger, int level){
d9a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
d9b0: 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c  c =  level==1 ||
d9c0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
d9d0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
d9e0: 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33  lSync = level==3
d9f0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
da00: 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61  pFile;.  if( pPa
da10: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
da20: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
da30: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
da40: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
da50: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
da60: 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
da70: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
da80: 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
da90: 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
daa0: 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
dab0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
dac0: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
dad0: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
dae0: 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74  s only.  .*/.int
daf0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
db00: 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a  p_count = 0;../*
db10: 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
db20: 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74  rary file.  Writ
db30: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
db40: 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c  e file into zFil
db50: 65 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74  e.** (zFile must
db60: 20 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c   be at least SQL
db70: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
db80: 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20  E bytes long.)  
db90: 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c  Write.** the fil
dba0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
dbb0: 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
dbc0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
dbd0: 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
dbe0: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
dbf0: 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  if we fail..**.*
dc00: 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  * The OS will au
dc10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
dc20: 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
dc30: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
dc40: 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  .** closed..*/.s
dc50: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
dc60: 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
dc70: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46  char *zFile, OsF
dc80: 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e  ile **pFd){.  in
dc90: 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74  t cnt = 8;.  int
dca0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f   rc;.  sqlite3_o
dcb0: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
dcc0: 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
dcd0: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
dce0: 69 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b  is only */.  do{
dcf0: 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20  .    cnt--;.    
dd00: 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c  sqlite3OsTempFil
dd10: 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20  eName(zFile);.  
dd20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dd30: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46  OpenExclusive(zF
dd40: 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20  ile, pFd, 1);.  
dd50: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
dd60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
dd70: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
dd80: 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
dd90: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
dda0: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
ddb0: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
ddc0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
ddd0: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
dde0: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
ddf0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
de00: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
de10: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
de20: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
de30: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
de40: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
de50: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
de60: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
de70: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
de80: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
de90: 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ng sqlite3pager_
dea0: 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  unref()..**.** I
deb0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
dec0: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
ded0: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
dee0: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
def0: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
df00: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
df10: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
df20: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
df30: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
df40: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
df50: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
df60: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
df70: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
df80: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
df90: 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
dfa0: 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
dfb0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
dfc0: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
dfd0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
dfe0: 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
dff0: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
e000: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
e010: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
e020: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
e030: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
e040: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
e050: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e060: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
e070: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
e080: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
e090: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
e0a0: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
e0b0: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
e0c0: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
e0d0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
e0e0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e100: 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
e110: 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  g this file */.)
e120: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
e130: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
e140: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30  FullPathname = 0
e150: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
e160: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20  .  OsFile *fd;. 
e170: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e180: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
e190: 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
e1a0: 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  ;.  int memDb = 
e1b0: 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  0;.  int readOnl
e1c0: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65  y = 0;.  int use
e1d0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
e1e0: 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
e1f0: 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74  URNAL)==0;.  int
e200: 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66   noReadlock = (f
e210: 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f  lags & PAGER_NO_
e220: 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20  READLOCK)!=0;.  
e230: 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54  char zTemp[SQLIT
e240: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
e250: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
e260: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
e270: 4e 41 47 45 4d 45 4e 54 0a 20 20 63 6f 6e 73 74  NAGEMENT.  const
e280: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
e290: 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72  dro = sqlite3Thr
e2a0: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
e2b0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
e2c0: 49 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20  If malloc() has 
e2d0: 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20 72  already failed r
e2e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e2f0: 45 4d 2e 20 42 65 66 6f 72 65 20 65 76 65 6e 0a  EM. Before even.
e300: 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 66 6f 72    ** testing for
e310: 20 74 68 69 73 2c 20 73 65 74 20 2a 70 70 50 61   this, set *ppPa
e320: 67 65 72 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74  ger to NULL so t
e330: 68 65 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 20  he caller knows 
e340: 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 73  the pager.  ** s
e350: 74 72 75 63 74 75 72 65 20 77 61 73 20 6e 65 76  tructure was nev
e360: 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 20  er allocated. . 
e370: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
e380: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
e390: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
e3a0: 6e 6c 79 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  nly()->mallocFai
e3b0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
e3c0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e3d0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66 64    }.  memset(&fd
e3e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29  , 0, sizeof(fd))
e3f0: 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
e400: 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20   pager file and 
e410: 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  set zFullPathnam
e420: 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61  e to point at ma
e430: 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d  lloc()ed .  ** m
e440: 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  emory containing
e450: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69   the complete fi
e460: 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63  lename (i.e. inc
e470: 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63  luding the direc
e480: 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  tory)..  */.  if
e490: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
e4a0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
e4b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e4c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
e4d0: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
e4e0: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
e4f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
e500: 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46  Db = 1;.      zF
e510: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
e520: 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a  liteStrDup("");.
e530: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
e540: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75  .    {.      zFu
e550: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e560: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
e570: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
e580: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
e590: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
e5a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e5b0: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
e5c0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
e5d0: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
e5e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
e5f0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
e600: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
e610: 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b  emp(zTemp, &fd);
e620: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
e630: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
e640: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
e650: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
e660: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
e670: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e680: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
e690: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
e6a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
e6b0: 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ate the Pager st
e6c0: 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74  ructure. As part
e6d0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c   of the same all
e6e0: 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ocation, allocat
e6f0: 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72  e.  ** space for
e700: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20   the full paths 
e710: 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72  of the file, dir
e720: 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e  ectory and journ
e730: 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e  al .  ** (Pager.
e740: 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72  zFilename, Pager
e750: 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20  .zDirectory and 
e760: 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e  Pager.zJournal).
e770: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c  .  */.  if( zFul
e780: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e790: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
e7a0: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
e7b0: 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
e7c0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
e7d0: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
e7e0: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
e7f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
e800: 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
e810: 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
e820: 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
e830: 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20  ee the memory . 
e840: 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
e850: 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y zFullPathname,
e860: 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72 20   free the Pager 
e870: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
e880: 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  ose the .  ** fi
e890: 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  le. Since the pa
e8a0: 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63  ger is not alloc
e8b0: 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f  ated there is no
e8c0: 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20   need to set .  
e8d0: 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72  ** any Pager.err
e8e0: 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a  Mask variables..
e8f0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
e900: 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68  er || !zFullPath
e910: 6e 61 6d 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49  name || rc!=SQLI
e920: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
e930: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
e940: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
e950: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e960: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e970: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
e980: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
e990: 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45  _OK)?SQLITE_NOME
e9a0: 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52  M:rc);.  }..  TR
e9b0: 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
e9c0: 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
e9d0: 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68  D(fd), zFullPath
e9e0: 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  name);.  pPager-
e9f0: 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
ea00: 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a  ar*)&pPager[1];.
ea10: 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63    pPager->zDirec
ea20: 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e  tory = &pPager->
ea30: 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65  zFilename[nameLe
ea40: 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n+1];.  pPager->
ea50: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
ea60: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e  er->zDirectory[n
ea70: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72  ameLen+1];.  str
ea80: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
ea90: 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  ename, zFullPath
eaa0: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
eab0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
eac0: 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ry, zFullPathnam
ead0: 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d  e);..  for(i=nam
eae0: 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61  eLen; i>0 && pPa
eaf0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
eb00: 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
eb10: 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
eb20: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
eb30: 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72  [i-1] = 0;.  str
eb40: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
eb50: 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  rnal, zFullPathn
eb60: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
eb70: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
eb80: 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61  );.  strcpy(&pPa
eb90: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61  ger->zJournal[na
eba0: 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61  meLen], "-journa
ebb0: 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  l");.  pPager->f
ebc0: 64 20 3d 20 66 64 3b 0a 20 20 70 50 61 67 65 72  d = fd;.  pPager
ebd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
ebe0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  0;.  pPager->use
ebf0: 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75  Journal = useJou
ec00: 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a  rnal && !memDb;.
ec10: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
ec20: 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63  lock = noReadloc
ec30: 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  k && readOnly;. 
ec40: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
ec50: 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  n = 0;.  pPager-
ec60: 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
ec70: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
ec80: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   0;.  pPager->db
ec90: 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a  Size = memDb-1;.
eca0: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
ecb0: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
ecc0: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
ecd0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
ece0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
ecf0: 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a  >stmtJSize = 0;.
ed00: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
ed10: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
ed20: 4d 61 78 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  MaxPage = 0;.  p
ed30: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
ed40: 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  100;.  pPager->s
ed50: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
ed60: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  OCK;.  pPager->e
ed70: 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50  rrMask = 0;.  pP
ed80: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
ed90: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61   tempFile;.  pPa
eda0: 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d  ger->memDb = mem
edb0: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
edc0: 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
edd0: 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  y;.  pPager->nee
ede0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
edf0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
ee00: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
ee10: 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
ee20: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
ee30: 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  c = (pPager->noS
ee40: 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67  ync?0:1);.  pPag
ee50: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a  er->pFirst = 0;.
ee60: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
ee70: 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50  Synced = 0;.  pP
ee80: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
ee90: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
eea0: 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  a = FORCE_ALIGNM
eeb0: 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70  ENT(nExtra);.  p
eec0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
eed0: 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52  e = PAGER_SECTOR
eee0: 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d  _SIZE;.  pPager-
eef0: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
ef00: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  0;.  memset(pPag
ef10: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
ef20: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
ef30: 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72  sh));.  *ppPager
ef40: 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65   = pPager;.#ifde
ef50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ef60: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
ef70: 54 0a 20 20 69 66 28 20 70 54 73 64 72 6f 2d 3e  T.  if( pTsdro->
ef80: 75 73 65 4d 65 6d 6f 72 79 4d 61 6e 61 67 65 6d  useMemoryManagem
ef90: 65 6e 74 20 29 7b 0a 20 20 20 20 54 68 72 65 61  ent ){.    Threa
efa0: 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
efb0: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
efc0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
efd0: 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61  Next = pTsd->pPa
efe0: 67 65 72 3b 0a 20 20 20 20 70 54 73 64 2d 3e 70  ger;.    pTsd->p
eff0: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
f000: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
f010: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f020: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f030: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
f040: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
f050: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
f060: 62 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65  busyhandler(Page
f070: 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48  r *pPager, BusyH
f080: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
f090: 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  dler){.  pPager-
f0a0: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
f0b0: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a  pBusyHandler;.}.
f0c0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  ./*.** Set the d
f0d0: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
f0e0: 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f  is pager.  If no
f0f0: 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74  t NULL, the dest
f100: 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64  ructor is called
f110: 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66  .** when the ref
f120: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
f130: 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65  each page reache
f140: 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73  s zero.  The des
f150: 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62  tructor can.** b
f160: 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20  e used to clean 
f170: 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  up information i
f180: 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d  n the extra segm
f190: 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ent appended to 
f1a0: 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  each page..**.**
f1b0: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
f1c0: 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73  is not called as
f1d0: 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65   a result sqlite
f1e0: 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20  3pager_close(). 
f1f0: 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73   .** Destructors
f200: 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64   are only called
f210: 20 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72   by sqlite3pager
f220: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69  _unref()..*/.voi
f230: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
f240: 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61  et_destructor(Pa
f250: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
f260: 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a  d (*xDesc)(void*
f270: 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
f280: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->xDestructor = 
f290: 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xDesc;.}../*.** 
f2a0: 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61  Set the reinitia
f2b0: 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70  lizer for this p
f2c0: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
f2d0: 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
f2e0: 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
f2f0: 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
f300: 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
f310: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
f320: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
f330: 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61  al.** value as a
f340: 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c   result of a rol
f350: 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c  lback.  The call
f360: 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65  back gives highe
f370: 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20  r-level code.** 
f380: 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
f390: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
f3a0: 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61  TRA section to a
f3b0: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
f3c0: 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64  stored.** page d
f3d0: 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ata..*/.void sql
f3e0: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65  ite3pager_set_re
f3f0: 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50  initer(Pager *pP
f400: 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65  ager, void (*xRe
f410: 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29  init)(void*,int)
f420: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  ){.  pPager->xRe
f430: 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
f440: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
f450: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52  he page size.  R
f460: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69  eturn the new si
f470: 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67  ze.  If the sugg
f480: 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20  est new page.** 
f490: 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70  size is inapprop
f4a0: 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61  riate, then an a
f4b0: 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
f4c0: 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64  size is selected
f4d0: 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64  .** and returned
f4e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f4f0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69  pager_set_pagesi
f500: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
f510: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
f520: 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53  .  assert( pageS
f530: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
f540: 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
f550: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
f560: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
f570: 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
f580: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
f590: 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eSize;.  }.  ret
f5a0: 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65  urn pPager->page
f5b0: 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
f5c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
f5d0: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
f5e0: 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
f5f0: 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
f600: 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
f610: 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
f620: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
f630: 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
f640: 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
f650: 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
f660: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
f670: 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
f680: 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
f690: 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
f6a0: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
f6b0: 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
f6c0: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
f6d0: 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
f6e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
f6f0: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
f700: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
f710: 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
f720: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
f730: 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
f740: 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c  ved_cnt;.void cl
f750: 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ear_simulated_io
f760: 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69  _error(){.  sqli
f770: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
f780: 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73   = 0;.}.void dis
f790: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
f7a0: 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
f7b0: 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
f7c0: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
f7d0: 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
f7e0: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
f7f0: 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
f800: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
f810: 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
f820: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
f830: 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
f840: 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
f850: 65 0a 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72  e.# define clear
f860: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
f870: 72 6f 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64  ror().# define d
f880: 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
f890: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
f8a0: 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
f8b0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
f8c0: 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
f8d0: 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
f8e0: 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
f8f0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
f900: 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
f910: 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
f920: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
f930: 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63  ** No error chec
f940: 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68  king is done. Th
f950: 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74  e rational for t
f960: 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
f970: 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61   function .** ma
f980: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e  y be called even
f990: 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   if the file doe
f9a0: 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63  s not exist or c
f9b0: 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e  ontain a header.
f9c0: 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61   In .** these ca
f9d0: 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61  ses sqlite3OsRea
f9e0: 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  d() will return 
f9f0: 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69  an error, to whi
fa00: 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a  ch the correct .
fa10: 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74  ** response is t
fa20: 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72  o zero the memor
fa30: 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63  y at pDest and c
fa40: 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c  ontinue.  A real
fa50: 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69   IO error .** wi
fa60: 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65  ll presumably re
fa70: 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65  cur and be picke
fa80: 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f  d up later (Todo
fa90: 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  : Think about th
faa0: 69 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  is)..*/.void sql
fab0: 69 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66  ite3pager_read_f
fac0: 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
fad0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
fae0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
faf0: 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28  Dest){.  memset(
fb00: 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
fb10: 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a  if( MEMDB==0 ){.
fb20: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
fb30: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29  k(pPager->fd, 0)
fb40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52  ;.    sqlite3OsR
fb50: 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
fb60: 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20 63  pDest, N);.    c
fb70: 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69  lear_simulated_i
fb80: 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 7d  o_error();.  }.}
fb90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
fba0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
fbb0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
fbc0: 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
fbd0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
fbe0: 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ger. .**.** If t
fbf0: 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  he PENDING_BYTE 
fc00: 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
fc10: 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20   directly after 
fc20: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
fc30: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e  * file, then con
fc40: 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20  sider this page 
fc50: 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
fc60: 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c   too. For exampl
fc70: 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47  e, if.** PENDING
fc80: 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30  _BYTE is byte 40
fc90: 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79  96 (the first by
fca0: 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e  te of page 5) an
fcb0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
fcc0: 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39  e.** file is 409
fcd0: 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65  6 bytes, 5 is re
fce0: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f  turned instead o
fcf0: 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 4..*/.int sqli
fd00: 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
fd10: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
fd20: 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61 73  ){.  i64 n;.  as
fd30: 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
fd40: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
fd50: 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  >dbSize>=0 ){.  
fd60: 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62    n = pPager->db
fd70: 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Size;.  } else {
fd80: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
fd90: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
fda0: 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49  r->fd, &n)!=SQLI
fdb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
fdc0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
fdd0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  = PAGER_ERR_DISK
fde0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
fdf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fe00: 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d  n>0 && n<pPager-
fe10: 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
fe20: 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65     n = 1;.    }e
fe30: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20  lse{.      n /= 
fe40: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
fe50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fe60: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
fe70: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
fe80: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
fe90: 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  ize = n;.    }. 
fea0: 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e   }.  if( n==(PEN
feb0: 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
fec0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20  ->pageSize) ){. 
fed0: 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65     n++;.  }.  re
fee0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
fef0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
ff00: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
ff10: 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
ff20: 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  ager*);.../*.** 
ff30: 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
ff40: 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e  it's hash chain.
ff50: 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61   Also set the pa
ff60: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74  ge number to 0 t
ff70: 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68  o indicate.** th
ff80: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
ff90: 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68  ot part of any h
ffa0: 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20  ash chain. This 
ffb0: 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
ffc0: 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  use the.** sqlit
ffd0: 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65  e3pager_movepage
ffe0: 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c  () routine can l
fff0: 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74  eave a page in t
10000 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65  he .** pNextFree
10010 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20  /pPrevFree list 
10020 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61  that is not a pa
10030 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63  rt of any hash-c
10040 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
10050 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43  void unlinkHashC
10060 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  hain(Pager *pPag
10070 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
10080 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f  .  if( pPg->pgno
10090 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
100a0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
100b0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
100c0 68 69 73 20 70 61 67 65 20 69 73 20 6e 6f 74 20  his page is not 
100d0 69 6e 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  in any hash chai
100e0 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  n. */.    return
100f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
10100 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
10110 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
10120 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
10130 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
10140 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  }.  if( pPg->pPr
10150 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73  evHash ){.    as
10160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
10170 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70  ash[pager_hash(p
10180 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70 50 67 20  Pg->pgno)]!=pPg 
10190 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  );.    pPg->pPre
101a0 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
101b0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
101c0 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
101d0 69 6e 74 20 68 20 3d 20 70 61 67 65 72 5f 68 61  int h = pager_ha
101e0 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  sh(pPg->pgno);. 
101f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10200 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67  r->aHash[h]==pPg
10210 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
10220 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e  aHash[h] = pPg->
10230 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 0a  pNextHash;.  }..
10240 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
10250 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
10260 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
10270 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sh = 0;.}../*.**
10280 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66   Unlink a page f
10290 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
102a0 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61  t (the list of a
102b0 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  ll pages where n
102c0 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66  Ref==0).** and f
102d0 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c  rom its hash col
102e0 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f  lision chain..*/
102f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
10300 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  inkPage(PgHdr *p
10310 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
10320 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
10330 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74  er;..  /* Keep t
10340 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20  he pFirstSynced 
10350 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67  pointer pointing
10360 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79   at the first sy
10370 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20  nchronized page 
10380 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50  */.  if( pPg==pP
10390 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
103a0 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  ed ){.    PgHdr 
103b0 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
103c0 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ree;.    while( 
103d0 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
103e0 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
103f0 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67  Free; }.    pPag
10400 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
10410 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = p;.  }..  /* 
10420 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
10430 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66  freelist */.  if
10440 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
10450 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   ){.    pPg->pPr
10460 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
10470 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
10480 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
10490 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
104a0 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a  >pFirst==pPg );.
104b0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
104c0 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
104d0 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ree;.  }.  if( p
104e0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
104f0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
10500 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
10510 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
10520 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
10530 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c  sert( pPager->pL
10540 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  ast==pPg );.    
10550 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
10560 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
10570 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
10580 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
10590 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  vFree = 0;..  /*
105a0 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
105b0 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65   pgno hash table
105c0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
105d0 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
105e0 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  g);.}..#ifndef S
105f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
10600 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  YDB./*.** This r
10610 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
10620 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e  o truncate an in
10630 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
10640 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c  .  Delete.** all
10650 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e   pages whose pgn
10660 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  o is larger than
10670 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
10680 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
10690 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ced..** Referenc
106a0 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
106b0 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
106c0 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
106d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
106e0 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61  emoryTruncate(Pa
106f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10700 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
10710 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
10720 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
10730 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
10740 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
10750 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
10760 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
10770 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
10780 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
10790 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
107a0 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
107b0 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
107c0 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
107d0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
107e0 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
107f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
10800 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
10810 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
10820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
10830 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
10840 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  ll;.      unlink
10850 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
10860 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
10870 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
10880 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
10890 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69   }.}.#else.#defi
108a0 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74  ne memoryTruncat
108b0 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e(p).#endif../*.
108c0 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
108d0 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c   a lock on a fil
108e0 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  e.  Invoke the b
108f0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
10900 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63  the lock.** is c
10910 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
10920 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20  ilable.  Repeat 
10930 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
10940 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a  allback returns.
10950 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ** false or unti
10960 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  l the lock succe
10970 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
10980 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
10990 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
109a0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
109b0 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
109c0 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
109d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
109e0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
109f0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
10a00 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
10a10 63 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  c;.  assert( PAG
10a20 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45  ER_SHARED==SHARE
10a30 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
10a40 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56  rt( PAGER_RESERV
10a50 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ED==RESERVED_LOC
10a60 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
10a70 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d  AGER_EXCLUSIVE==
10a80 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
10a90 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
10aa0 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  state>=locktype 
10ab0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
10ac0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
10ad0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
10ae0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
10af0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f  k(pPager->fd, lo
10b00 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68  cktype);.    }wh
10b10 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
10b20 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49  BUSY && sqlite3I
10b30 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
10b40 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
10b50 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66  ndler) );.    if
10b60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10b70 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
10b80 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70  >state = locktyp
10b90 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  e;.    }.  }.  r
10ba0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10bb0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
10bc0 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
10bd0 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
10be0 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
10bf0 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63  lite3pager_trunc
10c00 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
10c10 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
10c20 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
10c30 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
10c40 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
10c50 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
10c60 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
10c70 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
10c80 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
10c90 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
10ca0 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65   nPage>=(unsigne
10cb0 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
10cc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10cd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10ce0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
10cf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
10d00 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  = nPage;.    mem
10d10 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
10d20 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
10d30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10d40 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
10d50 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
10d60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10d70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10d80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
10d90 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
10da0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
10db0 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
10dc0 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ng. */.  rc = pa
10dd0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
10de0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
10df0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
10e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10e10 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10e20 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
10e30 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
10e40 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  r, nPage);.  if(
10e50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10e60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
10e70 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
10e80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10e90 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
10ea0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
10eb0 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
10ec0 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
10ed0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
10ee0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
10ef0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
10f00 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
10f10 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
10f20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
10f30 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
10f40 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
10f50 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
10f60 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
10f70 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
10f80 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
10f90 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
10fa0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
10fb0 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
10fc0 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
10fd0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
10fe0 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
10ff0 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
11000 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
11010 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
11020 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
11030 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
11040 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
11050 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
11060 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
11070 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
11080 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
11090 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
110a0 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
110b0 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
110c0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
110d0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
110e0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
110f0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
11100 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  close(Pager *pPa
11110 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
11120 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 23 69 66 64  Pg, *pNext;.#ifd
11130 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11140 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
11150 4e 54 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  NT.  const Threa
11160 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
11170 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52  lite3ThreadDataR
11180 65 61 64 4f 6e 6c 79 28 29 3b 0a 23 65 6e 64 69  eadOnly();.#endi
11190 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 50 61  f..  switch( pPa
111a0 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20  ger->state ){.  
111b0 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53    case PAGER_RES
111c0 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20  ERVED:.    case 
111d0 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20  PAGER_SYNCED: . 
111e0 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58     case PAGER_EX
111f0 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20  CLUSIVE: {.     
11200 20 2f 2a 20 57 65 20 69 67 6e 6f 72 65 20 61 6e   /* We ignore an
11210 79 20 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74  y IO errors that
11220 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74 68   occur during th
11230 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20  e rollback.     
11240 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
11250 6f 20 64 69 73 61 62 6c 65 20 49 4f 20 65 72 72  o disable IO err
11260 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f  or simulation so
11270 20 74 68 61 74 20 74 65 73 74 69 6e 67 0a 20 20   that testing.  
11280 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72      ** works mor
11290 65 20 65 61 73 69 6c 79 2e 0a 20 20 20 20 20 20  e easily..      
112a0 2a 2f 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  */.      disable
112b0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
112c0 72 6f 72 73 28 29 3b 0a 20 20 20 20 20 20 73 71  rors();.      sq
112d0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
112e0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
112f0 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
11300 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
11310 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44  .      if( !MEMD
11320 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  B ){.        sql
11330 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
11340 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
11350 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11360 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11370 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 70 50 61 67  >errMask || pPag
11380 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
11390 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
113a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
113b0 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20  e PAGER_SHARED: 
113c0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d  {.      if( !MEM
113d0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  DB ){.        sq
113e0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
113f0 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
11400 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
11410 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11420 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
11430 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
11440 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  g */.      break
11450 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
11460 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
11470 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
11480 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  xt){.#ifndef NDE
11490 42 55 47 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  BUG.    if( MEMD
114a0 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  B ){.      PgHis
114b0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
114c0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
114d0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
114e0 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
114f0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
11500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
11510 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
11520 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
11530 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
11540 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
11550 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
11560 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
11570 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
11580 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25   TRACE2("CLOSE %
11590 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
115a0 61 67 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ager));.  assert
115b0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
115c0 6b 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  k || (pPager->jo
115d0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20  urnalOpen==0 && 
115e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
115f0 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  ==0) );.  if( pP
11600 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
11610 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
11620 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
11630 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
11640 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
11650 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  aInJournal);.  i
11660 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
11670 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
11680 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
11690 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
116a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
116b0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
116c0 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
116d0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
116e0 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
116f0 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
11700 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
11710 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
11720 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
11730 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
11740 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c    */..#ifdef SQL
11750 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
11760 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
11770 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
11780 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b  er from the link
11790 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
117a0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20  s starting at . 
117b0 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70   ** ThreadData.p
117c0 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d  Pager if memory-
117d0 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
117e0 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  abled..  */.  if
117f0 28 20 70 54 73 64 2d 3e 75 73 65 4d 65 6d 6f 72  ( pTsd->useMemor
11800 79 4d 61 6e 61 67 65 6d 65 6e 74 20 29 7b 0a 20  yManagement ){. 
11810 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70     if( pPager==p
11820 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  Tsd->pPager ){. 
11830 20 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65       pTsd->pPage
11840 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  r = pPager->pNex
11850 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
11860 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b      Pager *pTmp;
11870 0a 20 20 20 20 20 20 66 6f 72 28 70 54 6d 70 20  .      for(pTmp 
11880 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20  = pTsd->pPager; 
11890 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61  pTmp->pNext!=pPa
118a0 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e  ger; pTmp=pTmp->
118b0 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 70 54  pNext);.      pT
118c0 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67  mp->pNext = pPag
118d0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
118e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
118f0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
11900 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11910 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11920 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
11930 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
11940 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
11950 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70  */.Pgno sqlite3p
11960 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
11970 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
11980 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f  PgHdr *p = DATA_
11990 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
119a0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
119b0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
119c0 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
119d0 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
119e0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
119f0 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
11a00 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
11a10 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
11a20 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
11a30 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
11a40 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
11a50 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
11a60 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
11a70 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
11a80 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
11a90 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
11aa0 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
11ab0 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
11ac0 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
11ad0 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
11ae0 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
11af0 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
11b00 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
11b10 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
11b20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
11b30 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
11b40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11b50 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
11b60 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
11b70 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
11b80 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
11b90 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
11ba0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
11bb0 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
11bc0 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
11bd0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
11be0 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
11bf0 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
11c00 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
11c10 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
11c20 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
11c30 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
11c40 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
11c50 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
11c60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
11c70 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
11c80 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
11c90 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
11ca0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
11cb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11cc0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
11cd0 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
11ce0 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
11cf0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
11d00 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
11d10 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
11d20 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
11d30 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
11d40 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
11d50 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
11d60 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
11d70 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
11d80 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
11d90 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
11da0 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
11db0 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
11dc0 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
11dd0 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
11de0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
11df0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
11e00 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
11e10 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
11e20 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
11e30 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
11e40 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
11e50 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
11e60 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
11e70 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
11e80 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
11e90 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
11ea0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
11eb0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
11ec0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
11ed0 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
11ee0 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
11ef0 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
11f00 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
11f10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
11f20 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70  ager_ref(void *p
11f30 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
11f40 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
11f50 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61  HDR(pData);.  pa
11f60 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
11f70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
11f90 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
11fa0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
11fb0 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
11fc0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
11fd0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
11fe0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
11ff0 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
12000 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
12010 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
12020 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
12030 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
12040 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
12050 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
12060 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
12070 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
12080 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
12090 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
120a0 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
120b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
120c0 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
120d0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
120e0 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
120f0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
12100 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
12110 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
12120 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
12130 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
12140 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
12150 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
12160 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
12170 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
12180 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
12190 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
121a0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
121b0 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
121c0 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
121d0 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
121e0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
121f0 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
12200 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
12210 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
12220 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
12230 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
12240 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
12250 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
12260 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
12270 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
12280 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
12290 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
122a0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
122b0 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
122c0 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
122d0 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
122e0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
122f0 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
12300 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79  r failure, so sy
12310 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
12320 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
12330 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
12340 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
12350 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
12360 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
12370 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12380 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
12390 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
123a0 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
123b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
123c0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
123d0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64  urnal before mod
123e0 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20  ifying the main 
123f0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61  database.  ** (a
12400 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73  ssuming there is
12410 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69   a journal and i
12420 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  t needs to be sy
12430 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  nced.).  */.  if
12440 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
12450 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  nc ){.    if( !p
12460 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
12470 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12480 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12490 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  Open );.      /*
124a0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
124b0 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e  ->noSync ); // n
124c0 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73  oSync might be s
124d0 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  et if synchronou
124e0 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74  s.      ** was t
124f0 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20  urned off after 
12500 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12510 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69  was started.  Ti
12520 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66  cket #615 */.#if
12530 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
12540 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    {.        /* M
12550 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61  ake sure the pPa
12560 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65  ger->nRec counte
12570 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67  r we are keeping
12580 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20   agrees.        
12590 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  ** with the nRec
125a0 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
125b0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
125c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
125d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
125e0 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20  i64 jSz;.       
125f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12600 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
12610 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20  jfd, &jSz);.    
12620 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
12630 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12640 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12650 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
12660 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Sz );.      }.#e
12670 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
12680 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
12690 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
126a0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
126b0 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
126c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
126d0 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
126e0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
126f0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
12700 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
12710 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
12720 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
12730 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
12740 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
12750 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
12760 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
12770 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
12780 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  k. .        */. 
12790 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
127a0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
127b0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28           TRACE2(
127c0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
127d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
127e0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
127f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12800 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
12810 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
12820 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
12830 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
12840 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
12850 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
12860 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20  ager->jfd,.     
12870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12880 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
12890 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
128a0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
128b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
128c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
128d0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
128e0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
128f0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
12900 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
12910 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12920 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12930 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
12940 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
12950 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
12960 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
12970 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12980 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  }.      TRACE2("
12990 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
129a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
129b0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 72  Pager));.      r
129c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
129d0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
129e0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29  Pager->fullSync)
129f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12a00 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
12a10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
12a20 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
12a30 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
12a40 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
12a50 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
12a60 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
12a70 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
12a80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
12a90 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
12aa0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
12ab0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
12ac0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
12ad0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
12ae0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12af0 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
12b00 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
12b10 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
12b20 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
12b30 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
12b40 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
12b50 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
12b60 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
12b70 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
12b80 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
12b90 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
12ba0 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
12bb0 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
12bc0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
12bd0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
12be0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
12bf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12c00 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
12c10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
12c20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
12c30 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
12c40 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
12c50 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
12c60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
12c70 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
12c80 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
12c90 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
12ca0 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
12cb0 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
12cc0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
12cd0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
12ce0 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
12cf0 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
12d00 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
12d10 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
12d20 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
12d30 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
12d40 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
12d50 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
12d60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
12d70 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
12d80 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
12d90 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
12da0 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
12db0 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
12dc0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
12dd0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
12de0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
12df0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
12e00 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
12e10 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
12e20 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
12e30 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
12e40 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
12e50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
12e60 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
12e70 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
12e80 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
12e90 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
12ea0 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
12eb0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
12ec0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
12ed0 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
12ee0 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
12ef0 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
12f00 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
12f10 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
12f20 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
12f30 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
12f40 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
12f50 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
12f60 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
12f70 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
12f80 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
12f90 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
12fa0 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
12fb0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
12fc0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
12fd0 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
12fe0 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
12ff0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
13000 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
13010 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
13020 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
13030 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
13040 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
13050 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
13060 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
13070 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
13080 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
13090 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
130a0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
130b0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
130c0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
130d0 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
130e0 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
130f0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
13100 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
13110 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
13120 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
13130 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
13140 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13150 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13160 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69   }..  while( pLi
13170 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  st ){.    assert
13180 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29  ( pList->dirty )
13190 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
131a0 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
131b0 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e  >fd, (pList->pgn
131c0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
131d0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
131e0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
131f0 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74   rc;.    /* If t
13200 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
13210 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
13220 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
13230 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
13240 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
13250 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
13260 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67  means sqlite3pag
13270 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61  er_truncate() wa
13280 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
13290 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
132a0 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
132b0 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
132c0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
132d0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
132e0 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
132f0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
13300 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  /.    if( pList-
13310 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
13320 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 43  bSize ){.      C
13330 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
13340 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
13350 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
13360 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  6);.      TRACE3
13370 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
13380 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13390 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
133a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  gno);.      rc =
133b0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
133c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
133d0 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
133e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13400 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
13410 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
13420 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
13430 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
13440 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  t->pgno, 0);.   
13450 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61     TEST_INCR(pPa
13460 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
13470 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
13480 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
13490 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f     TRACE3("NOSTO
134a0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
134b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
134c0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
134d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
134e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
134f0 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d  n rc;.    pList-
13500 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64  >dirty = 0;.#ifd
13510 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
13520 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
13530 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
13540 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
13550 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
13560 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
13570 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
13580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13590 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
135a0 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
135b0 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
135c0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
135d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
135e0 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
135f0 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
13600 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
13610 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
13620 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
13630 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
13640 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
13650 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
13660 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
13670 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70   *p, *pList;.  p
13680 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
13690 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
136a0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
136b0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69  ){.    if( p->di
136c0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  rty ){.      p->
136d0 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a  pDirty = pList;.
136e0 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b        pList = p;
136f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13700 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
13710 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
13720 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
13730 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
13740 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
13750 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
13760 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
13770 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
13780 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
13790 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
137a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
137b0 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
137c0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
137d0 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
137e0 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
137f0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
13800 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
13810 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
13820 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
13830 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
13840 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
13850 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
13860 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
13870 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
13880 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
13890 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
138a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
138b0 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
138c0 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30  rnal) ) return 0
138d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  ;.  if( sqlite3O
138e0 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
138f0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  ck(pPager->fd) )
13900 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
13910 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
13920 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
13930 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13940 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13950 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
13960 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
13970 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
13980 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
13990 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
139a0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
139b0 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
139c0 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
139d0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
139e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
139f0 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
13a00 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
13a10 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
13a20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  the pPager->errM
13a30 61 73 6b 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ask variable..*/
13a40 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13a50 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
13a60 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
13a70 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
13a80 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
13a90 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
13aa0 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
13ab0 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
13ac0 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
13ad0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
13ae0 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73  .  ** require us
13af0 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
13b00 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
13b10 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
13b20 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
13b30 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ced;..  /* If we
13b40 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
13b50 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
13b60 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
13b70 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20  fsync().  ** on 
13b80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13b90 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
13ba0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
13bb0 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65  his is a.  ** ve
13bc0 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
13bd0 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
13be0 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
13bf0 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
13c00 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
13c10 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  helped..  */.  i
13c20 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61  f( pPg==0 && pPa
13c30 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73  ger->pFirst && s
13c40 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29  yncOk && !MEMDB)
13c50 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
13c60 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
13c70 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
13c80 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
13c90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
13ca0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
13cb0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sync ){.      /*
13cc0 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
13cd0 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
13ce0 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
13cf0 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
13d00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
13d10 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
13d20 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
13d30 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
13d40 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72  .      ** header
13d50 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
13d60 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
13d70 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
13d80 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  have.      ** al
13d90 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
13da0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
13db0 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
13dc0 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20  header is.      
13dd0 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
13de0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
13df0 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
13e00 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
13e10 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
13e20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13e30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
13e40 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
13e50 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
13e60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
13e70 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
13e80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13e90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13ea0 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
13eb0 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  First;.  }.  if(
13ec0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pPg==0 ){.    r
13ed0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13ee0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
13ef0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
13f00 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
13f10 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
13f20 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
13f30 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
13f40 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
13f50 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
13f60 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
13f70 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
13f80 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
13f90 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
13fa0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
13fb0 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66  t( pPg );.    if
13fc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13fd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13fe0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
13ff0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
14000 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
14010 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
14020 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
14030 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
14040 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
14050 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
14060 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
14070 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
14080 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  bling the.  ** s
14090 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  qlite_dont_rollb
140a0 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
140b0 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
140c0 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
140d0 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ion..  ** It is 
140e0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
140f0 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
14100 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
14110 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  aysRollback.  **
14120 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
14130 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
14140 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
14150 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
14160 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74  member.  ** that
14170 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
14180 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
14190 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
141a0 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
141b0 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
141c0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
141d0 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
141e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
141f0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
14200 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
14210 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
14220 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   1;.  }..  /* Un
14230 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
14240 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
14250 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
14260 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75  h table.  */.  u
14270 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
14280 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
14290 65 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a  er->nOvfl);..  *
142a0 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
142b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
142c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
142d0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
142e0 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c   to free superfl
142f0 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  uous dynamically
14300 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
14310 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65  y.** held by the
14320 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d   pager system. M
14330 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
14340 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72  any SQLite pager
14350 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
14360 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
14370 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74  ead may be sqlit
14380 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a  eFree()ed..**.**
14390 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d   nReq is the num
143a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
143b0 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e  memory required.
143c0 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20   Once this much 
143d0 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65  has.** been rele
143e0 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  ased, the functi
143f0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65  on returns. A ne
14400 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72  gative value for
14410 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66   nReq means.** f
14420 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
14430 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20  ry as possible. 
14440 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
14450 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
14460 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65  mber .** of byte
14470 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
14480 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ased..*/.#ifdef 
14490 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
144a0 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
144b0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
144c0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
144d0 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e  int nReq){.  con
144e0 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  st ThreadData *p
144f0 54 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54  Tsdro = sqlite3T
14500 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
14510 79 28 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b  y();.  Pager *p;
14520 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64  .  int nReleased
14530 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a   = 0;.  int i;..
14540 20 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20    /* If the the 
14550 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
14560 68 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f  held, this subro
14570 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a  utine becomes a.
14580 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20    ** o-op; zero 
14590 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
145a0 61 72 65 20 66 72 65 65 64 2e 20 20 54 68 69 73  are freed.  This
145b0 20 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a   is because.  **
145c0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64   some of the cod
145d0 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69  e invoked by thi
145e0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
145f0 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20  lso.  ** try to 
14600 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78  obtain the mutex
14610 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  , resulting in a
14620 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   deadlock..  */.
14630 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49    if( sqlite3OsI
14640 6e 4d 75 74 65 78 28 29 20 29 7b 0a 20 20 20 20  nMutex() ){.    
14650 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
14660 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f   /* Outermost lo
14670 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d  op runs for at m
14680 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f  ost two iteratio
14690 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74  ns. First iterat
146a0 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20  ion we.  ** try 
146b0 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74  to find memory t
146c0 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  hat can be relea
146d0 73 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c  sed without call
146e0 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63  ing fsync(). Sec
146f0 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69  ond.  ** iterati
14700 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72  on (which only r
14710 75 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74  uns if the first
14720 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20   failed to free 
14730 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20  nReq bytes of.  
14740 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65  ** memory) is pe
14750 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20  rmitted to call 
14760 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73  fsync(). This is
14770 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20   of course much 
14780 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e  more .  ** expen
14790 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  sive..  */.  for
147a0 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29  (i=0; i<=1; i++)
147b0 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  {..    /* Loop t
147c0 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53  hrough all the S
147d0 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65  QLite pagers ope
147e0 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
147f0 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  nt thread. */.  
14800 20 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e    for(p=pTsdro->
14810 70 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52  pPager; p && (nR
14820 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
14830 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e  d<nReq); p=p->pN
14840 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ext){.      PgHd
14850 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e  r *pPg;.      in
14860 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t rc;..      /* 
14870 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20  For each pager, 
14880 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d  try to free as m
14890 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73  any pages as pos
148a0 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a  sible (without .
148b0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
148c0 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73   fsync() if this
148d0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74   is the first it
148e0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  eration of the o
148f0 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20  utermost .      
14900 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20  ** loop)..      
14910 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
14920 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
14930 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
14940 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70  , i, &pPg)) && p
14950 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Pg) {.        /*
14960 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70   We've found a p
14970 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20  age to free. At 
14980 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
14990 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20  age has been .  
149a0 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64        ** removed
149b0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68   from the page h
149c0 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d  ash-table, free-
149d0 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d  list and synced-
149e0 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  list .        **
149f0 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
14a00 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
14a10 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
14a20 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
14a30 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74      ** Remove it
14a40 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20   from this list 
14a50 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a  before freeing..
14a60 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
14a70 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63     ** Todo: Chec
14a80 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d  k the Pager.pStm
14a90 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73  t list to make s
14aa0 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20  ure this is Ok. 
14ab0 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  It .        ** p
14ac0 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67  robably is thoug
14ad0 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  h..        */.  
14ae0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d        PgHdr *pTm
14af0 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
14b00 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20  t( pPg );.      
14b10 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72    page_remove_fr
14b20 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  om_stmt_list(pPg
14b30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14b40 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pg==p->pAll ){. 
14b50 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c            p->pAl
14b60 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
14b70 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  l;.        }else
14b80 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
14b90 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70   pTmp=p->pAll; p
14ba0 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70  Tmp->pNextAll!=p
14bb0 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  Pg; pTmp=pTmp->p
14bc0 4e 65 78 74 41 6c 6c 20 29 3b 0a 20 20 20 20 20  NextAll );.     
14bd0 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
14be0 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
14bf0 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  All;.        }. 
14c00 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
14c10 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53   += sqliteAllocS
14c20 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ize(pPg);.      
14c30 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
14c40 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
14c50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
14c70 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * An error occur
14c80 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
14c90 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
14ca0 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20  e file or .     
14cb0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e     ** journal in
14cc0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29   pager_recycle()
14cd0 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e  . The error is n
14ce0 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ot returned to t
14cf0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
14d00 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
14d10 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
14d20 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
14d30 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 2e  rrMask variable.
14d40 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
14d50 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
14d60 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
14d70 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e  er (or users, in
14d80 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20   the case .     
14d90 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65     ** of a share
14da0 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f  d pager cache) o
14db0 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20  f the pager for 
14dc0 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20  which the error 
14dd0 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20  occured..       
14de0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14df0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  rt( rc==SQLITE_I
14e00 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OERR || rc==SQLI
14e10 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TE_FULL );.     
14e20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74     assert( p->st
14e30 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
14e40 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70  VED );.        p
14e50 61 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63  ager_error(p, rc
14e60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14e70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
14e80 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64  Released;.}.#end
14e90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
14ea0 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
14eb0 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  EMENT */../*.** 
14ec0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
14ed0 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
14ee0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
14ef0 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
14f00 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
14f10 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
14f20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
14f30 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
14f40 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
14f50 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
14f60 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
14f70 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
14f80 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
14f90 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
14fa0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
14fb0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
14fc0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
14fd0 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
14fe0 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
14ff0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
15000 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
15010 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
15020 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
15030 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
15040 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
15050 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
15060 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
15070 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
15080 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
15090 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
150a0 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
150b0 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
150c0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
150d0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
150e0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
150f0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
15100 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
15110 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
15120 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
15130 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
15140 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
15150 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
15160 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
15170 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
15180 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
15190 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
151a0 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
151b0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
151c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
151d0 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
151e0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
151f0 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
15200 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
15210 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
15220 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
15230 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
15240 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
15250 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
15260 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
15270 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
15280 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
15290 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
152a0 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
152b0 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
152c0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
152d0 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
152e0 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
152f0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
15300 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
15310 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65  e3pager_get(Page
15320 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
15330 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50  pgno, void **ppP
15340 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
15350 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
15360 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
15370 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
15380 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
15390 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
153a0 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
153b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
153c0 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20  is, or zero, is 
153d0 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
153e0 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
153f0 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
15400 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
15410 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
15420 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
15430 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
15440 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
15450 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
15460 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
15470 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
15480 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
15490 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a  pPager!=0 );.  *
154a0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  ppPage = 0;.  if
154b0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
154c0 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f  k & ~(PAGER_ERR_
154d0 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74  FULL) ){.    ret
154e0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
154f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  e(pPager);.  }..
15500 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
15510 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
15520 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
15530 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
15540 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
15550 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
15560 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
15570 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20  ef==0 && !MEMDB 
15580 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
15590 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
155a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
155b0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
155c0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
155d0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
155e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
155f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15600 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
15610 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  er, rc);.      }
15620 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
15630 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
15640 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
15650 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
15660 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
15670 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
15680 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
15690 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
156a0 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
156b0 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
156c0 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72    if( hasHotJour
156d0 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  nal(pPager) ){. 
156e0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20        int rc;.. 
156f0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
15700 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
15710 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
15720 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
15730 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
15740 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
15750 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
15760 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
15770 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
15780 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58  the.       ** EX
15790 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
157a0 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
157b0 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
157c0 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  open the.       
157d0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
157e0 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
157f0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
15800 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
15810 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  e.       ** data
15820 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
15830 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
15840 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
15850 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
15860 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20      ** back..   
15870 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a      ** .       *
15880 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
15890 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
158a0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
158b0 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
158c0 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
158d0 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
158e0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
158f0 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
15900 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a  ail to.       **
15910 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e   obtain it's own
15920 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
15930 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15940 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  file..       */.
15950 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15960 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
15970 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
15980 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66  LOCK);.       if
15990 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
159a0 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
159b0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
159c0 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
159d0 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
159e0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
159f0 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
15a00 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
15a10 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
15a20 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
15a30 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
15a40 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
15a50 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70  E;..       /* Op
15a60 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
15a70 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e  or reading only.
15a80 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
15a90 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a  BUSY if.       *
15aa0 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  * we are unable 
15ab0 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
15ac0 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nal file. .     
15ad0 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54    **.       ** T
15ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
15af0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
15b00 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c   be locked itsel
15b10 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a  f.  The.       *
15b20 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
15b30 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
15b40 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
15b50 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
15b60 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69  .       ** a wri
15b70 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72  te lock, so ther
15b80 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63  e is never any c
15b90 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20  hance of two or 
15ba0 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70  more.       ** p
15bb0 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67  rocesses opening
15bc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20   the journal at 
15bd0 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
15be0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
15c00 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65  enReadOnly(pPage
15c10 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50  r->zJournal, &pP
15c20 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
15c30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15c40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15c50 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
15c60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
15c70 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
15c80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
15c90 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
15ca0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15cb0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
15cc0 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
15cd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
15ce0 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   1;.       pPage
15cf0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
15d00 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  d = 0;.       pP
15d10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15d20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61   = 0;.       pPa
15d30 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
15d40 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
15d50 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
15d60 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c  0;..       /* Pl
15d70 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
15d80 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
15d90 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
15da0 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a  e write.       *
15db0 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
15dc0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
15dd0 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ck..       */.  
15de0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
15df0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
15e00 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
15e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15e20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
15e30 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
15e40 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d 0a  , rc);.       }.
15e50 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
15e60 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
15e70 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61  /* Search for pa
15e80 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ge in cache */. 
15e90 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c     pPg = pager_l
15ea0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
15eb0 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  no);.    if( MEM
15ec0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  DB && pPager->st
15ed0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
15ee0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
15ef0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
15f00 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
15f10 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
15f20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
15f30 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
15f40 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
15f50 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
15f60 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e  t h;.    TEST_IN
15f70 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
15f80 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
15f90 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
15fa0 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65  >mxPage || pPage
15fb0 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20  r->pFirst==0 || 
15fc0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  MEMDB ){.      /
15fd0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
15fe0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  age */.      pPg
15ff0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
16000 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29  aw( sizeof(*pPg)
16010 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
16020 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ize.            
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
16050 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
16060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
16080 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67   MEMDB*sizeof(Pg
16090 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20  History) );.    
160a0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
160b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
160c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
160d0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
160e0 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pPg, 0, sizeof
160f0 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69  (*pPg));.      i
16100 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
16110 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
16120 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
16130 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66  ager), 0, sizeof
16140 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20  (PgHistory));.  
16150 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
16160 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
16170 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
16180 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
16190 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67  pAll;.      pPag
161a0 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
161b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
161c0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
161d0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70   pPager->nPage>p
161e0 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20  Pager->nMaxPage 
161f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16200 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  t( pPager->nMaxP
16210 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50  age==(pPager->nP
16220 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  age-1) );.      
16230 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61    pPager->nMaxPa
16240 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ge++;.      }.  
16250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
16260 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c  c = pager_recycl
16270 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  e(pPager, 1, &pP
16280 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
16290 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
162a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
162b0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
162c0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
162d0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 67 29       assert(pPg)
162e0 20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   ;.    }.    pPg
162f0 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
16300 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
16310 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  InJournal && (in
16320 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
16330 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
16340 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
16350 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61  Memory(pPager->a
16360 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f  InJournal, pgno/
16370 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  8);.      assert
16380 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
16390 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70  lOpen );.      p
163a0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
163b0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
163c0 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
163d0 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
163e0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
163f0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Sync = 0;.    }e
16400 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
16410 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
16420 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
16430 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
16440 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
16450 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67  nStmt && (int)pg
16460 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
16470 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
16480 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49    && (pPager->aI
16490 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20  nStmt[pgno/8] & 
164a0 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
164b0 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  0 ){.      page_
164c0 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
164d0 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
164e0 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d  {.      page_rem
164f0 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69  ove_from_stmt_li
16500 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
16510 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
16520 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  0;.    pPg->nRef
16530 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46   = 1;.    REFINF
16540 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67  O(pPg);.    pPag
16550 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
16560 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
16570 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  gno);.    pPg->p
16580 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
16590 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
165a0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
165b0 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
165c0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
165d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
165e0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
165f0 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
16600 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
16610 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
16620 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
16630 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45    if( pPager->nE
16640 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20  xtra>0 ){.      
16650 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
16660 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
16670 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  r), 0, pPager->n
16680 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
16690 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
166a0 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
166b0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
166c0 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
166d0 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
166e0 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
166f0 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
16700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16710 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
16720 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
16730 74 28 70 50 61 67 65 72 29 3c 28 69 6e 74 29 70  t(pPager)<(int)p
16740 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  gno ){.      mem
16750 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
16760 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
16770 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
16780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
16790 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73  nt rc;.      ass
167a0 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
167b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
167c0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
167d0 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
167e0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
167f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
16800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16810 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
16820 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
16830 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
16840 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20  O_DATA(pPg),.   
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16860 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
16870 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
16880 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
16890 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E3("FETCH %d pag
168a0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
168b0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
168c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  gno);.      CODE
168d0 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
168e0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
168f0 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20  g->pgno, 3);.   
16900 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16910 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16920 69 36 34 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20  i64 fileSize;.  
16930 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16940 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
16950 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65  er->fd,&fileSize
16960 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )!=SQLITE_OK.   
16970 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66              || f
16980 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50  ileSize>=pgno*pP
16990 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
169a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
169b0 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50  te3pager_unref(P
169c0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
169d0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
169e0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
169f0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
16a00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16a10 20 20 20 20 20 20 20 63 6c 65 61 72 5f 73 69 6d         clear_sim
16a20 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28  ulated_io_error(
16a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
16a40 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
16a50 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
16a60 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
16a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16a80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53  lse{.        TES
16a90 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
16aa0 52 65 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Read);.      }. 
16ab0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
16ac0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
16ad0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
16ae0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
16af0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
16b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
16b10 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
16b20 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
16b30 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54   cache. */.    T
16b40 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
16b50 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65  >nHit);.    page
16b60 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
16b70 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52   *ppPage = PGHDR
16b80 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
16b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16ba0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
16bb0 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
16bc0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
16bd0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
16be0 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
16bf0 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
16c00 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
16c10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
16c20 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
16c30 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
16c40 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
16c50 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
16c60 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20  e3pager_get().  
16c70 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
16c80 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
16c90 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
16ca0 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73  e3pager_get() is
16cb0 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
16cc0 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
16cd0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
16ce0 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
16cf0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
16d00 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
16d10 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
16d20 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
16d30 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
16d40 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
16d50 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
16d60 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
16d70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ened..*/.void *s
16d80 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
16d90 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
16da0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
16db0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
16dc0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
16dd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
16de0 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  no!=0 );.  if( p
16df0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
16e00 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   ~(PAGER_ERR_FUL
16e10 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  L) ){.    return
16e20 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
16e30 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
16e40 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
16e50 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
16e60 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
16e70 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50  pPg);.  return P
16e80 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16e90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
16ea0 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
16eb0 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
16ec0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
16ed0 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
16ee0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
16ef0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
16f00 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
16f10 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
16f20 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
16f30 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
16f40 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
16f50 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
16f60 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
16f70 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
16f80 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
16f90 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f  e3pager_unref(vo
16fa0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
16fb0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
16fc0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
16fd0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
16fe0 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
16ff0 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  .  pPg = DATA_TO
17000 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
17010 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
17020 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e  ef>0 );.  pPg->n
17030 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref--;.  REFINFO
17040 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  (pPg);..  CHECK_
17050 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
17060 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
17070 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
17080 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30  o a page reach 0
17090 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
170a0 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61  destructor and a
170b0 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
170c0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a  he freelist..  *
170d0 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  /.  if( pPg->nRe
170e0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  f==0 ){.    Page
170f0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70  r *pPager;.    p
17100 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
17110 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
17120 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  extFree = 0;.   
17130 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
17140 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b  = pPager->pLast;
17150 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
17160 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  st = pPg;.    if
17170 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
17180 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
17190 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
171a0 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ree = pPg;.    }
171b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
171c0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
171d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
171e0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
171f0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72   && pPager->pFir
17200 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20  stSynced==0 ){. 
17210 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
17220 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b  rstSynced = pPg;
17230 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17240 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
17250 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  or ){.      pPag
17260 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
17270 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
17280 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
17290 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
172a0 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
172b0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
172c0 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
172d0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
172e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
172f0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
17300 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
17310 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
17320 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
17330 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
17340 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20   && !MEMDB ){.  
17350 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
17360 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
17370 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
17380 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17390 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c  Create a journal
173a0 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72   file for pPager
173b0 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  .  There should 
173c0 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
173d0 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c  ERVED.** or EXCL
173e0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
173f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17400 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
17410 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
17420 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
17430 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
17440 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  g.  Return an er
17450 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c  ror code and rel
17460 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74  ease the.** writ
17470 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69  e lock if anythi
17480 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
17490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
174a0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
174b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
174c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
174d0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
174e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
174f0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
17500 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ERVED );.  asser
17510 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
17520 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61  alOpen==0 );.  a
17530 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
17540 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
17550 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
17560 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
17570 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70    sqlite3pager_p
17580 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
17590 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
175a0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d  ournal = sqliteM
175b0 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
175c0 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
175d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
175e0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
175f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17600 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  MEM;.    goto fa
17610 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
17620 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rnal;.  }.  rc =
17630 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
17640 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e  clusive(pPager->
17650 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
17660 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20  r->jfd,.        
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
17690 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50  >tempFile);.  pP
176a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
176b0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
176c0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
176d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
176e0 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Hdr = 0;.  if( r
176f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17700 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
17710 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
17720 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
17730 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67  SetFullSync(pPag
17740 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
17750 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71  >fullSync);.  sq
17760 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79  lite3OsSetFullSy
17770 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
17780 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29  Pager->fullSync)
17790 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  ;.  sqlite3OsOpe
177a0 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65  nDirectory(pPage
177b0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
177c0 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70  zDirectory);.  p
177d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
177e0 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72  en = 1;.  pPager
177f0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
17800 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17810 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
17820 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
17830 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50  llback = 0;.  pP
17840 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
17850 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
17860 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
17870 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
17880 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
17890 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
178a0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
178b0 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
178c0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
178d0 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20  dbSize;..  rc = 
178e0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
178f0 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
17900 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
17910 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
17920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
17930 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
17940 74 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72  tmt_begin(pPager
17950 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
17960 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
17970 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
17980 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
17990 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
179a0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
179b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
179c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
179d0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
179e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
179f0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
17a00 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46  urnal:.  sqliteF
17a10 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
17a20 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
17a30 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
17a40 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  0;.  if( rc==SQL
17a50 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
17a60 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
17a70 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
17a80 72 65 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  re, then we will
17a90 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e 67 20   not be closing 
17aa0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
17ab0 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65 74 65   file. So delete
17ac0 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   any journal fil
17ad0 65 20 77 65 20 6d 61 79 20 68 61 76 65 20 6a 75  e we may have ju
17ae0 73 74 20 63 72 65 61 74 65 64 2e 20 4f 74 68 65  st created. Othe
17af0 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68  rwise,.    ** th
17b00 65 20 73 79 73 74 65 6d 20 77 69 6c 6c 20 67 65  e system will ge
17b10 74 20 63 6f 6e 66 75 73 65 64 2c 20 77 65 20 68  t confused, we h
17b20 61 76 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ave a read-lock 
17b30 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
17b40 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65 72 69  a.    ** mysteri
17b50 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  ous journal has 
17b60 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20  appeared in the 
17b70 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20 20 20  filesystem..    
17b80 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  */.    sqlite3Os
17b90 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
17ba0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 65 6c 73  Journal);.  }els
17bb0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e{.    sqlite3Os
17bc0 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
17bd0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
17be0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
17bf0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
17c00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17c10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
17c20 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
17c30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
17c40 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
17c50 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
17c60 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
17c70 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
17c80 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
17c90 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73  ager_commit() is
17ca0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
17cb0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
17cc0 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
17cd0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
17ce0 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
17cf0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
17d00 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
17d10 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  _unref() is call
17d20 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
17d30 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
17d40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
17d50 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
17d60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
17d70 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
17d80 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
17d90 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
17da0 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
17db0 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
17dc0 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
17dd0 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
17de0 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
17df0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
17e00 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
17e10 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
17e20 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
17e30 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
17e40 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
17e50 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
17e60 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
17e70 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
17e80 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
17e90 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
17ea0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
17eb0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
17ec0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
17ed0 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
17ee0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
17ef0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
17f00 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
17f10 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
17f20 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
17f30 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
17f40 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
17f50 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
17f60 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
17f70 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
17f80 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
17f90 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
17fa0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
17fb0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
17fc0 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
17fd0 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
17fe0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17ff0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
18000 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
18010 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
18020 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
18030 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
18040 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
18050 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
18060 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
18070 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
18080 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
18090 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
180a0 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
180b0 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
180c0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65   sqlite3pager_be
180d0 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  gin(void *pData,
180e0 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
180f0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
18100 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
18110 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
18120 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
18130 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18140 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
18150 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
18160 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18170 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
18180 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
18190 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
181a0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
181b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
181c0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
181d0 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   );.    if( MEMD
181e0 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
181f0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
18200 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
18210 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
18220 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
18230 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
18240 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18250 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
18260 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
18270 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
18280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18290 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
182a0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
182b0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
182c0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
182d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
182e0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
182f0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
18300 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
18310 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18320 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18340 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18350 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
18360 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
18370 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54  .      TRACE2("T
18380 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
18390 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
183a0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
183b0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
183c0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
183d0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
183e0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
183f0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
18400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18410 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
18430 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
18440 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
18450 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
18460 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
18470 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
18480 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
18490 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
184a0 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
184b0 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
184c0 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
184d0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
184e0 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
184f0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
18500 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
18510 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
18520 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
18530 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
18540 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
18550 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
18560 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
18570 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
18580 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
18590 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
185a0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
185b0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
185c0 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
185d0 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
185e0 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
185f0 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
18600 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
18610 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
18620 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
18630 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
18640 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
18650 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
18660 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
18670 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
18680 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
18690 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
186a0 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
186b0 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
186c0 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
186d0 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
186e0 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
186f0 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
18700 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
18710 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
18720 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
18730 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
18740 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
18750 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18760 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
18770 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
18780 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
18790 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
187a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
187b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
187c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
187d0 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
187e0 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
187f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
18800 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65  rMask ){ .    re
18810 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
18820 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
18830 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
18840 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
18850 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
18860 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
18870 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
18880 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
18890 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
188a0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
188b0 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
188c0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
188d0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
188e0 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
188f0 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
18900 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
18910 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69  ..  */.  pPg->di
18920 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  rty = 1;.  if( p
18930 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
18940 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c   (pPg->inStmt ||
18950 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
18960 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
18970 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
18980 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
18990 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
189a0 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
189b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
189c0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
189d0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
189e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
189f0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
18a00 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
18a10 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
18a20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
18a30 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
18a40 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
18a50 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
18a60 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
18a70 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
18a80 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
18a90 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
18aa0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
18ab0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
18ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
18ad0 67 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61 2c  ger_begin(pData,
18ae0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
18af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18b00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18b10 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18b20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
18b30 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
18b40 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
18b50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
18b60 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
18b70 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
18b80 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
18b90 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
18ba0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18bb0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
18bc0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
18bd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
18be0 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
18bf0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
18c00 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
18c10 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
18c20 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
18c30 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
18c40 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
18c50 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
18c60 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
18c70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
18c80 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
18c90 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
18ca0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
18cb0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
18cc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
18cd0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
18ce0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
18cf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18d00 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
18d10 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a  && (pPager->useJ
18d20 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29  ournal || MEMDB)
18d30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
18d40 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
18d50 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
18d60 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ze ){.        in
18d70 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  t szPg;.        
18d80 75 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20 20  u32 saved;.     
18d90 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
18da0 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74            PgHist
18db0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
18dc0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
18dd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
18de0 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e     TRACE3("JOURN
18df0 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
18e00 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18e10 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
18e20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
18e30 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30   pHist->pOrig==0
18e40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48   );.          pH
18e50 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c  ist->pOrig = sql
18e60 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
18e70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
18e80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18e90 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
18eb0 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
18ec0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
18ed0 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
18ee0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
18ef0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
18f00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  e{.          u32
18f10 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
18f20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
18f30 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
18f40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
18f50 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
18f60 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
18f70 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
18f80 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
18f90 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
18fa0 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ifies.          
18fb0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
18fc0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
18fd0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
18fe0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
18ff0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
19000 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
19010 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
19020 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
19030 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
19040 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
19050 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61  pPg->pgno, pData
19060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  );.          sav
19070 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44  ed = *(u32*)PGHD
19080 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
19090 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
190a0 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63     store32bits(c
190b0 6b 73 75 6d 2c 20 70 50 67 2c 20 70 50 61 67 65  ksum, pPg, pPage
190c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
190d0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
190e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
190f0 38 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  8;.          sto
19100 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
19110 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
19120 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19130 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
19140 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72  er->jfd, &((char
19150 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a  *)pData)[-4], sz
19160 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Pg);.          p
19170 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19180 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20  f += szPg;.     
19190 20 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f 55       TRACE4("JOU
191a0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
191b0 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
191e0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
191f0 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
19200 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50          CODEC(pP
19210 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
19220 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
19230 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48        *(u32*)PGH
19240 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
19250 20 70 50 61 67 65 72 29 20 3d 20 73 61 76 65 64   pPager) = saved
19260 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
19270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19280 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
19290 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
192a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
192b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
192c0 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
192d0 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  _ERR_FULL;.     
192e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
192f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
19300 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19310 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
19320 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19330 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
19340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
19350 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
19360 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
19370 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
19380 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  ;.          pPg-
19390 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
193a0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
193b0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
193c0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
193d0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
193e0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
193f0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
19400 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
19410 20 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61            page_a
19420 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
19430 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
19440 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
19450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19460 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
19470 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
19480 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
19490 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
194a0 20 20 20 20 20 54 52 41 43 45 34 28 22 41 50 50       TRACE4("APP
194b0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
194c0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
194e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
194f0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
19500 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
19510 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
19520 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
19530 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
19540 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
19550 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69    }.      pPg->i
19560 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
19570 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
19580 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
19590 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
195a0 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
195b0 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
195c0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
195d0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
195e0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
195f0 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
19600 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
19610 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
19620 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
19630 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
19640 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
19650 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
19660 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
19670 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
19680 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
19690 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
196a0 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
196b0 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
196c0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
196d0 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
196e0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
196f0 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
19700 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
19710 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
19720 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
19730 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
19740 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
19750 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
19760 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
19770 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
19780 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t->pStmt==0 );. 
19790 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
197a0 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
197b0 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
197c0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
197d0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
197e0 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
197f0 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
19800 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Stmt, PGHDR_TO_D
19810 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
19820 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
19830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
19840 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
19850 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
19860 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
19870 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
19880 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19890 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
198a0 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
198b0 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 43 4f   -4);.        CO
198c0 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
198d0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
198e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
198f0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
19900 61 67 65 72 2d 3e 73 74 66 64 2c 28 28 63 68 61  ager->stfd,((cha
19910 72 2a 29 70 44 61 74 61 29 2d 34 2c 0a 20 20 20  r*)pData)-4,.   
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19930 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
19940 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b  er->pageSize+4);
19950 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
19960 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
19970 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
19980 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
19990 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
199a0 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
199b0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
199c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
199d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
199e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
199f0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
19a00 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
19a10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
19a20 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
19a30 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  RR_FULL;.       
19a40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19a60 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
19a70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
19a80 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
19a90 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
19aa0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
19ab0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
19ac0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
19ad0 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  7);.      }.    
19ae0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
19af0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
19b00 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
19b10 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
19b20 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
19b30 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  n..  */.  if( pP
19b40 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
19b50 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  t)pPg->pgno ){. 
19b60 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
19b70 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
19b80 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26     if( !MEMDB &&
19b90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
19ba0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  =PENDING_BYTE/pP
19bb0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
19bc0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
19bd0 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a  dbSize++;.    }.
19be0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19bf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19c00 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
19c10 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
19c20 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
19c30 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
19c40 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
19c50 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  _write().  In ot
19c60 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
19c70 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
19c80 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
19c90 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
19ca0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20  he page..*/.int 
19cb0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77  sqlite3pager_isw
19cc0 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70  riteable(void *p
19cd0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
19ce0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
19cf0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
19d00 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b  turn pPg->dirty;
19d10 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
19d20 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
19d30 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
19d40 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69   content of a si
19d50 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74  ngle page with t
19d60 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
19d70 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61  n the third.** a
19d80 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
19d90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65  sqlite3pager_ove
19da0 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
19db0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
19dc0 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
19dd0 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
19de0 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
19df0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
19e00 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
19e10 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
19e20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19e30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
19e40 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
19e50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
19e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19e70 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20    memcpy(pPage, 
19e80 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
19e90 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
19ea0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
19eb0 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
19ec0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19ed0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
19ee0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
19ef0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
19f00 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
19f10 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
19f20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
19f30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
19f40 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20  age "pgno" back 
19f50 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
19f60 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
19f70 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
19f80 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
19f90 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
19fa0 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
19fb0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
19fc0 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
19fd0 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
19fe0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
19ff0 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
1a000 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
1a010 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
1a020 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
1a030 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
1a040 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1a050 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
1a060 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1a070 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
1a080 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70   the.** sqlite3p
1a090 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
1a0a0 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
1a0b0 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
1a0c0 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
1a0d0 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
1a0e0 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
1a0f0 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
1a100 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
1a110 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
1a120 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1a130 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
1a140 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
1a150 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
1a160 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
1a170 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
1a180 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
1a190 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
1a1a0 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
1a1b0 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
1a1c0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
1a1d0 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
1a1e0 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
1a1f0 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
1a200 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1a210 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
1a220 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
1a230 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
1a240 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
1a250 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
1a260 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
1a270 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
1a280 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
1a290 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
1a2a0 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
1a2b0 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
1a2c0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1a2d0 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
1a2e0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
1a2f0 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
1a300 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
1a310 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
1a320 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
1a330 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  se the page cont
1a340 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c  ains.** critical
1a350 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
1a360 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
1a370 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62  it gets rolled b
1a380 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20  ack in spite.** 
1a390 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  of the dont_roll
1a3a0 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
1a3b0 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
1a3c0 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67  r_dont_write(Pag
1a3d0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1a3e0 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
1a3f0 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  *pPg;..  if( MEM
1a400 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  DB ) return;..  
1a410 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
1a420 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
1a430 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  ;.  pPg->alwaysR
1a440 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
1a450 66 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64  f( pPg && pPg->d
1a460 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d  irty && !pPager-
1a470 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1a480 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1a490 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e  Size==(int)pPg->
1a4a0 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e  pgno && pPager->
1a4b0 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65  origDbSize<pPage
1a4c0 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
1a4d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61     /* If this pa
1a4e0 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  ges is the last 
1a4f0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
1a500 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
1a510 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a  s grown.      **
1a520 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
1a530 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
1a540 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72   then do NOT mar
1a550 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
1a560 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68  ean..      ** Wh
1a570 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
1a580 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d  file grows, we m
1a590 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ust make sure th
1a5a0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1a5b0 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77  .      ** gets w
1a5c0 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20  ritten at least 
1a5d0 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65  once so that the
1a5e0 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20   disk file will 
1a5f0 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  be the correct. 
1a600 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66       ** size. If
1a610 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74   you do not writ
1a620 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20  e this page and 
1a630 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a640 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  file.      ** on
1a650 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75   the disk ends u
1a660 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c  p being too smal
1a670 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64  l, that can lead
1a680 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20   to database.   
1a690 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e     ** corruption
1a6a0 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74   during the next
1a6b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1a6c0 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65      */.    }else
1a6d0 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  {.      TRACE3("
1a6e0 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
1a6f0 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e  %d of %d\n", pgn
1a700 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1a710 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  r));.      pPg->
1a720 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
1a730 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1a740 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
1a750 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
1a760 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
1a770 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1a780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
1a790 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1a7a0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
1a7b0 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62   that if a rollb
1a7c0 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ack occurs,.** i
1a7d0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
1a7e0 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ry to restore th
1a7f0 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69  e data on the gi
1a800 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a  ven page.  This.
1a810 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
1a820 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
1a830 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20   have to record 
1a840 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
1a850 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63  n the.** rollbac
1a860 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f  k journal..*/.vo
1a870 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
1a880 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f  dont_rollback(vo
1a890 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
1a8a0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
1a8b0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
1a8c0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1a8d0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1a8e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1a8f0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 58 43 4c  tate!=PAGER_EXCL
1a900 55 53 49 56 45 20 7c 7c 20 70 50 61 67 65 72 2d  USIVE || pPager-
1a910 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
1a920 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1a930 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
1a940 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61  ack || pPager->a
1a950 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1a960 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
1a970 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a  .  if( !pPg->inJ
1a980 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
1a990 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1a9a0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1a9b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1a9c0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a9d0 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
1a9e0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
1a9f0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1aa00 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1aa10 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1aa20 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  al = 1;.    if( 
1aa30 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1aa40 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
1aa50 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1aa60 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1aa70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1aa80 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
1aa90 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
1aaa0 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 33 28     }.    TRACE3(
1aab0 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70  "DONT_ROLLBACK p
1aac0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
1aad0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
1aae0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1aaf0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1ab00 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
1ab10 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
1ab20 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
1ab30 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
1ab40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1ab50 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
1ab60 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
1ab70 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1ab80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ab90 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
1aba0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
1abb0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
1abc0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1abd0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1abe0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
1abf0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a  _list(pPg);.  }.
1ac00 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
1ac10 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
1ac20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50  ./*.** Clear a P
1ac30 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a  gHistory block.*
1ac40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
1ac50 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73  earHistory(PgHis
1ac60 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20  tory *pHist){.  
1ac70 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
1ac80 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69  ->pOrig);.  sqli
1ac90 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
1aca0 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70  tmt);.  pHist->p
1acb0 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73  Orig = 0;.  pHis
1acc0 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  t->pStmt = 0;.}.
1acd0 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c  #else.#define cl
1ace0 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65  earHistory(x).#e
1acf0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  ndif../*.** Comm
1ad00 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
1ad10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
1ad20 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
1ad30 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
1ad40 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
1ad50 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
1ad60 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
1ad70 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
1ad80 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1ad90 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1ada0 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
1adb0 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
1adc0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
1add0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1ade0 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61  3pager_commit(Pa
1adf0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1ae00 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
1ae10 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
1ae20 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41  ger->errMask==PA
1ae30 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
1ae40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ae50 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
1ae60 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1ae70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ae80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1ae90 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
1aea0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1aeb0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1aec0 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
1aed0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
1aee0 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
1aef0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1af00 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1af10 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
1af20 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
1af30 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1af40 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f    }.  TRACE2("CO
1af50 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1af60 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1af70 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1af80 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1af90 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1afa0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68  (pPager);.    wh
1afb0 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20  ile( pPg ){.    
1afc0 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50    clearHistory(P
1afd0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1afe0 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  , pPager));.    
1aff0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1b000 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
1b010 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1b020 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
1b030 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
1b040 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
1b050 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
1b060 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
1b070 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66  Dirty;.    }.#if
1b080 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1b090 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1b0a0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
1b0b0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
1b0c0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1b0d0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1b0e0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1b0f0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
1b100 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
1b110 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
1b120 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
1b130 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
1b140 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
1b150 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
1b160 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d  ndif.    pPager-
1b170 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1b180 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1b190 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
1b1a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b1b0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OK;.  }.  if( pP
1b1c0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1b1d0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78  ==0 ){.    /* Ex
1b1e0 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75  it early (withou
1b1f0 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65  t doing the time
1b200 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74  -consuming sqlit
1b210 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73  e3OsSync() calls
1b220 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72  ).    ** if ther
1b230 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63  e have been no c
1b240 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1b250 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
1b260 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b270 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  er->needSync==0 
1b280 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1b290 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
1b2a0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1b2b0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
1b2c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b2d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
1b2e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1b2f0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1b300 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61  e3pager_sync(pPa
1b310 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  ger, 0, 0);.  if
1b320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b330 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  ){.    goto comm
1b340 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  it_abort;.  }.  
1b350 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
1b360 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1b370 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1b380 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
1b390 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  rc;..  /* Jump h
1b3a0 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ere if anything 
1b3b0 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e  goes wrong durin
1b3c0 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
1b3d0 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69  cess..  */.commi
1b3e0 74 5f 61 62 6f 72 74 3a 0a 20 20 73 71 6c 69 74  t_abort:.  sqlit
1b3f0 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
1b400 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1b410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b420 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
1b430 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
1b440 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
1b450 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
1b460 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
1b470 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
1b480 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
1b490 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
1b4a0 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
1b4b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
1b4c0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
1b4d0 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
1b4e0 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
1b4f0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1b500 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
1b510 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
1b520 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28  cking protocol (
1b530 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29  SQLITE_PROTOCOL)
1b540 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
1b550 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
1b560 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
1b570 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
1b580 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
1b590 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
1b5a0 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
1b5b0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
1b5c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
1b5d0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1b5e0 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
1b5f0 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
1b600 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
1b610 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
1b620 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1b630 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
1b640 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
1b650 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1b660 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  ){.  int rc;.  T
1b670 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
1b680 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1b690 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1b6a0 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64  EMDB ){.    PgHd
1b6b0 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
1b6c0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
1b6d0 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
1b6e0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
1b6f0 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61   *pHist;.      a
1b700 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79  ssert( !p->alway
1b710 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
1b720 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79     if( !p->dirty
1b730 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1b740 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
1b750 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
1b760 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f  (p, pPager))->pO
1b770 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rig );.        a
1b780 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
1b790 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
1b7a0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
1b7b0 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  >pStmt );.      
1b7c0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1b7d0 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74    }..      pHist
1b7e0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1b7f0 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  (p, pPager);.   
1b800 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
1b810 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  rig ){.        m
1b820 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
1b830 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70  ATA(p), pHist->p
1b840 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  Orig, pPager->pa
1b850 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1b860 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43   TRACE3("ROLLBAC
1b870 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
1b880 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
1b890 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1b8a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b8b0 20 20 20 20 54 52 41 43 45 33 28 22 50 41 47 45      TRACE3("PAGE
1b8c0 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
1b8d0 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
1b8e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1b8f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b900 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
1b910 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
1b920 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
1b930 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1b940 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74  .      p->inStmt
1b950 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
1b960 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e  PrevStmt = p->pN
1b970 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20  extStmt = 0;..  
1b980 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1b990 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
1b9a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1b9b0 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f  initer(PGHDR_TO_
1b9c0 44 41 54 41 28 70 29 2c 20 70 50 61 67 65 72 2d  DATA(p), pPager-
1b9d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1b9e0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 7d    }.      .    }
1b9f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
1ba00 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
1ba10 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1ba20 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1ba30 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
1ba40 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
1ba50 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1ba60 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
1ba70 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1ba80 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
1ba90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1baa0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1bab0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
1bac0 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
1bad0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
1bae0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
1baf0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1bb00 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1bb10 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
1bb20 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
1bb30 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
1bb40 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  !=0 && pPager->e
1bb50 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52  rrMask!=PAGER_ER
1bb60 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  R_FULL ){.    if
1bb70 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1bb80 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
1bb90 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
1bba0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
1bbb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1bbc0 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
1bbd0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1bbe0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1bbf0 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
1bc00 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
1bc10 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1bc20 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
1bc30 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d  ager);.    rc2 =
1bc40 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
1bc50 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1bc60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bc70 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1bc80 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  rc2;.    }.  }el
1bc90 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1bca0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
1bcb0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
1bcc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bcd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bce0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1bcf0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
1bd00 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
1bd10 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50  ORRUPT;.  }.  pP
1bd20 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
1bd30 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
1bd40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1bd50 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
1bd60 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
1bd70 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
1bd80 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
1bd90 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1bda0 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
1bdb0 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ritable..*/.int 
1bdc0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72  sqlite3pager_isr
1bdd0 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
1bde0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1bdf0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
1be00 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  y;.}../*.** This
1be10 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1be20 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
1be30 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
1be40 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70  */.int *sqlite3p
1be50 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65 72  ager_stats(Pager
1be60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
1be70 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20  tic int a[11];. 
1be80 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
1be90 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
1bea0 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
1beb0 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
1bec0 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
1bed0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1bee0 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
1bef0 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
1bf00 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
1bf10 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1bf20 54 45 53 54 0a 20 20 61 5b 36 5d 20 3d 20 70 50  TEST.  a[6] = pP
1bf30 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
1bf40 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
1bf50 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61  ss;.  a[8] = pPa
1bf60 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b  ger->nOvfl;.  a[
1bf70 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
1bf80 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
1bf90 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 23 65  ager->nWrite;.#e
1bfa0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 61 3b  ndif.  return a;
1bfb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1bfc0 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
1bfd0 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  back point..**.*
1bfe0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1bff0 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
1c000 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
1c010 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
1c020 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
1c030 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a   new statement j
1c040 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65  ournal is create
1c050 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  d that can be us
1c060 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ed to rollback.*
1c070 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73  * changes of a s
1c080 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  ingle SQL comman
1c090 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65  d within a large
1c0a0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  r transaction..*
1c0b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1c0c0 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61  er_stmt_begin(Pa
1c0d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1c0e0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
1c0f0 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
1c100 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73  NAME_SIZE];.  as
1c110 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
1c120 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73  tmtInUse );.  as
1c130 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1c140 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41  Size>=0 );.  TRA
1c150 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
1c160 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1c170 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1c180 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
1c190 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1c1a0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
1c1b0 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
1c1c0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65  ->dbSize;.    re
1c1d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c1e0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
1c1f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1c200 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
1c210 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
1c220 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c230 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
1c240 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1c250 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61  nalOpen );.  pPa
1c260 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73  ger->aInStmt = s
1c270 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1c280 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1c290 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
1c2a0 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->aInStmt==0 ){
1c2b0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
1c2c0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1c2d0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
1c2e0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1c2f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
1c300 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1c310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1c320 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1c330 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
1c340 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
1c350 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
1c360 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
1c370 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1c380 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67  tmtJSize == pPag
1c390 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1c3a0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
1c3b0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
1c3c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c3d0 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  f;.  pPager->stm
1c3e0 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
1c3f0 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  dbSize;.  pPager
1c400 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30  ->stmtHdrOff = 0
1c410 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
1c420 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  Cksum = pPager->
1c430 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28  cksumInit;.  if(
1c440 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70   !pPager->stmtOp
1c450 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
1c460 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
1c470 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61  temp(zTemp, &pPa
1c480 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
1c490 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
1c4a0 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
1c4b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1c4c0 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70  tOpen = 1;.    p
1c4d0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
1c4e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
1c4f0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
1c500 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c510 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67  E_OK;. .stmt_beg
1c520 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  in_failed:.  if(
1c530 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1c540 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1c550 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  ee(pPager->aInSt
1c560 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  mt);.    pPager-
1c570 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
1c580 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c590 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
1c5a0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
1c5b0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1c5c0 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65  stmt_commit(Page
1c5d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
1c5e0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1c5f0 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  Use ){.    PgHdr
1c600 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
1c610 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
1c620 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
1c630 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1c640 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
1c650 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
1c660 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74  sSeek(pPager->st
1c670 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a  fd, 0);.      /*
1c680 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
1c690 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
1c6a0 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
1c6b0 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
1c6c0 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
1c6d0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1c6e0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
1c6f0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
1c700 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
1c710 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
1c720 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
1c730 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73  xtStmt;.      as
1c740 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d  sert( pPg->inStm
1c750 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  t );.      pPg->
1c760 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
1c770 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
1c780 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1c790 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
1c7a0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1c7b0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1c7c0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1c7d0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1c7e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
1c7f0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
1c800 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1c810 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1c820 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1c830 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
1c840 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1c850 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
1c860 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1c870 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
1c880 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1c890 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
1c8a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1c8b0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
1c8c0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1c8d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1c8e0 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  mt_rollback(Page
1c8f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1c900 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
1c910 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1c920 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d  .    TRACE2("STM
1c930 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
1c940 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c950 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
1c960 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  B ){.      PgHdr
1c970 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
1c980 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
1c990 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
1c9a0 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
1c9b0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1c9c0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1c9d0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1c9e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
1c9f0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
1ca00 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1ca10 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
1ca20 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
1ca30 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
1ca40 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
1ca50 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
1ca60 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
1ca70 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1ca80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
1ca90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1caa0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1cab0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1cac0 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
1cad0 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
1cae0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1caf0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1cb00 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1cb10 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
1cb20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1cb30 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
1cb40 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
1cb50 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1cb60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1cb70 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1cb80 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
1cb90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1cba0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1cbb0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
1cbc0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1cbd0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1cbe0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1cbf0 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
1cc00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1cc10 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
1cc20 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
1cc30 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
1cc40 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
1cc50 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
1cc60 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1cc70 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28  e3pager_dirname(
1cc80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1cc90 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1cca0 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
1ccb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ccc0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
1ccd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1cce0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1ccf0 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1cd00 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  journalname(Page
1cd10 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1cd20 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
1cd30 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
1cd40 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
1cd50 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
1cd60 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
1cd70 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
1cd80 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
1cd90 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
1cda0 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
1cdb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1cdc0 72 5f 6e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  r_nosync(Pager *
1cdd0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1cde0 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
1cdf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1ce00 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
1ce10 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
1ce20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
1ce30 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  _codec(.  Pager 
1ce40 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
1ce50 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
1ce60 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
1ce70 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
1ce80 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
1ce90 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
1cea0 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
1ceb0 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
1cec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ced0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1cee0 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
1cef0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cf00 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
1cf10 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
1cf20 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
1cf30 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
1cf40 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
1cf50 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1cf60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1cf70 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
1cf80 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
1cf90 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1cfa0 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nter;.  int rc;.
1cfb0 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20  .  /* Open page 
1cfc0 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1cfd0 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1cfe0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1cff0 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c  r_get(pPager, 1,
1d000 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
1d010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1d020 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
1d030 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1d040 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69  rite(pPage);.  i
1d050 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d060 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
1d070 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72   /* Read the cur
1d080 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79  rent value at by
1d090 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48  te 24. */.  pPgH
1d0a0 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  dr = DATA_TO_PGH
1d0b0 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61  DR(pPage);.  cha
1d0c0 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65  nge_counter = re
1d0d0 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
1d0e0 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20  Hdr, 24);..  /* 
1d0f0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1d100 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1d110 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1d120 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1d130 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
1d140 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73  +;.  store32bits
1d150 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c  (change_counter,
1d160 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20   pPgHdr, 24);.. 
1d170 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1d180 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1d190 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  */.  sqlite3page
1d1a0 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1d1b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d1c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
1d1d0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1d1e0 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1d1f0 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1d200 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1d210 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1d220 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1d230 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1d240 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1d250 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1d260 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1d270 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1d280 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1d290 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1d2a0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1d2b0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1d2c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1d2d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1d2e0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1d2f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1d300 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1d310 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1d320 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1d330 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1d340 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1d350 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1d360 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1d370 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1d380 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1d390 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1d3a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1d3b0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1d3c0 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1d3d0 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1d3e0 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1d3f0 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1d400 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1d410 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1d420 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1d430 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1d440 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  nc() call..**.**
1d450 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1d460 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1d470 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1d480 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1d490 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1d4a0 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1d4b0 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1d4c0 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1d4d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1d4e0 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  er_sync(Pager *p
1d4f0 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
1d500 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f  r *zMaster, Pgno
1d510 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20   nTrunc){.  int 
1d520 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d530 0a 20 20 54 52 41 43 45 34 28 22 44 41 54 41 42  .  TRACE4("DATAB
1d540 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
1d550 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
1d560 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
1d570 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
1d580 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
1d590 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  runc);..  /* If 
1d5a0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1d5b0 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
1d5c0 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
1d5d0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
1d5e0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1d5f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1d600 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
1d610 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
1d620 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1d630 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
1d640 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
1d650 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1d660 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1d670 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
1d680 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1d690 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  en );..    /* If
1d6a0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1d6b0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
1d6c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1d6d0 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
1d6e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
1d6f0 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
1d700 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
1d710 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
1d720 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
1d730 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
1d740 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
1d750 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
1d760 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
1d770 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1d780 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
1d790 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
1d7a0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
1d7b0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1d7c0 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
1d7d0 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
1d7e0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
1d7f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1d800 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1d810 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
1d820 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1d830 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
1d840 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1d850 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1d860 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
1d870 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d880 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1d890 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1d8a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
1d8b0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1d8c0 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
1d8d0 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
1d8e0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
1d8f0 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
1d900 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
1d910 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
1d920 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1d930 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1d940 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1d950 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1d960 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76  gno i;.        v
1d970 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
1d980 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20      int iSkip = 
1d990 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1d9a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ager);.        f
1d9b0 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
1d9c0 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
1d9d0 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
1d9e0 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50          if( !(pP
1d9f0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1da00 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37  [i/8] & (1<<(i&7
1da10 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20  ))) && i!=iSkip 
1da20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1da30 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1da40 5f 67 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  _get(pPager, i, 
1da50 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
1da60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1da70 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1da80 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1da90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1daa0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1dab0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1dac0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1dad0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1dae0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1daf0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1db00 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1db10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1db20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  } .      }.#endi
1db30 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  f.      rc = wri
1db40 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1db50 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1db60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1db70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1db80 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1db90 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
1dba0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1dbb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dbc0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1dbd0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  exit;.    }..#if
1dbe0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dbf0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1dc00 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1dc10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1dc20 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
1dc30 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1dc40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1dc50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1dc60 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1dc70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1dc80 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
1dc90 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
1dca0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1dcb0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1dcc0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1dcd0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1dce0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1dcf0 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
1dd00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1dd10 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1dd20 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
1dd30 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1dd40 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1dd50 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1dd60 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
1dd70 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1dd80 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
1dd90 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
1dda0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1ddb0 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79  _SYNCED;.  }..sy
1ddc0 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  nc_exit:.  retur
1ddd0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1dde0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1ddf0 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f  OVACUUM./*.** Mo
1de00 76 65 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  ve the page iden
1de10 74 69 66 69 65 64 20 62 79 20 70 44 61 74 61 20  tified by pData 
1de20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f  to location pgno
1de30 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a   in the file. .*
1de40 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
1de50 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73  be no references
1de60 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1de70 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75  page pgno. If cu
1de80 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67  rrent page.** pg
1de90 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
1dea0 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
1deb0 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
1dec0 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65   not written the
1ded0 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73  re by.** by this
1dee0 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61   routine. The sa
1def0 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68  me applies to th
1df00 65 20 70 61 67 65 20 70 44 61 74 61 20 72 65 66  e page pData ref
1df10 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20  ers to on entry 
1df20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
1df30 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
1df40 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
1df50 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 70   refered to by p
1df60 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69  Data remain vali
1df70 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
1df80 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
1df90 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
1dfa0 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61  e pData (i.e. da
1dfb0 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
1dfc0 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
1dfd0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
1dfe0 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
1dff0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
1e000 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
1e010 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
1e020 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1e030 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
1e040 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1e050 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
1e060 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
1e070 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
1e080 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1e090 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
1e0a0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
1e0b0 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
1e0c0 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
1e0d0 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
1e0e0 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
1e0f0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
1e100 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
1e110 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e)..*/.int sqlit
1e120 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65  e3pager_movepage
1e130 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1e140 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 50 67 6e  void *pData, Pgn
1e150 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1e160 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
1e170 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
1e180 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a  PgHdr *pPgOld; .
1e190 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20    int h;.  Pgno 
1e1a0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
1e1b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
1e1c0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54  ->nRef>0 );..  T
1e1d0 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
1e1e0 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
1e1f0 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
1e200 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
1e210 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1e220 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
1e230 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20  dSync, pgno);.. 
1e240 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
1e250 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  nc ){.    needSy
1e260 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
1e270 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
1e280 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  pPg->inJournal )
1e290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1e2a0 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  g->dirty );.    
1e2b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e2c0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
1e2d0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  .  /* Unlink pPg
1e2e0 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d   from it's hash-
1e2f0 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e  chain */.  unlin
1e300 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
1e310 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  r, pPg);..  /* I
1e320 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
1e330 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
1e340 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
1e350 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
1e360 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  * from it's hash
1e370 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
1e380 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
1e390 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
1e3a0 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
1e3b0 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
1e3c0 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
1e3d0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
1e3e0 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
1e3f0 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
1e400 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f  ere..  */.  pPgO
1e410 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
1e420 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
1e430 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
1e440 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1e450 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
1e460 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
1e470 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
1e480 6c 64 29 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d  ld);.    pPgOld-
1e490 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1e4a0 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64  if( pPgOld->need
1e4b0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
1e4c0 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e  sert( pPgOld->in
1e4d0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  Journal );.     
1e4e0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1e4f0 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 1;.      pPg->
1e500 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1e510 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e520 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
1e530 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1e540 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
1e550 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61  number for pPg a
1e560 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
1e570 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63  o the new hash-c
1e580 68 61 69 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e  hain. */.  pPg->
1e590 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68  pgno = pgno;.  h
1e5a0 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67   = pager_hash(pg
1e5b0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
1e5c0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  r->aHash[h] ){. 
1e5d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e5e0 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
1e5f0 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
1e600 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1e610 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
1e620 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
1e630 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
1e640 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70  r->aHash[h];.  p
1e650 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
1e660 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50  = pPg;.  pPg->pP
1e670 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20  revHash = 0;..  
1e680 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
1e690 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1e6a0 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28  ache = 1;..  if(
1e6b0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
1e6c0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
1e6d0 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
1e6e0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
1e6f0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
1e700 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
1e710 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
1e720 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
1e730 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
1e740 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
1e750 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
1e760 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
1e770 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
1e780 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
1e790 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50  nd the .    ** P
1e7a0 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ager.aInJournal 
1e7b0 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74  bit has been set
1e7c0 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
1e7d0 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c  be remedied by l
1e7e0 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  oading.    ** th
1e7f0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
1e800 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
1e810 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
1e820 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e  r.needSync flag.
1e830 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1e840 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  he sqlite3pager_
1e850 67 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  get() call may c
1e860 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
1e870 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
1e880 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
1e890 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1e8a0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
1e8b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1e8c0 20 72 63 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70   rc;.    void *p
1e8d0 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20 20 61 73  NeedSync;.    as
1e8e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1e8f0 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
1e900 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1e910 67 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64  get(pPager, need
1e920 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64  SyncPgno, &pNeed
1e930 53 79 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 72  Sync);.    if( r
1e940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1e950 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
1e960 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
1e970 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1e980 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1e990 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1e9a0 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44      DATA_TO_PGHD
1e9b0 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e  R(pNeedSync)->in
1e9c0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1e9d0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1e9e0 4e 65 65 64 53 79 6e 63 29 2d 3e 64 69 72 74 79  NeedSync)->dirty
1e9f0 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
1ea00 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4e 65  3pager_unref(pNe
1ea10 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20  edSync);.  }..  
1ea20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ea30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1ea40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1ea50 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1ea60 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
1ea70 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1ea80 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1ea90 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f  the file lock fo
1eaa0 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
1eab0 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  r..** The return
1eac0 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66   value is one of
1ead0 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44   NO_LOCK, SHARED
1eae0 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
1eaf0 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47  LOCK,.** PENDING
1eb00 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53  _LOCK, or EXCLUS
1eb10 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74  IVE_LOCK..*/.int
1eb20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
1eb30 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
1eb40 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1eb50 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74   sqlite3OsLockSt
1eb60 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ate(pPager->fd);
1eb70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
1eb80 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1eb90 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
1eba0 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
1ebb0 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
1ebc0 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
1ebd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ebe0 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50  3pager_refdump(P
1ebf0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ec00 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
1ec10 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1ec20 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
1ec30 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
1ec40 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
1ec50 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1ec60 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1ec70 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
1ec80 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
1ec90 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
1eca0 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
1ecb0 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
1ecc0 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
1ecd0 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
1ece0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
1ecf0 4f 20 2a 2f 0a                                   O */.