/ Hex Artifact Content
Login

Artifact 309d473c01b5e2b355fc3c8adce2a36df16c43a3:


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 32  : pager.c,v 1.22
0350: 30 20 32 30 30 35 2f 31 31 2f 32 36 20 30 33 3a  0 2005/11/26 03:
0360: 35 31 3a 31 39 20 64 72 68 20 45 78 70 20 24 0a  51:19 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 28 70 2d 3e 66 64 2e  GERID(p) (p->fd.
06e0: 68 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48  h).#define FILEH
06f0: 41 4e 44 4c 45 49 44 28 66 64 29 20 28 66 64 2e  ANDLEID(fd) (fd.
0700: 68 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  h)../*.** The pa
0710: 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77 68  ge cache as a wh
0720: 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  ole is always in
0730: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
0740: 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a  owing.** states:
0750: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55  .**.**   PAGER_U
0760: 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68 65  NLOCK        The
0770: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 6e   page cache is n
0780: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  ot currently rea
0790: 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20  ding or .**     
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61    writing the da
07c0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
07d0: 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20  ere is no.**    
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e 20     data held in 
0800: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
0810: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a        state..**.
0840: 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52 45  **   PAGER_SHARE
0850: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0860: 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64 69  e cache is readi
0870: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
0880: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0890: 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69 6e            Writin
08a0: 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74  g is not permitt
08b0: 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20 62  ed.  There can b
08c0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
08d0: 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74 69             multi
08e0: 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63 65  ple readers acce
08f0: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
0900: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
0930: 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e time..**.**   
0940: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20  PAGER_RESERVED  
0950: 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73 73      This process
0960: 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74 68   has reserved th
0970: 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  e database for w
0980: 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  riting.**       
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
09b0: 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65 73  made any changes
09c0: 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63  .  Only one proc
09d0: 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ess.**          
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74 20               at 
09f0: 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65 72  a time can reser
0a00: 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ve the database.
0a10: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a    The original.*
0a20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a30: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
0a40: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
0a50: 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f  en modified so o
0a60: 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ther.**         
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
0a80: 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69 6c  ocesses may stil
0a90: 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65  l be reading the
0aa0: 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20   on-disk.**     
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e    database file.
0ad0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45  .**.**   PAGER_E
0ae0: 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68 65  XCLUSIVE     The
0af0: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 77   page cache is w
0b00: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
0b10: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 63                Ac
0b30: 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69 76  cess is exclusiv
0b40: 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f  e.  No other pro
0b50: 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20  cesses or.**    
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20 62     threads can b
0b80: 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
0b90: 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a  ting while one.*
0ba0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bb0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 20          process 
0bc0: 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  is writing..**.*
0bd0: 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45 44  *   PAGER_SYNCED
0be0: 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65          The page
0bf0: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
0c00: 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45 52  state from PAGER
0c10: 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64 69      after all di
0c40: 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20 62  rty pages have b
0c50: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
0c60: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0c80: 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
0c90: 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
0ca0: 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20  synced to.**    
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61     disk. All tha
0cd0: 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20  t remains to do 
0ce0: 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  is to remove the
0cf0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d00: 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
0d10: 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74  l file and the t
0d20: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
0d30: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d              comm
0d50: 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  itted..**.** The
0d60: 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65   page cache come
0d70: 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e  s up in PAGER_UN
0d80: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0d90: 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74   time a.** sqlit
0da0: 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 6f 63  e3pager_get() oc
0db0: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
0dc0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0dd0: 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20  AGER_SHARED..** 
0de0: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
0df0: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
0e00: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
0e10: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
0e20: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0e30: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50  itions back to P
0e40: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0e50: 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20  e first time.** 
0e60: 74 68 61 74 20 73 71 6c 69 74 65 33 70 61 67 65  that sqlite3page
0e70: 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c  r_write() is cal
0e80: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0e90: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0ea0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0eb0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0ec0: 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29  ite_page_write()
0ed0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0ee0: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0ef0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0f00: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0f10: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0f20: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0f30: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0f40: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0f50: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0f60: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0f70: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0f80: 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20 62  VE occurs when b
0f90: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
0fa0: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
0fb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
0fc0: 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73 71  le.  After an sq
0fd0: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
0fe0: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
0ff0: 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te_pager_commit(
1000: 29 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f 65  ), the state goe
1010: 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
1020: 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66 69  SHARED..*/.#defi
1030: 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  ne PAGER_UNLOCK 
1040: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50       0.#define P
1050: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
1060: 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   1   /* same as 
1070: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SHARED_LOCK */.#
1080: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53  define PAGER_RES
1090: 45 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20  ERVED    2   /* 
10a0: 73 61 6d 65 20 61 73 20 52 45 53 45 52 56 45 44  same as RESERVED
10b0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
10c0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
10d0: 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61     4   /* same a
10e0: 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  s EXCLUSIVE_LOCK
10f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
1100: 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a  R_SYNCED      5.
1110: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51  ./*.** If the SQ
1120: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
1130: 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73  ED_LOCK macro is
1140: 20 73 65 74 20 74 6f 20 74 72 75 65 20 61 74 20   set to true at 
1150: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a  compile-time,.**
1160: 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74 74   then failed att
1170: 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20 72  empts to get a r
1180: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c  eserved lock wil
1190: 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  l invoke the bus
11a0: 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54  y callback..** T
11b0: 68 69 73 20 69 73 20 6f 66 66 20 62 79 20 64 65  his is off by de
11c0: 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20 77  fault.  To see w
11d0: 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  hy, consider the
11e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61   following scena
11f0: 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70  rio:.** .** Supp
1200: 6f 73 65 20 74 68 72 65 61 64 20 41 20 61 6c 72  ose thread A alr
1210: 65 61 64 79 20 68 61 73 20 61 20 73 68 61 72 65  eady has a share
1220: 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73  d lock and wants
1230: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1240: 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61 6c  ..** Thread B al
1250: 72 65 61 64 79 20 68 61 73 20 61 20 72 65 73 65  ready has a rese
1260: 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  rved lock and wa
1270: 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  nts an exclusive
1280: 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f   lock.  If.** bo
1290: 74 68 20 74 68 72 65 61 64 73 20 61 72 65 20 75  th threads are u
12a0: 73 69 6e 67 20 74 68 65 69 72 20 62 75 73 79 20  sing their busy 
12b0: 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69  callbacks, it mi
12c0: 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74 69  ght be a long ti
12d0: 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65  me.** be for one
12e0: 20 6f 66 20 74 68 65 20 74 68 72 65 61 64 73 20   of the threads 
12f0: 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f  give up and allo
1300: 77 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f 20  ws the other to 
1310: 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20  proceed..** But 
1320: 69 66 20 74 68 65 20 74 68 72 65 61 64 20 74 72  if the thread tr
1330: 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65 20  ying to get the 
1340: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67 69  reserved lock gi
1350: 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a  ves up quickly.*
1360: 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72 20 69  * (if it never i
1370: 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79 20  nvokes its busy 
1380: 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20 74  callback) then t
1390: 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69  he contention wi
13a0: 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65  ll be.** resolve
13b0: 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69  d quickly..*/.#i
13c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55 53  fndef SQLITE_BUS
13d0: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  Y_RESERVED_LOCK.
13e0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
13f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1400: 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  CK 0.#endif../*.
1410: 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72 6f  ** This macro ro
1420: 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20 73  unds values up s
1430: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 76 61  o that if the va
1440: 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72 65 73  lue is an addres
1450: 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72 61  s it.** is guara
1460: 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 61  nteed to be an a
1470: 64 64 72 65 73 73 20 74 68 61 74 20 69 73 20 61  ddress that is a
1480: 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62  ligned to an 8-b
1490: 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f  yte boundary..*/
14a0: 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f 41  .#define FORCE_A
14b0: 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28 28  LIGNMENT(X)   ((
14c0: 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a  (X)+7)&~7)../*.*
14d0: 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  * Each in-memory
14e0: 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65   image of a page
14f0: 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65   begins with the
1500: 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65   following heade
1510: 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65  r..** This heade
1520: 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c  r is only visibl
1530: 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20  e to this pager 
1540: 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69  module.  The cli
1550: 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74  ent.** code that
1560: 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65   calls pager see
1570: 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20  s only the data 
1580: 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65  that follows the
1590: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43   header..**.** C
15a0: 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c  lient code shoul
15b0: 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 70 61  d call sqlite3pa
15c0: 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20 61  ger_write() on a
15d0: 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d   page prior to m
15e0: 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64  aking.** any mod
15f0: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
1600: 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66 69  at page.  The fi
1610: 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33  rst time sqlite3
1620: 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a  pager_write().**
1630: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1640: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1650: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
1660: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
1670: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1680: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
1690: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
16a0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
16b0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
16c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
16d0: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
16e0: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
16f0: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1700: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1710: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1720: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1730: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1740: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
1760: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
1770: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
1780: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
1790: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
17a0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
17b0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
17c0: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
17d0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
17e0: 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  n sqlite3pager_w
17f0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
1800: 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72   and.** is clear
1810: 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68  ed again when th
1820: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
1830: 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74  s written back t
1840: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a  o the original.*
1850: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
1860: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1870: 63 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a  ct PgHdr PgHdr;.
1880: 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20  struct PgHdr {. 
1890: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20  /* The pager to 
18c0: 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20  which this page 
18d0: 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e  belongs */.  Pgn
18e0: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1900: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
1910: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
1920: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61    PgHdr *pNextHa
1930: 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20  sh, *pPrevHash; 
1940: 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69   /* Hash collisi
1950: 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48  on chain for PgH
1960: 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48  dr.pgno */.  PgH
1970: 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a  dr *pNextFree, *
1980: 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46  pPrevFree;  /* F
1990: 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73  reelist of pages
19a0: 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a   where nRef==0 *
19b0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
19c0: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
19d0: 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
19e0: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  all pages */.  P
19f0: 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c  gHdr *pNextStmt,
1a00: 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a   *pPrevStmt;  /*
1a10: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
1a20: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
1a30: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
1a40: 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  inJournal;      
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a60: 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e 20  RUE if has been 
1a70: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
1a80: 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d  al */.  u8 inStm
1a90: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1aa0: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
1ab0: 66 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  f in the stateme
1ac0: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  nt subjournal */
1ad0: 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20 20 20  .  u8 dirty;    
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20    /* TRUE if we 
1b00: 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 62 61  need to write ba
1b10: 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ck changes */.  
1b20: 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20  u8 needSync;    
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b40: 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62  * Sync journal b
1b50: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68  efore writing th
1b60: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  is page */.  u8 
1b70: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20  alwaysRollback; 
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1b90: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
1ba0: 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20  back() for this 
1bb0: 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20  page */.  short 
1bc0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
1bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1be0: 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74  er of users of t
1bf0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
1c00: 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20  Hdr *pDirty;    
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c20: 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74  Dirty pages sort
1c30: 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f  ed by PgHdr.pgno
1c40: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1c50: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1c60: 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23 65  u32 pageHash;.#e
1c70: 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65 72  ndif.  /* pPager
1c80: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
1c90: 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f   of page data fo
1ca0: 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72  llow this header
1cb0: 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e   */.  /* Pager.n
1cc0: 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c  Extra bytes of l
1cd0: 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77  ocal data follow
1ce0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   the page data *
1cf0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  /.};../*.** For 
1d00: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c  an in-memory onl
1d10: 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d 65  y database, some
1d20: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
1d30: 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  on is recorded a
1d40: 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61 67  bout.** each pag
1d50: 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67 65  e so that change
1d60: 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  s can be rolled 
1d70: 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20  back.  (Journal 
1d80: 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a  files are not.**
1d90: 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d   used for in-mem
1da0: 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29 20  ory databases.) 
1db0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
1dc0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 64  nformation is ad
1dd0: 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e  ded to.** the en
1de0: 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52 41  d of every EXTRA
1df0: 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65   block for in-me
1e00: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a  mory databases..
1e10: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  **.** This infor
1e20: 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76  mation could hav
1e30: 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69 72  e been added dir
1e40: 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67 48  ectly to the PgH
1e50: 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  dr structure..**
1e60: 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f 75   But then it wou
1e70: 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65 78  ld take up an ex
1e80: 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20 73  tra 8 bytes of s
1e90: 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79 20  torage on every 
1ea0: 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f  PgHdr.** even fo
1eb0: 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61 74  r disk-based dat
1ec0: 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74 69  abases.  Splitti
1ed0: 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73 20  ng it out saves 
1ee0: 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a 2a  8 bytes.  This.*
1ef0: 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76 69  * is only a savi
1f00: 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74 20  ngs of 0.8% but 
1f10: 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67 65  those percentage
1f20: 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70  s add up..*/.typ
1f30: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 69  edef struct PgHi
1f40: 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79 3b  story PgHistory;
1f50: 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72  .struct PgHistor
1f60: 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b  y {.  u8 *pOrig;
1f70: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
1f80: 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65 73   page text.  Res
1f90: 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e 20  tore to this on 
1fa0: 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20  a full rollback 
1fb0: 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b 20  */.  u8 *pStmt; 
1fc0: 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20 69      /* Text as i
1fd0: 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65 67  t was at the beg
1fe0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75  inning of the cu
1ff0: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
2000: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  */.};../*.** A m
2010: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
2020: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
2030: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
2040: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
2050: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
2060: 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e  fine CODEC(P,D,N
2070: 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65  ,X) if( P->xCode
2080: 63 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50  c ){ P->xCodec(P
2090: 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c  ->pCodecArg,D,N,
20a0: 58 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  X); }.#else.# de
20b0: 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e  fine CODEC(P,D,N
20c0: 2c 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,X).#endif../*.*
20d0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e  * Convert a poin
20e0: 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69  ter to a PgHdr i
20f0: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
2100: 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64   its data.** and
2110: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a   back again..*/.
2120: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
2130: 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69 64  _DATA(P)  ((void
2140: 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65  *)(&(P)[1])).#de
2150: 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48  fine DATA_TO_PGH
2160: 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64 72  DR(D)  (&((PgHdr
2170: 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66  *)(D))[-1]).#def
2180: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54  ine PGHDR_TO_EXT
2190: 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29  RA(G,P) ((void*)
21a0: 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31  &((char*)(&(G)[1
21b0: 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a  ]))[(P)->pageSiz
21c0: 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44  e]).#define PGHD
21d0: 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29  R_TO_HIST(P,PGR)
21e0: 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20    \.            
21f0: 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28  ((PgHistory*)&((
2200: 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29  char*)(&(P)[1]))
2210: 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65  [(PGR)->pageSize
2220: 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29  +(PGR)->nExtra])
2230: 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20  ../*.** How big 
2240: 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
2250: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
2260: 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f  locating in-memo
2270: 72 79 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70  ry pages.** by p
2280: 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
2290: 20 6d 61 63 72 6f 20 6c 6f 6f 6b 73 20 61 20 6c   macro looks a l
22a0: 69 74 74 6c 65 20 73 69 6c 6c 79 2c 20 62 75 74  ittle silly, but
22b0: 20 69 73 20 65 76 61 6c 75 61 74 65 64 0a 2a 2a   is evaluated.**
22c0: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
22d0: 2c 20 6e 6f 74 20 72 75 6e 2d 74 69 6d 65 20 28  , not run-time (
22e0: 61 74 20 6c 65 61 73 74 20 66 6f 72 20 67 63 63  at least for gcc
22f0: 20 74 68 69 73 20 69 73 20 74 72 75 65 29 2e 0a   this is true)..
2300: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f  */.#define N_PG_
2310: 48 41 53 48 20 28 5c 0a 20 20 28 4d 41 58 5f 50  HASH (\.  (MAX_P
2320: 41 47 45 53 3e 31 30 32 34 29 3f 32 30 34 38 3a  AGES>1024)?2048:
2330: 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e   \.  (MAX_PAGES>
2340: 35 31 32 29 3f 31 30 32 34 3a 20 5c 0a 20 20 28  512)?1024: \.  (
2350: 4d 41 58 5f 50 41 47 45 53 3e 32 35 36 29 3f 35  MAX_PAGES>256)?5
2360: 31 32 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47  12: \.  (MAX_PAG
2370: 45 53 3e 31 32 38 29 3f 32 35 36 3a 20 5c 0a 20  ES>128)?256: \. 
2380: 20 28 4d 41 58 5f 50 41 47 45 53 3e 36 34 29 3f   (MAX_PAGES>64)?
2390: 31 32 38 3a 36 34 20 5c 0a 29 0a 0a 2f 2a 0a 2a  128:64 \.)../*.*
23a0: 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e 75  * Hash a page nu
23b0: 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mber.*/.#define 
23c0: 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20 20  pager_hash(PN)  
23d0: 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48  ((PN)&(N_PG_HASH
23e0: 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  -1))../*.** A op
23f0: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
2400: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
2410: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2420: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
2430: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 75 38 20  ct Pager {.  u8 
2440: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20  journalOpen;    
2450: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2460: 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
2470: 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20   descriptors is 
2480: 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f  valid */.  u8 jo
2490: 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20  urnalStarted;   
24a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
24b0: 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72  f header of jour
24c0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  nal is synced */
24d0: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
24e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24f0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
2500: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
2510: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
2520: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
2530: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
2540: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
2550: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
2560: 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20   u8 stmtOpen;   
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2580: 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74  True if the stat
2590: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
25a0: 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38   is open */.  u8
25b0: 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20   stmtInUse;     
25c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
25d0: 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74  e we are in a st
25e0: 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
25f0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73  action */.  u8 s
2600: 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20  tmtAutoopen;    
2610: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2620: 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65  stmt journal whe
2630: 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  n main journal i
2640: 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20  s opened*/.  u8 
2650: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
2660: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2670: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
2680: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
2690: 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20   u8 fullSync;   
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b0: 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f  Do extra syncs o
26c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  f the journal fo
26d0: 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a  r robustness */.
26e0: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2700: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
2710: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
2720: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
2730: 65 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  errMask;        
2740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2750: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
2760: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
2770: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
2780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2790: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
27a0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
27b0: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27d0: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
27e0: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
27f0: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73  /* True if an fs
2820: 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20  ync() is needed 
2830: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  on the journal *
2840: 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68  /.  u8 dirtyCach
2850: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2860: 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
2870: 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61  d pages have cha
2880: 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77  nged */.  u8 alw
2890: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
28a0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
28b0: 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
28c0: 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a   for all pages *
28d0: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
2900: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
2910: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
2920: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2930: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
2940: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
2950: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
2960: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2990: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
29a0: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
29b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
29c0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
29d0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
29e0: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ange */.  int st
29f0: 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mtSize;         
2a00: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2a10: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
2a20: 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67  ges) at stmt_beg
2a30: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  in() */.  int nR
2a40: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
2a50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a60: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
2a70: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2a80: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
2a90: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
2aa0: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
2ab0: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
2ac0: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
2ad0: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63  /.  int stmtNRec
2ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2af0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
2b00: 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62  ords in stmt sub
2b10: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2b20: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
2b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2b40: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
2b50: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
2b60: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
2b70: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
2b80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2b90: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
2ba0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  page */.  int nP
2bb0: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2bc0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
2bd0: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
2be0: 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  ry pages */.  in
2bf0: 74 20 6e 4d 61 78 50 61 67 65 3b 20 20 20 20 20  t nMaxPage;     
2c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 67            /* Hig
2c10: 68 20 77 61 74 65 72 20 6d 61 72 6b 20 6f 66 20  h water mark of 
2c20: 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  nPage */.  int n
2c30: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
2c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c50: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
2c60: 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ges with PgHdr.n
2c70: 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d  Ref>0 */.  int m
2c80: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2c90: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
2ca0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
2cb0: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
2cc0: 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a  he */.  u8 *aInJ
2cd0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2ce0: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
2cf0: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
2d00: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d10: 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74  e */.  u8 *aInSt
2d20: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
2d30: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
2d40: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
2d50: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2d60: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2d80: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2d90: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
2da0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
2db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2dc0: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
2dd0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  l file */.  char
2de0: 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20   *zDirectory;   
2df0: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
2e00: 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61  tory hold databa
2e10: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  se and journal f
2e20: 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  iles */.  OsFile
2e30: 20 66 64 2c 20 6a 66 64 3b 20 20 20 20 20 20 20   fd, jfd;       
2e40: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
2e50: 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61  scriptors for da
2e60: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
2e70: 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 73  al */.  OsFile s
2e80: 74 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  tfd;            
2e90: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2ea0: 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73  riptor for the s
2eb0: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
2ec0: 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64  nal*/.  BusyHand
2ed0: 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
2ee0: 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  r;  /* Pointer t
2ef0: 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e  o sqlite.busyHan
2f00: 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20  dler */.  PgHdr 
2f10: 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b  *pFirst, *pLast;
2f20: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2f30: 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20   free pages */. 
2f40: 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53 79   PgHdr *pFirstSy
2f50: 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  nced;        /* 
2f60: 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  First free page 
2f70: 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53  with PgHdr.needS
2f80: 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64  ync==0 */.  PgHd
2f90: 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20  r *pAll;        
2fa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
2fb0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2fc0: 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20    PgHdr *pStmt; 
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fe0: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
2ff0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
3000: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
3010: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3030: 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73  urrent byte offs
3040: 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  et in the journa
3050: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
3060: 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20  journalHdr;     
3070: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
3080: 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f  offset to previo
3090: 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  us journal heade
30a0: 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48  r */.  i64 stmtH
30b0: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
30c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72     /* First jour
30d0: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
30e0: 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
30f0: 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43  t */.  i64 stmtC
3100: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
3110: 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20     /* cksumInit 
3120: 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77  when statement w
3130: 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  as started */.  
3140: 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20  i64 stmtJSize;  
3150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3160: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ize of journal a
3170: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
3180: 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69  /.  int sectorSi
3190: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
31a0: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
31b0: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
31c0: 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66  llback */.#ifdef
31d0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
31e0: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20  nt nHit, nMiss, 
31f0: 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61  nOvfl;     /* Ca
3200: 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e  che hits, missin
3210: 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66  g, and LRU overf
3220: 6c 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  lows */.  int nR
3230: 65 61 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20  ead,nWrite;     
3240: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3250: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
3260: 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  tten */.#endif. 
3270: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
3280: 74 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b  tor)(void*,int);
3290: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
32a0: 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69  utine when freei
32b0: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
32c0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
32d0: 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a  void*,int);   /*
32e0: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
32f0: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
3300: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
3310: 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64  d (*xCodec)(void
3320: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
3330: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
3340: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
3350: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
3360: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
3370: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
3380: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
3390: 29 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48  ) */.  PgHdr *aH
33a0: 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20  ash[N_PG_HASH]; 
33b0: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
33c0: 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d   to map page num
33d0: 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a  ber to PgHdr */.
33e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  };../*.** If SQL
33f0: 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69  ITE_TEST is defi
3400: 6e 65 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ned then increme
3410: 6e 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  nt the variable 
3420: 67 69 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20  given in.** the 
3430: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64  argument.*/.#ifd
3440: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23  ef SQLITE_TEST.#
3450: 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43   define TEST_INC
3460: 52 28 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a  R(x)  x++.#else.
3470: 23 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e  # define TEST_IN
3480: 43 52 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CR(x).#endif../*
3490: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69  .** These are bi
34a0: 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ts that can be s
34b0: 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d  et in Pager.errM
34c0: 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask..*/.#define 
34d0: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20  PAGER_ERR_FULL  
34e0: 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72     0x01  /* a wr
34f0: 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  ite() failed */.
3500: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3510: 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20  R_MEM      0x02 
3520: 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   /* malloc() fai
3530: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
3540: 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20  AGER_ERR_LOCK   
3550: 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72    0x04  /* error
3560: 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
3570: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66  protocol */.#def
3580: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  ine PAGER_ERR_CO
3590: 52 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20  RRUPT  0x08  /* 
35a0: 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72  database or jour
35b0: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  nal corruption *
35c0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
35d0: 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31  ERR_DISK     0x1
35e0: 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69  0  /* general di
35f0: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62  sk I/O error - b
3600: 61 64 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a  ad hard drive? *
3610: 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  /../*.** Journal
3620: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
3630: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
3640: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
3650: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
3660: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
3670: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
3680: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
3690: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
36a0: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
36b0: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
36c0: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
36d0: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
36e0: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
36f0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
3700: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
3710: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
3720: 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a  urnal is begin.*
3730: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
3740: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
3750: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
3760: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
3770: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
3780: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
3790: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
37a0: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
37b0: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
37c0: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
37d0: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
37e0: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
37f0: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
3800: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
3810: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
3820: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
3830: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
3840: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
3850: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
3860: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
3870: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
3880: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
3890: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
38a0: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
38b0: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
38c0: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
38d0: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
38e0: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
38f0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
3900: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
3910: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
3920: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
3930: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
3940: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
3950: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
3960: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
3970: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
3980: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
3990: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
39a0: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
39b0: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
39c0: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
39d0: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
39e0: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
39f0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
3a00: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
3a10: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
3a20: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
3a30: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
3a40: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
3a50: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
3a60: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
3a70: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
3a80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
3a90: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
3aa0: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
3ab0: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
3ac0: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
3ad0: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
3ae0: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
3af0: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
3b00: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
3b10: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
3b20: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
3b30: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
3b40: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
3b50: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
3b60: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
3b70: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
3b80: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
3b90: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
3ba0: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66  he header and of
3bb0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
3bc0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74  e journal is det
3bd0: 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68  ermined.** by th
3be0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
3bf0: 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  os..*/.#define J
3c00: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
3c10: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
3c20: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
3c30: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
3c40: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
3c50: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e  r this pager. In
3c60: 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69   the future, thi
3c70: 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65  s could be.** se
3c80: 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20  t to some value 
3c90: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69  read from the di
3ca0: 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54  sk controller. T
3cb0: 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20  he important.** 
3cc0: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69  characteristic i
3cd0: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
3ce0: 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20   same size as a 
3cf0: 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a  disk sector..*/.
3d00: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3d10: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28  HDR_SZ(pPager) (
3d20: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
3d30: 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ze)../*.** The m
3d40: 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72  acro MEMDB is tr
3d50: 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ue if we are dea
3d60: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d  ling with an in-
3d70: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
3d80: 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61  .** We do this a
3d90: 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61  s a macro so tha
3da0: 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  t if the SQLITE_
3db0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61  OMIT_MEMORYDB ma
3dc0: 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74  cro is set,.** t
3dd0: 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44  he value of MEMD
3de0: 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73  B will be a cons
3df0: 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d  tant and the com
3e00: 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d  piler will optim
3e10: 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20  ize.** out code 
3e20: 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72  that would never
3e30: 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66   execute..*/.#if
3e40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3e50: 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e  MEMORYDB.# defin
3e60: 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a  e MEMDB 0.#else.
3e70: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70  # define MEMDB p
3e80: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e  Pager->memDb.#en
3e90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  dif../*.** The d
3ea0: 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20 61  efault size of a
3eb0: 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a 2f 0a   disk sector.*/.
3ec0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 45  #define PAGER_SE
3ed0: 43 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a 0a 2f  CTOR_SIZE 512../
3ee0: 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72  *.** Page number
3ef0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69   PAGER_MJ_PGNO i
3f00: 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20  s never used in 
3f10: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
3f20: 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73  se (it is.** res
3f30: 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e  erved for workin
3f40: 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f  g around a windo
3f50: 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61  ws/posix incompa
3f60: 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73  tibility). It is
3f70: 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20  .** used in the 
3f80: 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69  journal to signi
3f90: 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d 61  fy that the rema
3fa0: 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  inder of the jou
3fb0: 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73  rnal file .** is
3fc0: 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72   devoted to stor
3fd0: 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
3fe0: 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72  rnal name - ther
3ff0: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61  e are no more pa
4000: 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62  ges to.** roll b
4010: 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ack. See comment
4020: 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77  s for function w
4030: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
4040: 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  l() for details.
4050: 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50  .*/./* #define P
4060: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
4070: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
4080: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a  x)->pageSize)) *
4090: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
40a0: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45 4e  MJ_PGNO(x) ((PEN
40b0: 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e  DING_BYTE/((x)->
40c0: 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f  pageSize))+1)../
40d0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
40e0: 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
40f0: 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29  er is (2^31 - 1)
4100: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
4110: 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37  ER_MAX_PGNO 2147
4120: 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e  483647../*.** En
4130: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63  able reference c
4140: 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28 66  ount tracking (f
4150: 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68 65  or debugging) he
4160: 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  re:.*/.#ifdef SQ
4170: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74  LITE_DEBUG.  int
4180: 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f   pager3_refinfo_
4190: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
41a0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
41b0: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
41c0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
41d0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
41e0: 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e  f( !pager3_refin
41f0: 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75  fo_enable ) retu
4200: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  rn;.    sqlite3D
4210: 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
4220: 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20     "REFCNT: %4d 
4230: 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
4240: 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67  n",.       p->pg
4250: 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
4260: 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20  A(p), p->nRef.  
4270: 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20    );.    cnt++; 
4280: 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74    /* Something t
4290: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
42a0: 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64  nt on */.  }.# d
42b0: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
42c0: 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28    pager_refinfo(
42d0: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
42e0: 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e  e REFINFO(X).#en
42f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
4300: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4310: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4320: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4330: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4340: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4350: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4360: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4370: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4380: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4390: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
43a0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
43b0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
43c0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
43d0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
43e0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
43f0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 4f  int read32bits(O
4400: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a  sFile *fd, u32 *
4410: 70 52 65 73 29 7b 0a 20 20 75 33 32 20 72 65 73  pRes){.  u32 res
4420: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  ;.  int rc;.  rc
4430: 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 52 65   = sqlite3Io.xRe
4440: 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69 7a  ad(fd, &res, siz
4450: 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66 28  eof(res));.  if(
4460: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4470: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  {.    unsigned c
4480: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d  har ac[4];.    m
4490: 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c 20  emcpy(ac, &res, 
44a0: 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28 61  4);.    res = (a
44b0: 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b  c[0]<<24) | (ac[
44c0: 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d  1]<<16) | (ac[2]
44d0: 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20  <<8) | ac[3];.  
44e0: 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73 3b  }.  *pRes = res;
44f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4500: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
4510: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
4520: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
4530: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
4540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
4550: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
4560: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
4570: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
4580: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
4590: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
45a0: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
45b0: 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e  2 val){.  unsign
45c0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
45d0: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
45e0: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  4) & 0xff;.  ac[
45f0: 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26  1] = (val>>16) &
4600: 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d   0xff;.  ac[2] =
4610: 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66   (val>>8) & 0xff
4620: 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20  ;.  ac[3] = val 
4630: 26 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e  & 0xff;.  return
4640: 20 73 71 6c 69 74 65 33 49 6f 2e 78 57 72 69 74   sqlite3Io.xWrit
4650: 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a  e(fd, ac, 4);.}.
4660: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
4670: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4680: 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20 70  'val' into the p
4690: 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
46a0: 79 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a 2a  y page header.**
46b0: 20 27 70 27 20 61 74 20 6f 66 66 73 65 74 20 27   'p' at offset '
46c0: 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61 74  offset'..*/.stat
46d0: 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62  ic void store32b
46e0: 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48  its(u32 val, PgH
46f0: 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65  dr *p, int offse
4700: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
4710: 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20  har *ac;.  ac = 
4720: 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  &((unsigned char
4730: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
4740: 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61  p))[offset];.  a
4750: 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29  c[0] = (val>>24)
4760: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d   & 0xff;.  ac[1]
4770: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
4780: 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28  xff;.  ac[2] = (
4790: 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a  val>>8) & 0xff;.
47a0: 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20    ac[3] = val & 
47b0: 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  0xff;.}../*.** R
47c0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
47d0: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 27  eger at offset '
47e0: 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65  offset' from the
47f0: 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64   page identified
4800: 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64   by.** page head
4810: 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69  er 'p'..*/.stati
4820: 63 20 75 33 32 20 72 65 74 72 69 65 76 65 33 32  c u32 retrieve32
4830: 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69  bits(PgHdr *p, i
4840: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e  nt offset){.  un
4850: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b  signed char *ac;
4860: 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67  .  ac = &((unsig
4870: 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f  ned char*)PGHDR_
4880: 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73  TO_DATA(p))[offs
4890: 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61  et];.  return (a
48a0: 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b  c[0]<<24) | (ac[
48b0: 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d  1]<<16) | (ac[2]
48c0: 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a  <<8) | ac[3];.}.
48d0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
48e0: 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
48f0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4900: 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61  into an appropra
4910: 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64  te.** return cod
4920: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4930: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50   pager_errcode(P
4940: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
4950: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4960: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
4970: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
4980: 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20  ER_ERR_LOCK )   
4990: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f   rc = SQLITE_PRO
49a0: 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61  TOCOL;.  if( pPa
49b0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
49c0: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20  AGER_ERR_DISK ) 
49d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
49e0: 4f 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67  OERR;.  if( pPag
49f0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4a00: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20  GER_ERR_FULL )  
4a10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
4a20: 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  LL;.  if( pPager
4a30: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4a40: 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20  R_ERR_MEM )     
4a50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
4a60: 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  M;.  if( pPager-
4a70: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
4a80: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72  _ERR_CORRUPT ) r
4a90: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
4aa0: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  PT;.  return rc;
4ab0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4ac0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
4ad0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
4ae0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
4af0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
4b00: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
4b10: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
4b20: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
4b30: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
4b40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
4b50: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
4b60: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
4b70: 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  r *)PGHDR_TO_DAT
4b80: 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28  A(pPage);.  for(
4b90: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50  i=0; i<pPage->pP
4ba0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
4bb0: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
4bc0: 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b   (hash+i)^pData[
4bd0: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
4be0: 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   hash;.}../*.** 
4bf0: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
4c00: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
4c10: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
4c20: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
4c30: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
4c40: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
4c50: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
4c60: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
4c70: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
4c80: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
4c90: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
4ca0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
4cb0: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
4cc0: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
4cd0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4ce0: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
4cf0: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
4d00: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
4d10: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
4d20: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
4d30: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
4d40: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
4d50: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
4d60: 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67   || MEMDB || pPg
4d70: 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20  ->dirty || .    
4d80: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d    pPg->pageHash=
4d90: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
4da0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
4db0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
4dc0: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  AGE(x).#endif../
4dd0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
4de0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
4df0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
4e00: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
4e10: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
4e20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
4e30: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
4e40: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
4e50: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
4e60: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
4e70: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4e80: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
4e90: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
4ea0: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
4eb0: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
4ec0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
4ed0: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
4ee0: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
4ef0: 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72  Free() *pzMaster
4f00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
4f10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
4f20: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
4f30: 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73  t *pzMaster is s
4f40: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
4f50: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
4f60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
4f70: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
4f80: 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c  al(OsFile *pJrnl
4f90: 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65  , char **pzMaste
4fa0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
4fb0: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
4fc0: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
4fd0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
4fe0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
4ff0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
5000: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
5010: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
5020: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  *pzMaster = 0;..
5030: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f    rc = sqlite3Io
5040: 2e 78 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  .xFileSize(pJrnl
5050: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
5060: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
5070: 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20  szJ<16 ) return 
5080: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
5090: 74 65 33 49 6f 2e 78 53 65 65 6b 28 70 4a 72 6e  te3Io.xSeek(pJrn
50a0: 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66  l, szJ-16);.  if
50b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
50c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20  ) return rc;. . 
50d0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
50e0: 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20  (pJrnl, &len);. 
50f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5100: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5110: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
5120: 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d  ts(pJrnl, &cksum
5130: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5140: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5150: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
5160: 74 65 33 49 6f 2e 78 52 65 61 64 28 70 4a 72 6e  te3Io.xRead(pJrn
5170: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20  l, aMagic, 8);. 
5180: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5190: 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61  OK || memcmp(aMa
51a0: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
51b0: 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20  ic, 8) ) return 
51c0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
51d0: 74 65 33 49 6f 2e 78 53 65 65 6b 28 70 4a 72 6e  te3Io.xSeek(pJrn
51e0: 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  l, szJ-16-len);.
51f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5200: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5210: 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20  ..  *pzMaster = 
5220: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
5230: 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69  lloc(len+1);.  i
5240: 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b  f( !*pzMaster ){
5250: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5260: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
5270: 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78  rc = sqlite3Io.x
5280: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d  Read(pJrnl, *pzM
5290: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
52a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
52b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
52c0: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
52d0: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
52e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
52f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
5300: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
5310: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
5320: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
5330: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
5340: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
5350: 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65  sum -= (*pzMaste
5360: 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  r)[i];.  }.  if(
5370: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5380: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5390: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
53a0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
53b0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
53c0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
53d0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
53e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
53f0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5400: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
5410: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
5420: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
5430: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
5440: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
5450: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
5460: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
5470: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5480: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
5490: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
54a0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c  aster = 0;.  }el
54b0: 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74  se{.    (*pzMast
54c0: 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  er)[len] = '\0';
54d0: 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72  .  }.   .  retur
54e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
54f0: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a  /*.** Seek the j
5500: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
5510: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  riptor to the ne
5520: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
5530: 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f  ry where a.** jo
5540: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79  urnal header may
5550: 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
5560: 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ten. Pager.journ
5570: 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64  alOff is updated
5580: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77   with.** the new
5590: 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a   seek offset..**
55a0: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
55b0: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
55c0: 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66  :.**.** Input Of
55d0: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
55e0: 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a    Output Offset.
55f0: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20  ----------.** 0 
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5630: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32          0.** 512
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30         512.** 10
5660: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5670: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32          512.** 2
5680: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
5690: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
56a0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
56b0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
56c0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
56d0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
56e0: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
56f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5700: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
5710: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
5720: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5730: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
5740: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5750: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
5760: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
5770: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
5780: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5790: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
57a0: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
57b0: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
57c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
57d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
57e0: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74   = offset;.  ret
57f0: 75 72 6e 20 73 71 6c 69 74 65 33 49 6f 2e 78 53  urn sqlite3Io.xS
5800: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
5810: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
5820: 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lOff);.}../*.** 
5830: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
5840: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
5850: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
5860: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
5870: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
5880: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
5890: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
58a0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
58b0: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
58c0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
58d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
58e0: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
58f0: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
5900: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
5910: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
5920: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
5930: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
5940: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
5950: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
5960: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
5970: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
5980: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
5990: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
59a0: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
59b0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
59c0: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
59d0: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
59e0: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
59f0: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
5a00: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
5a10: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
5a20: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
5a30: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
5a40: 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73  R_SZ - 24) bytes
5a50: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
5a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5a70: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
5a80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
5a90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 65 65 6b  .  int rc = seek
5aa0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
5ab0: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
5ac0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61  eturn rc;..  pPa
5ad0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
5ae0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
5af0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 70 50 61 67  lOff;.  if( pPag
5b00: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d  er->stmtHdrOff==
5b10: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
5b20: 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50  >stmtHdrOff = pP
5b30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
5b40: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
5b50: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
5b60: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5b70: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20  ger);..  /* FIX 
5b80: 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50  ME: .  **.  ** P
5b90: 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61  ossibly for a pa
5ba0: 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79  ger not in no-sy
5bb0: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
5bc0: 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c  rnal magic shoul
5bd0: 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72  d not.  ** be wr
5be0: 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63  itten until nRec
5bf0: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73   is filled in as
5c00: 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79   part of next sy
5c10: 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20  ncJournal(). .  
5c20: 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
5c30: 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65   maybe the whole
5c40: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5c50: 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65  should be delaye
5c60: 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a  d until that.  *
5c70: 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61  * point. Think a
5c80: 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  bout this..  */.
5c90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f    rc = sqlite3Io
5ca0: 2e 78 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  .xWrite(&pPager-
5cb0: 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
5cc0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
5cd0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20  rnalMagic));..  
5ce0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5cf0: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  K ){.    /* The 
5d00: 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46  nRec Field. 0xFF
5d10: 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79  FFFFFF for no-sy
5d20: 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a  nc journals. */.
5d30: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
5d40: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5d50: 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  d, pPager->noSyn
5d60: 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  c ? 0xffffffff :
5d70: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
5d80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5d90: 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f      /* The rando
5da0: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
5db0: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20  tialiser */ .   
5dc0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
5dd0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
5de0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
5df0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
5e00: 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  );.    rc = writ
5e10: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
5e20: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b  >jfd, pPager->ck
5e30: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20  sumInit);.  }.  
5e40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5e50: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  K ){.    /* The 
5e60: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
5e70: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20   size */.    rc 
5e80: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
5e90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5ea0: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
5eb0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5ec0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
5ed0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
5ee0: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
5ef0: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 72  process */.    r
5f00: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
5f10: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
5f20: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
5f30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
5f40: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5f50: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
5f60: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53   successfully. S
5f70: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  eek the journal.
5f80: 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
5f90: 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  ptor to the end 
5fa0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
5fb0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
5fc0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
5fd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
5fe0: 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 53 65   = sqlite3Io.xSe
5ff0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
6000: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6010: 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  Off-1);.    if( 
6020: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6030: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6040: 74 65 33 49 6f 2e 78 57 72 69 74 65 28 26 70 50  te3Io.xWrite(&pP
6050: 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30  ager->jfd, "\000
6060: 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", 1);.    }.  }
6070: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6080: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
6090: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
60a0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
60b0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
60c0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
60d0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
60e0: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
60f0: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
6100: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
6110: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
6120: 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  le. See comments
6130: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
6140: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
6150: 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  ) for a descript
6160: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f  ion of.** the jo
6170: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
6180: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
6190: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
61a0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
61b0: 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  nRec is set to t
61c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
61d0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
61e0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
61f0: 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69  er and *dbSize i
6200: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
6210: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
6220: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
6230: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
6240: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
6250: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
6260: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
6270: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
6280: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
6290: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
62a0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
62b0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
62c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
62d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
62e0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
62f0: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
6300: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
6310: 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20  urned and *nRec 
6320: 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20  and *dbSize are 
6330: 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55  not set.  If JOU
6340: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
6350: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
6360: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
6370: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
6380: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
6390: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
63a0: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
63b0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
63c0: 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e  er, .  i64 journ
63d0: 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70  alSize,.  u32 *p
63e0: 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44  NRec, .  u32 *pD
63f0: 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72  bSize.){.  int r
6400: 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
6410: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
6420: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
6430: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
6440: 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65  er */..  rc = se
6450: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
6460: 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ger);.  if( rc )
6470: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
6480: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
6490: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
64a0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
64b0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
64c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
64d0: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
64e0: 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 52 65 61  = sqlite3Io.xRea
64f0: 64 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  d(&pPager->jfd, 
6500: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
6510: 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72  Magic));.  if( r
6520: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6530: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
6540: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
6550: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6560: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
6570: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6580: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
6590: 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72  ad32bits(&pPager
65a0: 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20  ->jfd, pNRec);. 
65b0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
65c0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
65d0: 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  d32bits(&pPager-
65e0: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
65f0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
6600: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6610: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6620: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
6630: 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66  , pDbSize);.  if
6640: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6650: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
6660: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
6670: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
6680: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
6690: 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  y .  ** the proc
66a0: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
66b0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
66c0: 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
66d0: 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  as.  ** created 
66e0: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
66f0: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
6700: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
6710: 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ine.  ** is bein
6720: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
6730: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
6740: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
6750: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50   value.  ** of P
6760: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
6770: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
6780: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
6790: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72  outine..  */.  r
67a0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
67b0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33  pPager->jfd, (u3
67c0: 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63  2 *)&pPager->sec
67d0: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
67e0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
67f0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6800: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
6810: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
6820: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
6830: 6f 2e 78 53 65 65 6b 28 26 70 50 61 67 65 72 2d  o.xSeek(&pPager-
6840: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
6850: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74  urnalOff);.  ret
6860: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
6870: 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
6880: 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
6890: 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
68a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
68b0: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
68c0: 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
68d0: 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
68e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
68f0: 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
6900: 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
6910: 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
6920: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
6930: 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
6940: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
6950: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
6960: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
6970: 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
6980: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
6990: 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
69a0: 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
69b0: 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
69c0: 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  .**.** + 4 bytes
69d0: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
69e0: 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c  .** + N bytes: l
69f0: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
6a00: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
6a10: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a   + 4 bytes: N.**
6a20: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
6a30: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
6a40: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38  checksum..** + 8
6a50: 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
6a60: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
6a70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6a80: 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
6a90: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
6aa0: 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
6ab0: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
6ac0: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
6ad0: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
6ae0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
6af0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
6b00: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
6b10: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e  nt rc;.  int len
6b20: 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 75  ; .  int i; .  u
6b30: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 0a 0a  32 cksum = 0; ..
6b40: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
6b50: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
6b60: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
6b70: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
6b80: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
6b90: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
6ba0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
6bb0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
6bc0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
6bd0: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
6be0: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
6bf0: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
6c00: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
6c10: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
6c20: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
6c30: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6c40: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
6c50: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
6c60: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
6c70: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
6c80: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
6c90: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
6ca0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
6cb0: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
6cc0: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6cd0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6ce0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6cf0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
6d00: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
6d10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c  journalOff += (l
6d20: 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20  en+20);..  rc = 
6d30: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
6d40: 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f  ger->jfd, PAGER_
6d50: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
6d60: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
6d70: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
6d80: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
6d90: 65 33 49 6f 2e 78 57 72 69 74 65 28 26 70 50 61  e3Io.xWrite(&pPa
6da0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
6db0: 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  r, len);.  if( r
6dc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
6dd0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6de0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
6df0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65 6e 29  Pager->jfd, len)
6e00: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
6e10: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
6e20: 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  c;..  rc = write
6e30: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
6e40: 6a 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69  jfd, cksum);.  i
6e50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6e60: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6e70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e   rc = sqlite3Io.
6e80: 78 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  xWrite(&pPager->
6e90: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
6ea0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
6eb0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50  nalMagic));.  pP
6ec0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
6ed0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
6ee0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
6ef0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
6f00: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
6f10: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
6f20: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
6f30: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
6f40: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
6f50: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
6f60: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
6f70: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
6f80: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
6f90: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
6fa0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
6fb0: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
6fc0: 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
6fd0: 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69  ommit().** routi
6fe0: 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74  ne run MUCH fast
6ff0: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
7000: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
7010: 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70  re are many.** p
7020: 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62  ages in memory b
7030: 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72  ut only a few ar
7040: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
7050: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
7060: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
7070: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
7080: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
7090: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
70a0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
70b0: 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  f( pPg->inStmt )
70c0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
70d0: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
70e0: 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65  t==0 && pPg->pNe
70f0: 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70  xtStmt==0 );.  p
7100: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
7110: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
7120: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50  >pStmt ){.    pP
7130: 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72  ager->pStmt->pPr
7140: 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  evStmt = pPg;.  
7150: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  }.  pPg->pNextSt
7160: 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74  mt = pPager->pSt
7170: 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53  mt;.  pPager->pS
7180: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  tmt = pPg;.  pPg
7190: 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a  ->inStmt = 1;.}.
71a0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
71b0: 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
71c0: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
71d0: 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  g){.  if( !pPg->
71e0: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
71f0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
7200: 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  vStmt ){.    ass
7210: 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53  ert( pPg->pPrevS
7220: 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  tmt->pNextStmt==
7230: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
7240: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
7250: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
7260: 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tStmt;.  }else{.
7270: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
7280: 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d  >pPager->pStmt==
7290: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
72a0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
72b0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
72c0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
72d0: 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  NextStmt ){.    
72e0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
72f0: 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  xtStmt->pPrevStm
7300: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
7310: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
7320: 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
7330: 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20  PrevStmt;.  }.  
7340: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
7350: 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   0;.  pPg->pPrev
7360: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
7370: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a  >inStmt = 0;.}..
7380: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
7390: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
73a0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
73b0: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
73c0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
73d0: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
73e0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
73f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
7400: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
7410: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
7420: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
7430: 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e  dr *p = pPager->
7440: 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68  aHash[pager_hash
7450: 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65  (pgno)];.  while
7460: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
7470: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
7480: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
7490: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
74a0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
74b0: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
74c0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
74d0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
74e0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
74f0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
7500: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
7510: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
7520: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
7530: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
7540: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
7550: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
7560: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
7570: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
7580: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
7590: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
75a0: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
75b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
75c0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
75d0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
75e0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
75f0: 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  t;.  if( pPager-
7600: 3e 65 72 72 4d 61 73 6b 20 29 20 72 65 74 75 72  >errMask ) retur
7610: 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  n;.  for(pPg=pPa
7620: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
7630: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
7640: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
7650: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
7660: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
7670: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
7680: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7690: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
76a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
76b0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
76c0: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d  >pAll = 0;.  mem
76d0: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
76e0: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
76f0: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
7700: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
7710: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
7720: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
7730: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
7740: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
7750: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
7760: 0a 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 55 6e  .  sqlite3Io.xUn
7770: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
7780: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50  , NO_LOCK);.  pP
7790: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
77a0: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50  GER_UNLOCK;.  pP
77b0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
77c0: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  1;.  pPager->nRe
77d0: 66 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  f = 0;.  assert(
77e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
77f0: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Open==0 );.}../*
7800: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7810: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 73  n is used to res
7820: 65 74 20 74 68 65 20 70 61 67 65 72 20 61 66 74  et the pager aft
7830: 65 72 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  er a malloc() fa
7840: 69 6c 75 72 65 2e 20 54 68 69 73 0a 2a 2a 20 64  ilure. This.** d
7850: 6f 65 73 6e 27 74 20 77 6f 72 6b 20 77 69 74 68  oesn't work with
7860: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
7870: 61 73 65 73 2e 20 49 66 20 61 20 6d 61 6c 6c 6f  ases. If a mallo
7880: 63 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 61  c() fails when a
7890: 6e 20 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  n .** in-memory 
78a0: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 75  database is in u
78b0: 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
78c0: 73 69 62 6c 65 20 74 6f 20 72 65 63 6f 76 65 72  sible to recover
78d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
78e0: 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 74 61 74  nsaction or stat
78f0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
7900: 6e 20 69 73 20 61 63 74 69 76 65 2c 20 69 74 20  n is active, it 
7910: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
7920: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65  **.** It is an e
7930: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
7940: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 61 6e  s function if an
7950: 79 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  y pages are in u
7960: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
7970: 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41  QLITE_OMIT_GLOBA
7980: 4c 52 45 43 4f 56 45 52 0a 69 6e 74 20 73 71 6c  LRECOVER.int sql
7990: 69 74 65 33 70 61 67 65 72 5f 72 65 73 65 74 28  ite3pager_reset(
79a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
79b0: 20 20 69 66 28 20 70 50 61 67 65 72 20 29 7b 0a    if( pPager ){.
79c0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
79d0: 6e 52 65 66 20 7c 7c 20 4d 45 4d 44 42 20 29 7b  nRef || MEMDB ){
79e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
79f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
7a00: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  }.    pPager->er
7a10: 72 4d 61 73 6b 20 26 3d 20 7e 28 50 41 47 45 52  rMask &= ~(PAGER
7a20: 5f 45 52 52 5f 4d 45 4d 29 3b 0a 20 20 20 20 70  _ERR_MEM);.    p
7a30: 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
7a40: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
7a50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
7a60: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  ndif.../*.** Whe
7a70: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7a80: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
7a90: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
7aa0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
7ab0: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
7ac0: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
7ad0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
7ae0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
7af0: 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65   releases.** the
7b00: 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61   database lock a
7b10: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48  nd acquires a SH
7b20: 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73  ARED lock in its
7b30: 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75   place.  The jou
7b40: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20  rnal.** file is 
7b50: 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73  deleted and clos
7b60: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
7b70: 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67  Consider keeping
7b80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7b90: 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f  e open for tempo
7ba0: 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a  rary databases..
7bb0: 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69  ** This might gi
7bc0: 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
7bd0: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20   improvement on 
7be0: 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70  windows where op
7bf0: 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20  ening.** a file 
7c00: 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20  is an expensive 
7c10: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
7c20: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75  atic int pager_u
7c30: 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72  nwritelock(Pager
7c40: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
7c50: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
7c60: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
7c70: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
7c80: 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
7c90: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
7ca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7cb0: 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  K;.  }.  sqlite3
7cc0: 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
7cd0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
7ce0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
7cf0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
7d00: 49 6f 2e 78 43 6c 6f 73 65 28 26 70 50 61 67 65  Io.xClose(&pPage
7d10: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
7d20: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
7d30: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
7d40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
7d50: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
7d60: 49 6f 2e 78 43 6c 6f 73 65 28 26 70 50 61 67 65  Io.xClose(&pPage
7d70: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61  r->jfd);.    pPa
7d80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7d90: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
7da0: 33 49 6f 2e 78 44 65 6c 65 74 65 28 70 50 61 67  3Io.xDelete(pPag
7db0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
7dc0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
7dd0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
7de0: 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
7df0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
7e00: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
7e10: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
7e20: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
7e30: 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  l){.      pPg->i
7e40: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
7e50: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
7e60: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
7e70: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 23 69 66  eedSync = 0;.#if
7e80: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
7e90: 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
7ea0: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
7eb0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
7ec0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
7ed0: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
7ee0: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70  Cache = 0;.    p
7ef0: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
7f00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
7f10: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
7f20: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
7f30: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
7f40: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
7f50: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   || pPager->useJ
7f60: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ournal==0 );.  }
7f70: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
7f80: 6f 2e 78 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  o.xUnlock(&pPage
7f90: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
7fa0: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
7fb0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
7fc0: 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f  RED;.  pPager->o
7fd0: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
7fe0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
7ff0: 65 72 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  er = 0;.  return
8000: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
8010: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
8020: 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20   a checksum for 
8030: 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61  the page of data
8040: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
8050: 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
8060: 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c  sum.  It is real
8070: 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
8080: 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
8090: 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
80a0: 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  and the page num
80b0: 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d  ber.  We experim
80c0: 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  ented with.** a 
80d0: 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20  checksum of the 
80e0: 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74  entire data, but
80f0: 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20   that was found 
8100: 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a  to be too slow..
8110: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
8120: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
8130: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8140: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
8150: 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68  ta and.** the ch
8160: 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64  ecksum is stored
8170: 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
8180: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  is is important.
8190: 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20    If journal.** 
81a0: 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
81b0: 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
81c0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
81d0: 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72  st likely scenar
81e0: 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e  io.** is that on
81f0: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
8200: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
8210: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
8220: 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68  .  It is.** much
8230: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
8240: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
8250: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
8260: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
8270: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
8280: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
8290: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
82a0: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
82b0: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
82c0: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
82d0: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
82e0: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
82f0: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  orruption..**.**
8300: 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64   FIX ME:  Consid
8310: 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20  er adding every 
8320: 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79  200th (or so) by
8330: 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74  te of the data t
8340: 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75  o the.** checksu
8350: 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20  m.  That way if 
8360: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70  a single page sp
8370: 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69  ans 3 or more di
8380: 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a  sk sectors and.*
8390: 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c  * only the middl
83a0: 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72  e sector is corr
83b0: 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  upt, we will sti
83c0: 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e  ll have a reason
83d0: 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f  able.** chance o
83e0: 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68  f failing the ch
83f0: 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20  ecksum and thus 
8400: 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72  detecting the pr
8410: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  oblem..*/.static
8420: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
8430: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8440: 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74  Pgno pgno, const
8450: 20 63 68 61 72 20 2a 61 44 61 74 61 29 7b 0a 20   char *aData){. 
8460: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
8470: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
8480: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
8490: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
84a0: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
84b0: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
84c0: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
84d0: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
84e0: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
84f0: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
8500: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  page from the jo
8510: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65  urnal file opene
8520: 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  d on file descri
8530: 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c  ptor.** jfd.  Pl
8540: 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20  ayback this one 
8550: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75  page..**.** If u
8560: 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65  seCksum==0 it me
8570: 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ans this journal
8580: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68   does not use ch
8590: 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73  ecksums.  Checks
85a0: 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75  ums.** are not u
85b0: 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74  sed in statement
85c0: 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73   journals becaus
85d0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
85e0: 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e  nals do not.** n
85f0: 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70  eed to survive p
8600: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a  ower failures..*
8610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
8620: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
8630: 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
8640: 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c  er, OsFile *jfd,
8650: 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a   int useCksum){.
8660: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
8670: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
8680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
8690: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
86a0: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
86b0: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
86d0: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
86e0: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
86f0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
8700: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
8710: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
8720: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
8730: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
8740: 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49  .  u8 aData[SQLI
8750: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8760: 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ];  /* Temp stor
8770: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
8780: 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d  /..  /* useCksum
8790: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20   should be true 
87a0: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  for the main jou
87b0: 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66  rnal and false f
87c0: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  or.  ** statemen
87d0: 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72  t journals.  Ver
87e0: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73  ify that this is
87f0: 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
8800: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
8810: 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d  jfd == (useCksum
8820: 20 3f 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 20   ? &pPager->jfd 
8830: 3a 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  : &pPager->stfd)
8840: 20 29 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61   );...  rc = rea
8850: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67  d32bits(jfd, &pg
8860: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
8870: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8880: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
8890: 69 74 65 33 49 6f 2e 78 52 65 61 64 28 6a 66 64  ite3Io.xRead(jfd
88a0: 2c 20 26 61 44 61 74 61 2c 20 70 50 61 67 65 72  , &aData, pPager
88b0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  ->pageSize);.  i
88c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
88d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
88e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
88f0: 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
8900: 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f  geSize + 4;..  /
8910: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
8920: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
8930: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
8940: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
8950: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
8960: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
8970: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
8980: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
8990: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
89a0: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
89b0: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
89c0: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
89d0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
89e0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
89f0: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
8a00: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
8a10: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
8a20: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
8a30: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
8a40: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
8a50: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
8a60: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
8a70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8a80: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
8a90: 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50  gno>(unsigned)pP
8aa0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
8ab0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8ac0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
8ad0: 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20  useCksum ){.    
8ae0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
8af0: 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  jfd, &cksum);.  
8b00: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
8b10: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
8b20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
8b30: 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  4;.    if( pager
8b40: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70  _cksum(pPager, p
8b50: 67 6e 6f 2c 20 61 44 61 74 61 29 21 3d 63 6b 73  gno, aData)!=cks
8b60: 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
8b70: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8b80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
8b90: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
8ba0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
8bb0: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
8bc0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
8bd0: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
8be0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
8bf0: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
8c00: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
8c10: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
8c20: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
8c30: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
8c40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
8c50: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
8c60: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
8c70: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
8c80: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
8c90: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
8ca0: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
8cb0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
8cc0: 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61  in EXCLUSIVE sta
8cd0: 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
8ce0: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
8cf0: 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a  he if it exists.
8d00: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69    ** and the mai
8d10: 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
8d20: 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
8d30: 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a  not dirty..  **.
8d40: 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
8d50: 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
8d60: 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
8d70: 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
8d80: 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
8d90: 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
8da0: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
8db0: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
8dc0: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
8dd0: 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
8de0: 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
8df0: 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
8e00: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
8e10: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
8e20: 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
8e30: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
8e40: 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
8e50: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
8e60: 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
8e70: 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
8e80: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
8e90: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
8ea0: 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
8eb0: 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
8ec0: 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
8ed0: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69  e contents are i
8ee0: 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  n the main rollb
8ef0: 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
8f00: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  .  Otherwise, if
8f10: 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b   a full ROLLBACK
8f20: 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68   occurs after th
8f30: 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  e statement.  **
8f40: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75   rollback the fu
8f50: 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c  ll ROLLBACK will
8f60: 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65   not restore the
8f70: 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69   page to its ori
8f80: 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65  ginal.  ** conte
8f90: 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  nt.  Two conditi
8fa0: 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20  ons must be met 
8fb0: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
8fc0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  o the database. 
8fd0: 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74   ** files. (1) t
8fe0: 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
8ff0: 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29   be locked.  (2)
9000: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
9010: 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
9020: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
9030: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
9040: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
9050: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
9060: 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65  ot in.  ** cache
9070: 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d   or else it is m
9080: 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
9090: 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  c==0..  */.  pPg
90a0: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
90b0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
90c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
90d0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
90e0: 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 21 3d  CLUSIVE || pPg!=
90f0: 30 20 29 3b 0a 20 20 54 52 41 43 45 33 28 22 50  0 );.  TRACE3("P
9100: 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
9110: 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
9120: 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20  Pager), pgno);. 
9130: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
9140: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
9150: 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c  IVE && (pPg==0 |
9160: 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  | pPg->needSync=
9170: 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =0) ){.    rc = 
9180: 73 71 6c 69 74 65 33 49 6f 2e 78 53 65 65 6b 28  sqlite3Io.xSeek(
9190: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
91a0: 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
91b0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
91c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
91d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
91e0: 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 57 72 69  = sqlite3Io.xWri
91f0: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
9200: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
9210: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
9220: 20 20 20 20 69 66 28 20 70 50 67 20 29 20 70 50      if( pPg ) pP
9230: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
9240: 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
9250: 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
9260: 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
9270: 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
9280: 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
9290: 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
92a0: 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
92b0: 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
92c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
92d0: 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
92e0: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
92f0: 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
9300: 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
9310: 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
9320: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
9330: 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
9340: 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
9350: 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
9360: 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
9370: 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
9380: 72 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  rollback()..    
9390: 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
93a0: 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  ta;.    /* asser
93b0: 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  t( pPg->nRef==0 
93c0: 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20  || pPg->pgno==1 
93d0: 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20  ); */.    pData 
93e0: 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
93f0: 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  pPg);.    memcpy
9400: 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70  (pData, aData, p
9410: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9420: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
9430: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
9440: 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20    /*** FIX ME:  
9450: 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78  Should this be x
9460: 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20  Reinit? ***/.   
9470: 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
9480: 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50  ructor(pData, pP
9490: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
94a0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
94b0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
94c0: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
94d0: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
94e0: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
94f0: 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65  .    CODEC(pPage
9500: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
9510: 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72  gno, 3);.  }.  r
9520: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9530: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
9540: 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
9550: 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
9560: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
9570: 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
9580: 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
9590: 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
95a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
95b0: 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
95c0: 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
95d0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
95e0: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
95f0: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
9600: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9610: 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
9620: 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
9630: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
9640: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
9650: 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
9660: 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e   all child journ
9670: 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20  als..** To tell 
9680: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
9690: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
96a0: 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63  ed, check to eac
96b0: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c  h of the.** chil
96c0: 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68  dren.  If all ch
96d0: 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65  ildren are eithe
96e0: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20  r missing or do 
96f0: 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  not refer to.** 
9700: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
9710: 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  er journal, then
9720: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
9730: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
9740: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
9750: 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
9760: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
9770: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
9780: 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f  c;.  int master_
9790: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69  open = 0;.  OsFi
97a0: 6c 65 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61  le master;.  cha
97b0: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
97c0: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
97d0: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
97e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
97f0: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
9800: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
9810: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
9820: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
9830: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
9840: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
9850: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
9860: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
9870: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
9880: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
9890: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
98a0: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
98b0: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
98c0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61   */.  memset(&ma
98d0: 73 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ster, 0, sizeof(
98e0: 6d 61 73 74 65 72 29 29 3b 0a 20 20 72 63 20 3d  master));.  rc =
98f0: 20 73 71 6c 69 74 65 33 49 6f 2e 78 4f 70 65 6e   sqlite3Io.xOpen
9900: 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72  ReadOnly(zMaster
9910: 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66  , &master);.  if
9920: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9930: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
9940: 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f  _out;.  master_o
9950: 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20  pen = 1;.  rc = 
9960: 73 71 6c 69 74 65 33 49 6f 2e 78 46 69 6c 65 53  sqlite3Io.xFileS
9970: 69 7a 65 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d  ize(&master, &nM
9980: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
9990: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
99a0: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
99b0: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20  ter_out;..  if( 
99c0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30  nMasterJournal>0
99d0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a   ){.    char *zJ
99e0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72  ournal;.    char
99f0: 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30   *zMasterPtr = 0
9a00: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
9a10: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
9a20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
9a30: 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
9a40: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
9a50: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
9a60: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
9a70: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a  MasterJournal. .
9a80: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74      */.    zMast
9a90: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61  erJournal = (cha
9aa0: 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
9ab0: 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (nMasterJournal)
9ac0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
9ad0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
9ae0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
9af0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
9b00: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9b10: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
9b20: 71 6c 69 74 65 33 49 6f 2e 78 52 65 61 64 28 26  qlite3Io.xRead(&
9b30: 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  master, zMasterJ
9b40: 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a  ournal, nMasterJ
9b50: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
9b60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9b70: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
9b80: 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  out;..    zJourn
9b90: 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
9ba0: 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
9bb0: 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
9bc0: 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
9bd0: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
9be0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 2e    if( sqlite3Io.
9bf0: 78 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75  xFileExists(zJou
9c00: 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  rnal) ){.       
9c10: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
9c20: 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
9c30: 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
9c40: 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
9c50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
9c60: 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
9c70: 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
9c80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9c90: 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  . If.        ** 
9ca0: 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
9cb0: 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
9cc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9cd0: 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
9ce0: 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20 6a          OsFile j
9cf0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 20 20 20 20  ournal;.        
9d00: 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20  int c;..        
9d10: 6d 65 6d 73 65 74 28 26 6a 6f 75 72 6e 61 6c 2c  memset(&journal,
9d20: 20 30 2c 20 73 69 7a 65 6f 66 28 6a 6f 75 72 6e   0, sizeof(journ
9d30: 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  al));.        rc
9d40: 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 4f 70   = sqlite3Io.xOp
9d50: 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72  enReadOnly(zJour
9d60: 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a  nal, &journal);.
9d70: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
9d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9d90: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
9da0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
9db0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
9dc0: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
9dd0: 72 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c 20 26  rnal(&journal, &
9de0: 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  zMasterPtr);.   
9df0: 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e 78       sqlite3Io.x
9e00: 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b  Close(&journal);
9e10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
9e20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9e30: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
9e40: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
9e50: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
9e60: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30   = zMasterPtr!=0
9e70: 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
9e80: 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
9e90: 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  =0;.        sqli
9ea0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74  teFree(zMasterPt
9eb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
9ec0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
9ed0: 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
9ee0: 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
9ef0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9f00: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
9f10: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
9f20: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
9f30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9f40: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
9f50: 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29  strlen(zJournal)
9f60: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
9f70: 20 0a 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 44   .  sqlite3Io.xD
9f80: 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a  elete(zMaster);.
9f90: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
9fa0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
9fb0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
9fc0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  teFree(zMasterJo
9fd0: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
9fe0: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
9ff0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  ){.    sqlite3Io
a000: 2e 78 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  .xClose(&master)
a010: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
a020: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
a030: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
a040: 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77  he cache agree w
a050: 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
a060: 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  isk.  In other w
a070: 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20  ords,.** reread 
a080: 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65  the disk to rese
a090: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
a0a0: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
a0b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a0c0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72  called after a r
a0d0: 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68  ollback in which
a0e0: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72   some of the dir
a0f0: 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65  ty cache.** page
a100: 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e  s had never been
a110: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
a120: 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74  disk.  We need t
a130: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a  o roll back the.
a140: 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74  ** cache content
a150: 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74   and the easiest
a160: 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20   way to do that 
a170: 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  is to reread the
a180: 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   old content.** 
a190: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69  back from the di
a1a0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
a1b0: 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  t pager_reload_c
a1c0: 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
a1d0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
a1e0: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
a1f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70  LITE_OK;.  for(p
a200: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
a210: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
a220: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68  NextAll){.    ch
a230: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d  ar zBuf[SQLITE_M
a240: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20  AX_PAGE_SIZE];. 
a250: 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72     if( !pPg->dir
a260: 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ty ) continue;. 
a270: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
a280: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
a290: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
a2a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a2b0: 33 49 6f 2e 78 53 65 65 6b 28 26 70 50 61 67 65  3Io.xSeek(&pPage
a2c0: 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70  r->fd, pPager->p
a2d0: 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50  ageSize*(i64)(pP
a2e0: 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20  g->pgno-1));.   
a2f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a300: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
a310: 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78  rc = sqlite3Io.x
a320: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
a330: 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
a340: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
a350: 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33 28   }.      TRACE3(
a360: 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65  "REFETCH %d page
a370: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
a380: 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
a390: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
a3a0: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
a3b0: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a   CODEC(pPager, z
a3c0: 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Buf, pPg->pgno, 
a3d0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  2);.    }else{. 
a3e0: 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66       memset(zBuf
a3f0: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
a400: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
a410: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
a420: 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75  =0 || memcmp(zBu
a430: 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  f, PGHDR_TO_DATA
a440: 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
a450: 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
a460: 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
a470: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75  O_DATA(pPg), zBu
a480: 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
a490: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
a4a0: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
a4b0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
a4c0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50  ger->xReiniter(P
a4d0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
a4e0: 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
a4f0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
a500: 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
a510: 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
a520: 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
a530: 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
a540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a550: 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
a560: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  nc = 0;.    pPg-
a570: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64  >dirty = 0;.#ifd
a580: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
a590: 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
a5a0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
a5b0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
a5c0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
a5d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a5e0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
a5f0: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
a600: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
a610: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
a620: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  .** indicated..*
a630: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
a640: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
a650: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
a660: 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
a670: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
a680: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
a690: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
a6a0: 74 65 33 49 6f 2e 78 54 72 75 6e 63 61 74 65 28  te3Io.xTruncate(
a6b0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  &pPager->fd, pPa
a6c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
a6d0: 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  64)nPage);.}../*
a6e0: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
a6f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
a700: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
a710: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
a720: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
a730: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
a740: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
a750: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
a760: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
a770: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
a780: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
a790: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
a7a0: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
a7b0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
a7c0: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
a7d0: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
a7e0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
a7f0: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
a800: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
a810: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
a820: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
a830: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
a840: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
a850: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
a860: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
a870: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
a880: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
a890: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
a8a0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
a8b0: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
a8c0: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
a8d0: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
a8e0: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
a8f0: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
a900: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
a910: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
a920: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
a930: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
a940: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
a950: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
a960: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
a970: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
a980: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
a990: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a9a0: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
a9b0: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
a9c0: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
a9d0: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
a9e0: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
a9f0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
aa00: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
aa10: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
aa20: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
aa30: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
aa40: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
aa50: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
aa60: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
aa70: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
aa80: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
aa90: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
aaa0: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
aab0: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
aac0: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
aad0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
aae0: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
aaf0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
ab00: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
ab10: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
ab20: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
ab30: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
ab40: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
ab50: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
ab60: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
ab70: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
ab80: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
ab90: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
aba0: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
abb0: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
abc0: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
abd0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
abe0: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
abf0: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
ac00: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
ac10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
ac20: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
ac30: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
ac40: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
ac50: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
ac60: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
ac70: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
ac80: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
ac90: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
aca0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
acb0: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
acc0: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
acd0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
ace0: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
acf0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
ad00: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
ad10: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
ad20: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
ad30: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
ad40: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
ad50: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
ad60: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
ad70: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
ad80: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
ad90: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
ada0: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
adb0: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
adc0: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
add0: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
ade0: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
adf0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
ae00: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
ae10: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
ae20: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
ae30: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
ae40: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
ae50: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
ae60: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
ae70: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
ae80: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
ae90: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
aea0: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
aeb0: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
aec0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
aed0: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
aee0: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
aef0: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
af00: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
af10: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
af20: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
af30: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
af40: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
af50: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
af60: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
af70: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
af80: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
af90: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
afa0: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
afb0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
afc0: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
afd0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
afe0: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
aff0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
b000: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
b010: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
b020: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
b030: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
b040: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
b050: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
b060: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
b070: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
b080: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
b090: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
b0a0: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
b0b0: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
b0c0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
b0d0: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
b0e0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
b0f0: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
b100: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
b110: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
b120: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
b130: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
b140: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
b150: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
b160: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
b170: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b180: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
b190: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
b1a0: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
b1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b1c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b1d0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
b1e0: 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b200: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
b210: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b220: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b240: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
b250: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
b260: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
b270: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
b280: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
b290: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
b2c0: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
b2d0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
b2e0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
b2f0: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
b300: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
b310: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
b320: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
b330: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
b340: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
b350: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
b360: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
b370: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
b380: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
b390: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
b3a0: 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 46  c = sqlite3Io.xF
b3b0: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
b3c0: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
b3d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b3e0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
b3f0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
b400: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
b410: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
b420: 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
b430: 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
b440: 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
b450: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
b460: 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
b470: 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
b480: 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
b490: 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
b4a0: 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
b4b0: 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
b4c0: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
b4d0: 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
b4e0: 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63   back..  */.  rc
b4f0: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
b500: 72 6e 61 6c 28 26 70 50 61 67 65 72 2d 3e 6a 66  rnal(&pPager->jf
b510: 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20  d, &zMaster);.  
b520: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
b530: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
b540: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
b550: 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73  | (zMaster && !s
b560: 71 6c 69 74 65 33 49 6f 2e 78 46 69 6c 65 45 78  qlite3Io.xFileEx
b570: 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29  ists(zMaster)) )
b580: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
b590: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a  (zMaster);.    z
b5a0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
b5b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
b5c0: 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
b5d0: 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  E_OK;.    goto e
b5e0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
b5f0: 0a 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 53 65  .  sqlite3Io.xSe
b600: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
b610: 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   0);.  pPager->j
b620: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
b630: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
b640: 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
b650: 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
b660: 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
b670: 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
b680: 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
b690: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
b6a0: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
b6b0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
b6c0: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
b6d0: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
b6e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
b6f0: 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
b700: 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
b710: 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
b720: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
b730: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
b740: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
b750: 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
b760: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
b770: 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
b780: 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
b790: 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
b7a0: 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
b7b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
b7c0: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
b7d0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
b7e0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
b7f0: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
b800: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
b810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
b820: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b830: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
b840: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b850: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
b860: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
b870: 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
b880: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
b890: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
b8a0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
b8b0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
b8c0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
b8d0: 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
b8e0: 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
b8f0: 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
b900: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
b910: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
b920: 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
b930: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
b940: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
b950: 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
b960: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
b970: 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
b980: 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
b990: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
b9a0: 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
b9b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
b9c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
b9d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
b9e0: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
b9f0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
ba00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
ba10: 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
ba20: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
ba30: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
ba40: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
ba50: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
ba60: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
ba70: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
ba80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
ba90: 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67  ack to it's orig
baa0: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
bab0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
bac0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
bad0: 58 43 4c 55 53 49 56 45 20 26 26 20 0a 20 20 20  XCLUSIVE && .   
bae0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
baf0: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
bb00: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
bb10: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
bb20: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
bb30: 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ize==0 || pPager
bb40: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78  ->origDbSize==mx
bb50: 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pg );.      rc =
bb60: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
bb70: 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
bb80: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
bb90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
bba0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
bbb0: 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
bbc0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
bbd0: 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
bbe0: 0a 20 20 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c  .    /* rc = sql
bbf0: 69 74 65 33 49 6f 2e 78 53 65 65 6b 28 26 70 50  ite3Io.xSeek(&pP
bc00: 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e  ager->jfd, JOURN
bc10: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
bc20: 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  )); */.    if( r
bc30: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
bc40: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
bc50: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ;.  .    /* Copy
bc60: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
bc70: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
bc80: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
bc90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
bca0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
bcb0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
bcc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
bcd0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
bce0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
bcf0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31   &pPager->jfd, 1
bd00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
bd10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bd20: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
bd30: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
bd40: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
bd50: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
bd60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bd70: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
bd80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bd90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bda0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
bdb0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
bdc0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
bdd0: 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20    }..  /* Pages 
bde0: 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77  that have been w
bdf0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
be00: 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20  urnal but never 
be10: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72  synced.  ** wher
be20: 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62  e not restored b
be30: 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65  y the loop above
be40: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65  .  We have to re
be50: 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a  store those.  **
be60: 20 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e   pages by readin
be70: 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d  g them back from
be80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
be90: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61  tabase..  */.  a
bea0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
beb0: 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f  E_OK );.  pager_
bec0: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
bed0: 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62  ger);..end_playb
bee0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
bef0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bf00: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
bf10: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
bf20: 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65    }.  if( zMaste
bf30: 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  r ){.    /* If t
bf40: 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
bf50: 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
bf60: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
bf70: 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20  return true,.   
bf80: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
bf90: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
bfa0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
bfb0: 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
bfc0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
bfd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
bfe0: 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
bff0: 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  er(zMaster);.   
c000: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
c010: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(zMaster);.  }.
c020: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
c030: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
c040: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
c050: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
c060: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
c070: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
c080: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
c090: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
c0a0: 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  t PAGER_SECTOR_S
c0b0: 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  IZE.  ** value. 
c0c0: 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
c0d0: 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
c0e0: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
c0f0: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73    */.  pPager->s
c100: 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45  ectorSize = PAGE
c110: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  R_SECTOR_SIZE;. 
c120: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c130: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
c140: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
c150: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
c160: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c  is similar to pl
c170: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74  aying back the t
c180: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
c190: 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61  al but with.** a
c1a0: 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74   few extra twist
c1b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
c1c0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   The number of p
c1d0: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
c1e0: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
c1f0: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20   start of.**    
c200: 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65       the stateme
c210: 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
c220: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
c230: 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20  , not in the.** 
c240: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
c250: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  file itself..**.
c260: 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64  **    (2)  In ad
c270: 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e  dition to playin
c280: 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  g back the state
c290: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c  ment journal, al
c2a0: 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c  so.**         pl
c2b0: 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73  ayback all pages
c2c0: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
c2d0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69  ion journal begi
c2e0: 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  nning.**        
c2f0: 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65   at offset pPage
c300: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f  r->stmtJSize..*/
c310: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
c320: 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
c330: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
c340: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
c350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
c360: 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a  ze of the full j
c370: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
c380: 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52  hdrOff;.  int nR
c390: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
c3a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c3b0: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  Records */.  int
c3c0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c3d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c3e0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
c3f0: 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67  c;..  szJ = pPag
c400: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
c410: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
c420: 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73    {.    i64 os_s
c430: 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  zJ;.    rc = sql
c440: 69 74 65 33 49 6f 2e 78 46 69 6c 65 53 69 7a 65  ite3Io.xFileSize
c450: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
c460: 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28  os_szJ);.    if(
c470: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c480: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c490: 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f  assert( szJ==os_
c4a0: 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  szJ );.  }.#endi
c4b0: 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f  f..  /* Set hdrO
c4c0: 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66  ff to be the off
c4d0: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
c4e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
c4f0: 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69  written.  ** thi
c500: 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  s statement tran
c510: 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20  saction, or the 
c520: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
c530: 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20  if no journal.  
c540: 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72  ** header was wr
c550: 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64  itten..  */.  hd
c560: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  rOff = pPager->s
c570: 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73  tmtHdrOff;.  ass
c580: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
c590: 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66  lSync || !hdrOff
c5a0: 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66   );.  if( !hdrOf
c5b0: 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20  f ){.    hdrOff 
c5c0: 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20  = szJ;.  }.  .  
c5d0: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
c5e0: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
c5f0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
c600: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ze..  */.  if( p
c610: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
c620: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
c630: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
c640: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
c650: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
c660: 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
c670: 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
c680: 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20  r->stmtSize;..  
c690: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
c6a0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
c6b0: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
c6c0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
c6d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
c6e0: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
c6f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c700: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
c710: 33 49 6f 2e 78 53 65 65 6b 28 26 70 50 61 67 65  3Io.xSeek(&pPage
c720: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e  r->stfd, 0);.  n
c730: 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
c740: 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  mtNRec;.  .  /* 
c750: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
c760: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ges out of the s
c770: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c780: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
c790: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
c7a0: 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61   file.  Note tha
c7b0: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
c7c0: 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68  journal omits ch
c7d0: 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a  ecksums from.  *
c7e0: 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69  * each record si
c7f0: 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  nce power-failur
c800: 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f  e recovery is no
c810: 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73  t important to s
c820: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f  tatement.  ** jo
c830: 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66  urnals..  */.  f
c840: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
c850: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
c860: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
c870: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
c880: 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  , &pPager->stfd,
c890: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
c8a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
c8b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
c8c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
c8d0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
c8e0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
c8f0: 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
c900: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
c910: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
c920: 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
c930: 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
c940: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
c950: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
c960: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
c970: 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
c980: 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
c990: 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
c9a0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
c9b0: 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
c9c0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
c9d0: 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
c9e0: 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
c9f0: 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
ca00: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
ca10: 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
ca20: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
ca30: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
ca40: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
ca50: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
ca60: 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
ca70: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
ca80: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
ca90: 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 53 65   = sqlite3Io.xSe
caa0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
cab0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
cac0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
cad0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cae0: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
caf0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
cb00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cb10: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a   = pPager->stmtJ
cb20: 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
cb30: 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67  cksumInit = pPag
cb40: 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20  er->stmtCksum;. 
cb50: 20 61 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c   assert( JOURNAL
cb60: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c  _HDR_SZ(pPager)<
cb70: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
cb80: 65 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28  e+8) );.  while(
cb90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cba0: 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28  Off <= (hdrOff-(
cbb0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
cbc0: 2b 38 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  +8)) ){.    rc =
cbd0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
cbe0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
cbf0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31   &pPager->jfd, 1
cc00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
cc10: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
cc20: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
cc30: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
cc40: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
cc50: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
cc60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cc70: 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
cc80: 75 33 32 20 6e 52 65 63 3b 0a 20 20 20 20 75 33  u32 nRec;.    u3
cc90: 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
cca0: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
ccb0: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
ccc0: 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
ccd0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cce0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
ccf0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
cd00: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f  DONE );.      go
cd10: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
cd20: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  back;.    }.    
cd30: 69 66 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20  if( nRec==0 ){. 
cd40: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
cd50: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
cd60: 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72  alOff) / (pPager
cd70: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20  ->pageSize+8);. 
cd80: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e     }.    for(i=n
cd90: 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
cda0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cdb0: 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
cdc0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
cdd0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
cde0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
cdf0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
ce00: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
ce10: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
ce20: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ce30: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
ce40: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
ce50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
ce60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
ce70: 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
ce80: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
ce90: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cea0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
ceb0: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
cec0: 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ERR_CORRUPT;.   
ced0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
cee0: 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RUPT;.  }else{. 
cef0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cf00: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
cf10: 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64   /* pager_reload
cf20: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20  _cache(pPager); 
cf30: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
cf40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
cf50: 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
cf60: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
cf70: 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
cf80: 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
cf90: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
cfa0: 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50  _set_cachesize(P
cfb0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
cfc0: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
cfd0: 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
cfe0: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
cff0: 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c   = mxPage;.  }el
d000: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
d010: 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d  mxPage = 10;.  }
d020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
d030: 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
d040: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
d050: 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
d060: 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
d070: 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
d080: 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
d090: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
d0a0: 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
d0b0: 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
d0c0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
d0d0: 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
d0e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
d0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e        sqlite3Io.
d100: 78 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  xSync() is never
d110: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
d120: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
d140: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
d150: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
d160: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
d170: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
d180: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
d190: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
d1a0: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
d1b0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
d1c0: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
d1d0: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
d1e0: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
d1f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
d200: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
d210: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
d220: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
d230: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
d240: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
d250: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
d260: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
d270: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
d280: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
d290: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
d2a0: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
d2b0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
d2c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d2d0: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
d2e0: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
d2f0: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
d300: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
d310: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
d320: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
d330: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d340: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
d350: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
d360: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
d370: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
d390: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
d3a0: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
d3b0: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
d3c0: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
d3d0: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
d3e0: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
d3f0: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
d400: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
d410: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
d420: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
d430: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
d440: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
d450: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
d460: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
d470: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
d480: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
d490: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
d4a0: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
d4b0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
d4c0: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
d4d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
d4e0: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
d4f0: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
d500: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
d510: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
d520: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
d530: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d540: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
d550: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
d560: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
d570: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
d580: 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70   int level){.  p
d590: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
d5a0: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
d5b0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
d5c0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
d5d0: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
d5e0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
d5f0: 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
d600: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
d610: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
d620: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
d630: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
d640: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
d650: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
d660: 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
d670: 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
d680: 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
d690: 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
d6a0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
d6b0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
d6c0: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
d6d0: 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ly.  .*/.int sql
d6e0: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
d6f0: 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  unt = 0;../*.** 
d700: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
d710: 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
d720: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
d730: 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a 2a  le into zFile.**
d740: 20 28 7a 46 69 6c 65 20 6d 75 73 74 20 62 65 20   (zFile must be 
d750: 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f  at least SQLITE_
d760: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79  TEMPNAME_SIZE by
d770: 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74  tes long.)  Writ
d780: 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  e.** the file de
d790: 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66  scriptor into *f
d7a0: 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
d7b0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
d7c0: 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  or some.** other
d7d0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
d7e0: 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  e fail..**.** Th
d7f0: 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
d800: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
d810: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
d820: 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  e when it is.** 
d830: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
d840: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  c int sqlite3pag
d850: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72  er_opentemp(char
d860: 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20   *zFile, OsFile 
d870: 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  *fd){.  int cnt 
d880: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
d890: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
d8a0: 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
d8b0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
d8c0: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
d8d0: 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 63  y */.  do{.    c
d8e0: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
d8f0: 33 49 6f 2e 78 54 65 6d 70 46 69 6c 65 4e 61 6d  3Io.xTempFileNam
d900: 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63  e(zFile);.    rc
d910: 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 4f 70   = sqlite3Io.xOp
d920: 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c  enExclusive(zFil
d930: 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68  e, fd, 1);.  }wh
d940: 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63  ile( cnt>0 && rc
d950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
d960: 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
d970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
d980: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
d990: 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65  a new page cache
d9a0: 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
d9b0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63  er to the page c
d9c0: 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72  ache in *ppPager
d9d0: 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f  ..** The file to
d9e0: 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20   be cached need 
d9f0: 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20  not exist.  The 
da00: 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b  file is not lock
da10: 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20  ed until.** the 
da20: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
da30: 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
da40: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
da50: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
da60: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
da70: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
da80: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
da90: 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
daa0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
dab0: 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
dac0: 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
dad0: 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
dae0: 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
daf0: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
db00: 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
db10: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
db20: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
db30: 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
db40: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
db50: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
db60: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
db70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
db80: 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
db90: 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
dba0: 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
dbb0: 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
dbc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
dbd0: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
dbe0: 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
dbf0: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a  ite3pager_open(.
dc00: 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
dc10: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
dc20: 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
dc30: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
dc40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
dc50: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
dc60: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
dc70: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
dc80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
dc90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
dca0: 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
dcb0: 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
dcc0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
dcd0: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
dce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
dcf0: 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
dd00: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  his file */.){. 
dd10: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
dd20: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
dd30: 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  hname = 0;.  int
dd40: 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69   nameLen;.  OsFi
dd50: 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 20  le fd;.  int rc 
dd60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
dd70: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
dd80: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
dd90: 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
dda0: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
ddb0: 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
ddc0: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
ddd0: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
dde0: 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
ddf0: 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
de00: 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
de10: 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65  )!=0;.  char zTe
de20: 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
de30: 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70  ME_SIZE];..  *pp
de40: 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d  Pager = 0;.  mem
de50: 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65  set(&fd, 0, size
de60: 6f 66 28 66 64 29 29 3b 0a 20 20 69 66 28 20 73  of(fd));.  if( s
de70: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
de80: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
de90: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
dea0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65  .  }.  if( zFile
deb0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
dec0: 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20  e[0] ){.#ifndef 
ded0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
dee0: 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
def0: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
df00: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
df10: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
df20: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
df30: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
df40: 44 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20 72  Dup("");.      r
df50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
df60: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
df70: 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c      {.      zFul
df80: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
df90: 74 65 33 49 6f 2e 78 46 75 6c 6c 50 61 74 68 6e  te3Io.xFullPathn
dfa0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
dfb0: 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50        if( zFullP
dfc0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
dfd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
dfe0: 6f 2e 78 4f 70 65 6e 52 65 61 64 57 72 69 74 65  o.xOpenReadWrite
dff0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
e000: 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b  &fd, &readOnly);
e010: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
e030: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
e040: 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66  entemp(zTemp, &f
e050: 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  d);.    zFilenam
e060: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
e070: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e080: 71 6c 69 74 65 33 49 6f 2e 78 46 75 6c 6c 50 61  qlite3Io.xFullPa
e090: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
e0a0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
e0b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e0c0: 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
e0d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e0e0: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
e0f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e  {.    sqlite3Io.
e100: 78 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  xClose(&fd);.   
e110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e120: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
e130: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e140: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e 78  .    sqlite3Io.x
e150: 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20  Close(&fd);.    
e160: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
e170: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
e180: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
e190: 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e  nameLen = strlen
e1a0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e1b0: 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
e1c0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
e1d0: 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65  (*pPager) + name
e1e0: 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20  Len*3 + 30 );.  
e1f0: 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b  if( pPager==0 ){
e200: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e 78  .    sqlite3Io.x
e210: 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20  Close(&fd);.    
e220: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
e230: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
e240: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e250: 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 33  EM;.  }.  TRACE3
e260: 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
e270: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
e280: 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ), zFullPathname
e290: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
e2a0: 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
e2b0: 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50  &pPager[1];.  pP
e2c0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
e2d0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
e2e0: 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ename[nameLen+1]
e2f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
e300: 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
e310: 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c  zDirectory[nameL
e320: 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28  en+1];.  strcpy(
e330: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
e340: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
e350: 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  );.  strcpy(pPag
e360: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
e370: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e380: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
e390: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
e3a0: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
e3b0: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
e3c0: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
e3d0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
e3e0: 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70   = 0;.  strcpy(p
e3f0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
e400: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e410: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
e420: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e430: 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e  strcpy(&pPager->
e440: 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e  zJournal[nameLen
e450: 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a  ], "-journal");.
e460: 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 43 6f 70    sqlite3Io.xCop
e470: 79 4f 73 46 69 6c 65 28 26 70 50 61 67 65 72 2d  yOsFile(&pPager-
e480: 3e 66 64 2c 26 66 64 29 3b 0a 20 20 70 50 61 67  >fd,&fd);.  pPag
e490: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
e4a0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75  = 0;.  pPager->u
e4b0: 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a  seJournal = useJ
e4c0: 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62  ournal && !memDb
e4d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
e4e0: 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c  adlock = noReadl
e4f0: 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b  ock && readOnly;
e500: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  .  pPager->stmtO
e510: 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  pen = 0;.  pPage
e520: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
e530: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
e540: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e550: 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31  dbSize = memDb-1
e560: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ;.  pPager->page
e570: 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
e580: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
e590: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
e5a0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
e5b0: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
e5c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
e5d0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
e5e0: 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 0a 20  >nMaxPage = 0;. 
e5f0: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
e600: 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d  = 100;.  pPager-
e610: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
e620: 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d  NLOCK;.  pPager-
e630: 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  >errMask = 0;.  
e640: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
e650: 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70   = tempFile;.  p
e660: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
e670: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
e680: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
e690: 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nly;.  pPager->n
e6a0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
e6b0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
e6c0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
e6d0: 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
e6e0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
e6f0: 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e  ync = (pPager->n
e700: 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50  oSync?0:1);.  pP
e710: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
e720: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
e730: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20  stSynced = 0;.  
e740: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
e750: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  0;.  pPager->nEx
e760: 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47  tra = FORCE_ALIG
e770: 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20  NMENT(nExtra);. 
e780: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
e790: 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54  ize = PAGER_SECT
e7a0: 4f 52 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65  OR_SIZE;.  pPage
e7b0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
e7c0: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50  = 0;.  memset(pP
e7d0: 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
e7e0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
e7f0: 48 61 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67  Hash));.  *ppPag
e800: 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
e810: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
e830: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
e840: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
e850: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
e860: 74 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50 61  t_busyhandler(Pa
e870: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73  ger *pPager, Bus
e880: 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
e890: 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65  andler){.  pPage
e8a0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
e8b0: 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = pBusyHandler;.
e8c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
e8d0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
e8e0: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
e8f0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
e900: 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
e910: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
e920: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
e930: 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
e940: 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
e950: 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
e960: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
e970: 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
e980: 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
e990: 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
e9a0: 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
e9b0: 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
e9c0: 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
e9d0: 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
e9e0: 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
e9f0: 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
ea00: 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
ea10: 65 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67  ed by sqlite3pag
ea20: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  er_unref()..*/.v
ea30: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
ea40: 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28  _set_destructor(
ea50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
ea60: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69  oid (*xDesc)(voi
ea70: 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  d*,int)){.  pPag
ea80: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
ea90: 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
eaa0: 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
eab0: 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
eac0: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
ead0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74  NULL, the reinit
eae0: 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61  ializer.** is ca
eaf0: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  lled when the co
eb00: 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20  ntent of a page 
eb10: 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74  in cache is rest
eb20: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
eb30: 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73  inal.** value as
eb40: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72   a result of a r
eb50: 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61  ollback.  The ca
eb60: 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67  llback gives hig
eb70: 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a  her-level code.*
eb80: 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  * an opportunity
eb90: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
eba0: 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
ebb0: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
ebc0: 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65  restored.** page
ebd0: 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73   data..*/.void s
ebe0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
ebf0: 72 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a  reiniter(Pager *
ec00: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
ec10: 52 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e  Reinit)(void*,in
ec20: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
ec30: 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
ec40: 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  it;.}../*.** Set
ec50: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20   the page size. 
ec60: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20   Return the new 
ec70: 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75  size.  If the su
ec80: 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a  ggest new page.*
ec90: 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72  * size is inappr
eca0: 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e  opriate, then an
ecb0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
ecc0: 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74  e size is select
ecd0: 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ed.** and return
ece0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
ecf0: 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e3pager_set_page
ed00: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
ed10: 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  er, int pageSize
ed20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ){.  assert( pag
ed30: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
ed40: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
ed50: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
ed60: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
ed70: 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
ed80: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
ed90: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72  ageSize;.  }.  r
eda0: 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61  eturn pPager->pa
edb0: 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
edc0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
edd0: 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
ede0: 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
edf0: 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
ee00: 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
ee10: 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
ee20: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
ee30: 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
ee40: 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
ee50: 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
ee60: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
ee70: 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
ee80: 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
ee90: 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
eea0: 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
eeb0: 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
eec0: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
eed0: 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
eee0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
eef0: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
ef00: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
ef10: 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
ef20: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
ef30: 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
ef40: 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
ef50: 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f  clear_simulated_
ef60: 69 6f 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73 71  io_error(){.  sq
ef70: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
ef80: 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64  it = 0;.}.void d
ef90: 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
efa0: 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
efb0: 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
efc0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
efd0: 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
efe0: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
eff0: 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
f000: 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
f010: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
f020: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
f030: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
f040: 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
f050: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6c 65  lse.# define cle
f060: 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  ar_simulated_io_
f070: 65 72 72 6f 72 28 29 0a 23 20 64 65 66 69 6e 65  error().# define
f080: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
f090: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
f0a0: 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
f0b0: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
f0c0: 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
f0d0: 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
f0e0: 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
f0f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
f100: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
f110: 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
f120: 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4e  st points to.  N
f130: 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
f140: 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69   is done..*/.voi
f150: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  d sqlite3pager_r
f160: 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28 50  ead_fileheader(P
f170: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
f180: 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
f190: 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65  ar *pDest){.  me
f1a0: 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
f1b0: 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d  );.  if( MEMDB==
f1c0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
f1d0: 49 6f 2e 78 53 65 65 6b 28 26 70 50 61 67 65 72  Io.xSeek(&pPager
f1e0: 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 73 71  ->fd, 0);.    sq
f1f0: 6c 69 74 65 33 49 6f 2e 78 52 65 61 64 28 26 70  lite3Io.xRead(&p
f200: 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
f210: 2c 20 4e 29 3b 0a 20 20 20 20 63 6c 65 61 72 5f  , N);.    clear_
f220: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
f230: 6f 72 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  or();.  }.}../*.
f240: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
f250: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
f260: 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ges in the disk 
f270: 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
f280: 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20  with.** pPager. 
f290: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45  .**.** If the PE
f2a0: 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20  NDING_BYTE lies 
f2b0: 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72 65  on the page dire
f2c0: 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 65  ctly after the e
f2d0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  nd of the.** fil
f2e0: 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72  e, then consider
f2f0: 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74 20   this page part 
f300: 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e  of the file too.
f310: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
f320: 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  .** PENDING_BYTE
f330: 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28 74   is byte 4096 (t
f340: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
f350: 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68 65   page 5) and the
f360: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
f370: 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79 74  file is 4096 byt
f380: 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65  es, 5 is returne
f390: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a  d instead of 4..
f3a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
f3b0: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61  ger_pagecount(Pa
f3c0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
f3d0: 69 36 34 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  i64 n;.  assert(
f3e0: 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
f3f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
f400: 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ze>=0 ){.    n =
f410: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
f420: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
f430: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 2e 78 46  if( sqlite3Io.xF
f440: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
f450: 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45  >fd, &n)!=SQLITE
f460: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
f470: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
f480: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a  PAGER_ERR_DISK;.
f490: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
f4a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
f4b0: 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70  0 && n<pPager->p
f4c0: 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
f4d0: 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73   n = 1;.    }els
f4e0: 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50  e{.      n /= pP
f4f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
f500: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
f510: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
f520: 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
f530: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
f540: 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = n;.    }.  }
f550: 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49  .  if( n==(PENDI
f560: 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
f570: 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
f580: 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   n++;.  }.  retu
f590: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn n;.}../*.** F
f5a0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
f5b0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
f5c0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
f5d0: 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e  er*);.../*.** Un
f5e0: 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74  link pPg from it
f5f0: 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  's hash chain. A
f600: 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61 67 65  lso set the page
f610: 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20   number to 0 to 
f620: 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74  indicate.** that
f630: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
f640: 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
f650: 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73  h chain. This is
f660: 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73   required becaus
f670: 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  e the.** sqlite3
f680: 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 29  pager_movepage()
f690: 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61   routine can lea
f6a0: 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  ve a page in the
f6b0: 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70   .** pNextFree/p
f6c0: 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74 68  PrevFree list th
f6d0: 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74  at is not a part
f6e0: 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61   of any hash-cha
f6f0: 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
f700: 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  id unlinkHashCha
f710: 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
f720: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
f730: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
f740: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
f750: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
f760: 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  s zero, then thi
f770: 73 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  s page is not in
f780: 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e   any hash chain.
f790: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
f7a0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
f7b0: 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
f7c0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
f7d0: 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
f7e0: 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a  >pPrevHash;.  }.
f7f0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
f800: 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65  Hash ){.    asse
f810: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
f820: 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 50 67  h[pager_hash(pPg
f830: 2d 3e 70 67 6e 6f 29 5d 21 3d 70 50 67 20 29 3b  ->pgno)]!=pPg );
f840: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
f850: 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  ash->pNextHash =
f860: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
f870: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
f880: 74 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68  t h = pager_hash
f890: 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  (pPg->pgno);.   
f8a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f8b0: 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29  >aHash[h]==pPg )
f8c0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
f8d0: 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e  ash[h] = pPg->pN
f8e0: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 0a 20 20  extHash;.  }..  
f8f0: 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
f900: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
f910: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
f920: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   = 0;.}../*.** U
f930: 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f  nlink a page fro
f940: 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
f950: 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c  (the list of all
f960: 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
f970: 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f  f==0).** and fro
f980: 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69  m its hash colli
f990: 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73  sion chain..*/.s
f9a0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
f9b0: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
f9c0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
f9d0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
f9e0: 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65  ;..  /* Keep the
f9f0: 20 70 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f   pFirstSynced po
fa00: 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61  inter pointing a
fa10: 74 20 74 68 65 20 66 69 72 73 74 20 73 79 6e 63  t the first sync
fa20: 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f  hronized page */
fa30: 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67  .  if( pPg==pPag
fa40: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
fa50: 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
fa60: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
fa70: 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20  e;.    while( p 
fa80: 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
fa90: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
faa0: 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72  ee; }.    pPager
fab0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
fac0: 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   p;.  }..  /* Un
fad0: 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72  link from the fr
fae0: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20  eelist */.  if( 
faf0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
fb00: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  {.    pPg->pPrev
fb10: 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
fb20: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
fb30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
fb40: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
fb50: 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  First==pPg );.  
fb60: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
fb70: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
fb80: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  e;.  }.  if( pPg
fb90: 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
fba0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
fbb0: 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
fbc0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
fbd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
fbe0: 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  rt( pPager->pLas
fbf0: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
fc00: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
fc10: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
fc20: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  }.  pPg->pNextFr
fc30: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
fc40: 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55  ree = 0;..  /* U
fc50: 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70  nlink from the p
fc60: 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a  gno hash table *
fc70: 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
fc80: 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
fc90: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
fca0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
fcb0: 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  B./*.** This rou
fcc0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
fcd0: 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d  truncate an in-m
fce0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
fcf0: 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70   Delete.** all p
fd00: 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20  ages whose pgno 
fd10: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  is larger than p
fd20: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
fd30: 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
fd40: 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64  d..** Referenced
fd50: 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68   pages larger th
fd60: 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
fd70: 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f  e are zeroed..*/
fd80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
fd90: 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61 67 65  oryTruncate(Page
fda0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
fdb0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64  Hdr *pPg;.  PgHd
fdc0: 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20  r **ppPg;.  int 
fdd0: 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
fde0: 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67  >dbSize;..  ppPg
fdf0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c   = &pPager->pAll
fe00: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  ;.  while( (pPg 
fe10: 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20  = *ppPg)!=0 ){. 
fe20: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
fe30: 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  <=dbSize ){.    
fe40: 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
fe50: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
fe60: 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  se if( pPg->nRef
fe70: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
fe80: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
fe90: 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
fea0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
feb0: 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
fec0: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
fed0: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67  lse{.      *ppPg
fee0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
fef0: 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  ;.      unlinkPa
ff00: 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  ge(pPg);.      s
ff10: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
ff20: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
ff30: 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
ff40: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
ff50: 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
ff60: 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  p).#endif../*.**
ff70: 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
ff80: 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e   lock on a file.
ff90: 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73    Invoke the bus
ffa0: 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
ffb0: 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72  e lock.** is cur
ffc0: 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
ffd0: 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e  able.  Repeat un
ffe0: 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
fff0: 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a  lback returns.**
10000 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
10010 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
10020 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
10030 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
10040 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
10050 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
10060 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
10070 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
10080 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
10090 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
100a0 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
100b0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
100c0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
100d0 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
100e0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
100f0 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
10100 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
10110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
10120 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
10130 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
10140 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10150 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
10160 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10170 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
10180 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
10190 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 4c 6f 63  = sqlite3Io.xLoc
101a0 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  k(&pPager->fd, l
101b0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
101c0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
101d0 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33  _BUSY && sqlite3
101e0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
101f0 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
10200 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69  andler) );.    i
10210 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10220 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10230 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79  ->state = lockty
10240 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pe;.    }.  }.  
10250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10260 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
10270 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
10280 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
10290 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
102a0 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
102b0 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
102c0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
102d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
102e0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
102f0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
10300 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
10310 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
10320 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
10330 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
10340 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
10350 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e  ( nPage>=(unsign
10360 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
10370 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10380 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10390 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
103a0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
103b0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
103c0 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
103d0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
103e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
103f0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
10400 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
10410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10420 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10430 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
10440 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
10450 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
10460 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
10470 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ing. */.  rc = p
10480 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
10490 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
104a0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  IVE_LOCK);.  if(
104b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
104c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
104d0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67  .  }..  rc = pag
104e0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
104f0 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66  er, nPage);.  if
10500 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10510 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
10520 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
10530 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10540 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
10550 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
10560 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
10570 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
10580 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
10590 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
105a0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
105b0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
105c0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
105d0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
105e0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
105f0 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
10600 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
10610 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
10620 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
10630 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
10640 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
10650 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
10660 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
10670 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
10680 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
10690 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
106a0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
106b0 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  mp..*/.int sqlit
106c0 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61  e3pager_close(Pa
106d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
106e0 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
106f0 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50  xt;.  switch( pP
10700 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20  ager->state ){. 
10710 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
10720 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SERVED:.    case
10730 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a   PAGER_SYNCED: .
10740 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45      case PAGER_E
10750 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20  XCLUSIVE: {.    
10760 20 20 2f 2a 20 57 65 20 69 67 6e 6f 72 65 20 61    /* We ignore a
10770 6e 79 20 49 4f 20 65 72 72 6f 72 73 20 74 68 61  ny IO errors tha
10780 74 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74  t occur during t
10790 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  he rollback.    
107a0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20    ** operation. 
107b0 53 6f 20 64 69 73 61 62 6c 65 20 49 4f 20 65 72  So disable IO er
107c0 72 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73  ror simulation s
107d0 6f 20 74 68 61 74 20 74 65 73 74 69 6e 67 0a 20  o that testing. 
107e0 20 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f       ** works mo
107f0 72 65 20 65 61 73 69 6c 79 2e 0a 20 20 20 20 20  re easily..     
10800 20 2a 2f 0a 20 20 20 20 20 20 64 69 73 61 62 6c   */.      disabl
10810 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
10820 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 20 20 73  rrors();.      s
10830 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
10840 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
10850 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
10860 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10870 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d  ;.      if( !MEM
10880 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  DB ){.        sq
10890 6c 69 74 65 33 49 6f 2e 78 55 6e 6c 6f 63 6b 28  lite3Io.xUnlock(
108a0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
108b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
108c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
108d0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20  ger->errMask || 
108e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
108f0 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pen==0 );.      
10900 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10910 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52   case PAGER_SHAR
10920 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ED: {.      if( 
10930 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
10940 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 55 6e 6c    sqlite3Io.xUnl
10950 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
10960 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
10970 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10980 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
10990 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
109a0 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
109b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
109c0 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61   }.  for(pPg=pPa
109d0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
109e0 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e  pPg=pNext){.#ifn
109f0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69  def NDEBUG.    i
10a00 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
10a10 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
10a20 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
10a30 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
10a40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
10a50 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
10a60 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
10a70 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
10a80 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
10a90 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
10aa0 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
10ab0 66 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  f.    pNext = pP
10ac0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
10ad0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
10ae0 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22  ;.  }.  TRACE2("
10af0 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
10b00 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
10b10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10b20 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 28 70 50 61  >errMask || (pPa
10b30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
10b40 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
10b50 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20  tmtOpen==0) );. 
10b60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
10b70 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
10b80 73 71 6c 69 74 65 33 49 6f 2e 78 43 6c 6f 73 65  sqlite3Io.xClose
10b90 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
10ba0 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
10bb0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
10bc0 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nal);.  if( pPag
10bd0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
10be0 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 43      sqlite3Io.xC
10bf0 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
10c00 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
10c10 65 33 49 6f 2e 78 43 6c 6f 73 65 28 26 70 50 61  e3Io.xClose(&pPa
10c20 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54  ger->fd);.  /* T
10c30 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75  emp files are au
10c40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
10c50 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20  ted by the OS.  
10c60 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  ** if( pPager->t
10c70 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20  empFile ){.  ** 
10c80 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 44 65 6c    sqlite3Io.xDel
10c90 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
10ca0 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
10cb0 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 46 72 65   */..  sqliteFre
10cc0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
10cd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10ce0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
10cf0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
10d00 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
10d10 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
10d20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
10d30 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
10d40 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
10d50 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
10d60 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
10d70 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
10d80 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
10d90 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
10da0 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
10db0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
10dc0 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
10dd0 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
10de0 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
10df0 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
10e00 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
10e10 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
10e20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
10e30 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
10e40 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
10e50 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
10e60 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
10e70 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
10e80 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
10e90 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
10ea0 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
10eb0 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
10ec0 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
10ed0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
10ee0 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
10ef0 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
10f00 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
10f10 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
10f20 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
10f30 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
10f40 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
10f50 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
10f60 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
10f70 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
10f80 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
10f90 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
10fa0 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
10fb0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
10fc0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10fd0 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
10fe0 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
10ff0 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
11000 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
11010 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
11020 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
11030 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
11040 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
11050 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
11060 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
11070 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
11080 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
11090 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
110a0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
110b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
110c0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
110d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
110e0 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
110f0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
11100 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
11110 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
11120 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
11130 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
11140 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
11150 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
11160 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
11170 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
11180 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11190 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
111a0 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
111b0 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
111c0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
111d0 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
111e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
111f0 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
11200 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70  .      REFINFO(p
11210 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Pg);.    }.  }.#
11220 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
11230 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
11240 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
11250 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
11260 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
11270 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
11280 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
11290 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
112a0 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
112b0 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
112c0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
112d0 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
112e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
112f0 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
11300 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
11310 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
11320 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  a);.  page_ref(p
11330 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
11340 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11350 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
11360 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
11370 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
11380 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
11390 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
113a0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
113b0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
113c0 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
113d0 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
113e0 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
113f0 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
11400 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
11410 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
11420 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
11430 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
11440 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
11450 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
11460 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
11470 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
11480 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
11490 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
114a0 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
114b0 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
114c0 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
114d0 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
114e0 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
114f0 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
11500 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
11510 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
11520 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
11530 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
11540 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
11550 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
11560 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
11570 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
11580 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
11590 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
115a0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
115b0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
115c0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
115d0 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
115e0 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
115f0 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
11600 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
11610 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
11620 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
11630 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
11640 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
11650 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
11660 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
11670 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
11680 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
11690 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
116a0 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
116b0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
116c0 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
116d0 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
116e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
116f0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
11700 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
11710 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
11720 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
11730 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
11740 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
11750 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
11760 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
11770 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11780 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
11790 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
117a0 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
117b0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
117c0 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
117d0 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
117e0 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
117f0 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
11800 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
11810 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
11820 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
11830 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
11840 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11850 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
11860 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
11870 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
11880 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
11890 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
118a0 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
118b0 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
118c0 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
118d0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
118e0 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
118f0 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
11900 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
11910 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
11920 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
11930 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
11940 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
11950 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
11960 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
11970 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
11980 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
11990 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
119a0 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
119b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
119c0 6c 69 74 65 33 49 6f 2e 78 46 69 6c 65 53 69 7a  lite3Io.xFileSiz
119d0 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
119e0 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  &jSz);.        i
119f0 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
11a00 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73  n rc;.        as
11a10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
11a20 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b  urnalOff==jSz );
11a30 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
11a40 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
11a50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
11a60 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
11a70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
11a80 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
11a90 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
11aa0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
11ab0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
11ac0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
11ad0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
11ae0 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
11af0 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
11b00 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
11b10 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
11b20 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
11b30 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
11b40 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20  for rollback. . 
11b50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
11b60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
11b70 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
11b80 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43      TRACE2("SYNC
11b90 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
11ba0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
11bb0 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  r));.          r
11bc0 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 53  c = sqlite3Io.xS
11bd0 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
11be0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
11bf0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
11c00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
11c10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11c20 6c 69 74 65 33 49 6f 2e 78 53 65 65 6b 28 26 70  lite3Io.xSeek(&p
11c30 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20  Pager->jfd,.    
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c50 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
11c60 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
11c70 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
11c80 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
11c90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
11ca0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
11cb0 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
11cc0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
11cd0 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
11ce0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
11cf0 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
11d00 73 71 6c 69 74 65 33 49 6f 2e 78 53 65 65 6b 28  sqlite3Io.xSeek(
11d10 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
11d20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11d30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
11d40 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
11d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
11d60 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
11d70 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
11d80 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
11d90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11da0 49 6f 2e 78 53 79 6e 63 28 26 70 50 61 67 65 72  Io.xSync(&pPager
11db0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  ->jfd, pPager->f
11dc0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  ullSync);.      
11dd0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
11de0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61  rn rc;.      pPa
11df0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
11e00 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
11e10 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
11e20 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
11e30 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
11e40 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
11e50 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
11e60 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
11e70 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
11e80 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
11e90 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
11ea0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
11eb0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
11ec0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
11ed0 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
11ee0 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
11ef0 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61  G.  /* If the Pa
11f00 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
11f10 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
11f20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
11f30 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73  nc.  ** flag mus
11f40 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20  t also be clear 
11f50 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20  for all pages.  
11f60 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
11f70 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20  .  ** invariant 
11f80 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  is true..  */.  
11f90 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50  else{.    for(pP
11fa0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
11fb0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
11fc0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61  extAll){.      a
11fd0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
11fe0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Sync==0 );.    }
11ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12000 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
12010 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  d==pPager->pFirs
12020 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
12030 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12040 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c  ./*.** Given a l
12050 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f  ist of pages (co
12060 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50  nnected by the P
12070 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
12080 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76  ter) write.** ev
12090 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ery one of those
120a0 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68   pages out to th
120b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
120c0 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c  and mark them al
120d0 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a  l.** as clean..*
120e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
120f0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
12100 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  t(PgHdr *pList){
12110 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
12120 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
12130 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
12140 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12150 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
12160 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
12170 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
12180 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
12190 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
121a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
121b0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
121c0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
121d0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
121e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
121f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12200 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
12210 69 74 65 33 49 6f 2e 78 4c 6f 63 6b 28 29 20 61  ite3Io.xLock() a
12220 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
12230 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
12240 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
12250 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
12260 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
12270 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
12280 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
12290 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
122a0 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
122b0 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
122c0 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
122d0 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
122e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
122f0 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
12300 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
12310 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
12320 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
12330 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
12340 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
12350 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
12360 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
12370 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
12380 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
12390 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
123a0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
123b0 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
123c0 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
123d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
123e0 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
123f0 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
12400 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
12410 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
12420 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
12430 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
12440 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
12450 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
12460 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
12470 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
12480 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12490 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
124a0 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
124b0 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
124c0 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
124d0 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
124e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
124f0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
12500 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
12510 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
12530 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
12540 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
12550 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
12560 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
12570 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78  rc = sqlite3Io.x
12580 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
12590 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
125a0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
125b0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
125c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
125d0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ;.    /* If ther
125e0 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
125f0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
12600 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
12610 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
12620 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
12630 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
12640 6e 73 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ns sqlite3pager_
12650 74 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63  truncate() was c
12660 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
12670 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
12680 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
12690 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
126a0 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
126b0 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
126c0 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
126d0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
126e0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
126f0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
12700 7a 65 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  ze ){.      CODE
12710 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
12720 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
12730 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
12740 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53  .      TRACE3("S
12750 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
12760 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
12770 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
12780 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12790 6c 69 74 65 33 49 6f 2e 78 57 72 69 74 65 28 26  lite3Io.xWrite(&
127a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
127b0 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
127c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
127d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
127e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
127f0 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
12800 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
12810 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
12820 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  t->pgno, 0);.   
12830 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61     TEST_INCR(pPa
12840 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
12850 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
12860 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
12870 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f     TRACE3("NOSTO
12880 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
12890 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
128a0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
128b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
128c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
128d0 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d  n rc;.    pList-
128e0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64  >dirty = 0;.#ifd
128f0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
12900 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
12910 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
12920 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
12930 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
12940 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
12950 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
12960 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12970 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
12980 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
12990 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
129a0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
129b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
129c0 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
129d0 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
129e0 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
129f0 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
12a00 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
12a10 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
12a20 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
12a30 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
12a40 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
12a50 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70   *p, *pList;.  p
12a60 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
12a70 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
12a80 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
12a90 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69  ){.    if( p->di
12aa0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  rty ){.      p->
12ab0 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a  pDirty = pList;.
12ac0 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b        pList = p;
12ad0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12ae0 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
12af0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
12b00 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
12b10 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
12b20 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
12b30 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
12b40 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
12b50 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
12b60 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
12b70 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
12b80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12b90 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
12ba0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
12bb0 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
12bc0 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
12bd0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
12be0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
12bf0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
12c00 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
12c10 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
12c20 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
12c30 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
12c40 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
12c50 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
12c60 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
12c70 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
12c80 73 71 6c 69 74 65 33 49 6f 2e 78 46 69 6c 65 45  sqlite3Io.xFileE
12c90 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
12ca0 6f 75 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e  ournal) ) return
12cb0 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
12cc0 33 49 6f 2e 78 43 68 65 63 6b 52 65 73 65 72 76  3Io.xCheckReserv
12cd0 65 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  edLock(&pPager->
12ce0 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  fd) ) return 0;.
12cf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67    if( sqlite3pag
12d00 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
12d10 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ger)==0 ){.    s
12d20 71 6c 69 74 65 33 49 6f 2e 78 44 65 6c 65 74 65  qlite3Io.xDelete
12d30 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
12d40 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  l);.    return 0
12d50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
12d60 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
12d70 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
12d80 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  page..**.** A re
12d90 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
12da0 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61  isk file is obta
12db0 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  ined when the fi
12dc0 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75  rst page is acqu
12dd0 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72  ired. .** This r
12de0 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70  ead lock is drop
12df0 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ped when the las
12e00 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
12e10 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74  ed..**.** A _get
12e20 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
12e30 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
12e40 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
12e50 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
12e60 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
12e70 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
12e80 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
12e90 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
12ea0 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
12eb0 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
12ec0 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
12ed0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
12ee0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
12ef0 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
12f00 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
12f10 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
12f20 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
12f30 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
12f40 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
12f50 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
12f60 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
12f70 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
12f80 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
12f90 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
12fa0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
12fb0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
12fc0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
12fd0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
12fe0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
12ff0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61  e also sqlite3pa
13000 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42  ger_lookup().  B
13010 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
13020 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61   and _lookup() a
13030 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
13040 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
13050 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
13060 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
13070 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
13080 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
13090 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
130a0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
130b0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
130c0 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75   _lookup().** ju
130d0 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
130e0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
130f0 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
13100 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
13110 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
13120 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
13130 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
13140 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
13150 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
13160 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29   Since _lookup()
13170 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
13180 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
13190 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
131a0 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
131b0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
131c0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
131d0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
131e0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
131f0 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67   **ppPage){.  Pg
13200 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
13210 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  rc;..  /* The ma
13220 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
13230 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
13240 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
13250 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20   if a page.  ** 
13260 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
13270 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72  han this, or zer
13280 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  o, is requested.
13290 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
132a0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
132b0 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  || pgno==0 || pg
132c0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
132d0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
132e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
132f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
13300 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
13310 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
13320 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
13330 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
13340 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
13350 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
13360 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
13370 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
13380 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
13390 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
133a0 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
133b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
133c0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
133d0 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
133e0 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44  hen get a SHARED
133f0 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68   lock.  ** on th
13400 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
13410 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
13420 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
13430 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66 28  MEMDB ){.    if(
13440 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
13450 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63  lock ){.      rc
13460 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
13470 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
13480 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
13490 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
134a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
134b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
134c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
134d0 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
134e0 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
134f0 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
13500 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
13510 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
13520 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
13530 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
13540 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
13550 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
13560 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75     if( hasHotJou
13570 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  rnal(pPager) ){.
13580 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a         int rc;..
13590 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e         /* Get an
135a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
135b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
135c0 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
135d0 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
135e0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
135f0 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
13600 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
13610 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
13620 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45   the.       ** E
13630 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
13640 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
13650 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
13660 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
13670 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
13680 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
13690 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
136a0 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
136b0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74  he.       ** dat
136c0 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
136d0 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
136e0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
136f0 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
13700 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
13710 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
13720 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
13730 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
13740 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
13750 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
13760 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64         ** second
13770 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65   process will ge
13780 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20  t to this point 
13790 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
137a0 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a  fail to.       *
137b0 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77  * obtain it's ow
137c0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
137d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
137e0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f   file..       */
137f0 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .       rc = sql
13800 69 74 65 33 49 6f 2e 78 4c 6f 63 6b 28 26 70 50  ite3Io.xLock(&pP
13810 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
13820 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
13830 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13840 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
13850 73 71 6c 69 74 65 33 49 6f 2e 78 55 6e 6c 6f 63  sqlite3Io.xUnloc
13860 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
13870 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  O_LOCK);.       
13880 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
13890 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
138a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
138b0 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
138c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
138d0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
138e0 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  IVE;..       /* 
138f0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
13900 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
13910 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
13920 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
13930 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
13940 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
13950 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
13960 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a      **.       **
13970 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
13980 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
13990 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
139a0 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
139b0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
139c0 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75   is never open u
139d0 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64  nless the main d
139e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
139f0 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77  ds.       ** a w
13a00 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68  rite lock, so th
13a10 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
13a20 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f   chance of two o
13a30 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a  r more.       **
13a40 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
13a50 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
13a60 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
13a70 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
13a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f    rc = sqlite3Io
13a90 2e 78 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70  .xOpenReadOnly(p
13aa0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
13ab0 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a   &pPager->jfd);.
13ac0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
13ad0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13ae0 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e 78       sqlite3Io.x
13af0 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
13b00 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
13b10 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
13b20 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
13b30 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65  OCK;.         re
13b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
13b50 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
13b60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13b70 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
13b80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13b90 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
13ba0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13bb0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
13bc0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
13bd0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
13be0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13bf0 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20  lHdr = 0;..     
13c00 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
13c10 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
13c20 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
13c30 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
13c40 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
13c50 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
13c60 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
13c70 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
13c80 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
13c90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
13ca0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13cb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65  K ){.         re
13cc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
13cd0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
13ce0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
13cf0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
13d00 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f  page in cache */
13d10 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
13d20 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
13d30 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d  pgno);.    if( M
13d40 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
13d50 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
13d60 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
13d70 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
13d80 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
13d90 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
13da0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
13db0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
13dc0 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67  s not in the pag
13dd0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
13de0 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f  int h;.    TEST_
13df0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
13e00 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ss);.    if( pPa
13e10 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
13e20 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61  r->mxPage || pPa
13e30 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c  ger->pFirst==0 |
13e40 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  | MEMDB ){.     
13e50 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
13e60 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70   page */.      p
13e70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Pg = sqliteMallo
13e80 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50  cRaw( sizeof(*pP
13e90 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67  g) + pPager->pag
13ea0 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  eSize.          
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
13ed0 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
13ee0 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f00 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
13f10 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20  PgHistory) );.  
13f20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
13f30 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
13f40 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
13f50 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20  ER_ERR_MEM;.    
13f60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13f70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
13f80 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
13f90 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
13fa0 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  g));.      if( M
13fb0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
13fc0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
13fd0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
13fe0 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48  ), 0, sizeof(PgH
13ff0 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20  istory));.      
14000 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
14010 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
14020 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c      pPg->pNextAl
14030 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  l = pPager->pAll
14040 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
14050 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
14060 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
14070 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  +;.      if( pPa
14080 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65  ger->nPage>pPage
14090 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20  r->nMaxPage ){. 
140a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
140b0 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d  Pager->nMaxPage=
140c0 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d  =(pPager->nPage-
140d0 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  1) );.        pP
140e0 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b  ager->nMaxPage++
140f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14100 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  lse{.      /* Fi
14110 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63  nd a page to rec
14120 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f  ycle.  Try to lo
14130 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74  cate a page that
14140 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20   does not.      
14150 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f  ** require us to
14160 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f   do an fsync() o
14170 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20  n the journal.. 
14180 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
14190 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
141a0 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20  stSynced;..     
141b0 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20   /* If we could 
141c0 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20  not find a page 
141d0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
141e0 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29  quire an fsync()
141f0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
14200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
14210 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75  en fsync the jou
14220 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73  rnal file.  This
14230 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76   is a.      ** v
14240 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69  ery slow operati
14250 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68  on, so we work h
14260 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e  ard to avoid it.
14270 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a    But sometimes.
14280 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27        ** it can'
14290 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20  t be helped..   
142a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
142b0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
142c0 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a    int rc = syncJ
142d0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
142e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
142f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
14300 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
14310 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
14320 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14330 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
14340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
14350 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
14360 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
14370 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
14380 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  ync mode, write 
14390 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65  a new journal he
143a0 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 09 20  ader into the.. 
143b0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
143c0 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
143d0 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
143e0 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
143f0 0a 09 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68  ..  ** header th
14400 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  at is involved i
14410 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f  n the rollback o
14420 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
14430 65 0a 09 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  e..  ** already 
14440 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
14450 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
14460 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
14470 20 69 73 0a 09 20 20 2a 2a 20 74 72 61 73 68 65   is..  ** trashe
14480 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20  d when the nRec 
14490 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
144a0 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  )..          */.
144b0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
144c0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
144d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
144e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
144f0 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20   > 0 );.        
14500 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
14510 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
14520 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
14530 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
14540 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
14550 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
14560 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
14570 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14580 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
14590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
145a0 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
145b0 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  First;.      }. 
145c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
145d0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
145e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
145f0 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74   page to the dat
14600 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74  abase file if it
14610 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20 20 20   is dirty..     
14620 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
14630 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
14640 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
14650 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
14660 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69          pPg->pDi
14670 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rty = 0;.       
14680 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
14690 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20  e_pagelist( pPg 
146a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
146b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
146c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
146d0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
146e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
146f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14700 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
14710 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14720 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
14730 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ty==0 );..      
14740 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77  /* If the page w
14750 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20  e are recycling 
14760 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  is marked as alw
14770 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  aysRollback, the
14780 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  n.      ** set t
14790 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
147a0 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
147b0 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
147c0 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
147d0 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e_dont_rollback(
147e0 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  ) optimization f
147f0 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  or the rest of t
14800 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
14810 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
14820 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
14830 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
14840 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
14850 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  aysRollback.    
14860 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
14870 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
14880 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
14890 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
148a0 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 20  t remember.     
148b0 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
148c0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
148d0 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
148e0 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
148f0 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  s must.      ** 
14900 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  be marked as alw
14910 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  aysRollback from
14920 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20   here on out..  
14930 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
14940 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
14950 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
14960 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
14970 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
14980 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e    }..      /* Un
14990 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
149a0 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
149b0 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
149c0 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f  h table.      */
149d0 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
149e0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 54 45  e(pPg);.      TE
149f0 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
14a00 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  nOvfl);.    }.  
14a10 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
14a20 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  no;.    if( pPag
14a30 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
14a40 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
14a50 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
14a60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14a70 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
14a80 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
14a90 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
14aa0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
14ab0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
14ac0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
14ad0 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
14ae0 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
14af0 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
14b00 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
14b10 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
14b20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14b30 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
14b40 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
14b50 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
14b60 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
14b70 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69  r->aInStmt && (i
14b80 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
14b90 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20  >stmtSize.      
14ba0 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65         && (pPage
14bb0 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f  r->aInStmt[pgno/
14bc0 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
14bd0 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
14be0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
14bf0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
14c00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
14c10 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
14c20 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
14c30 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72    }.    pPg->dir
14c40 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ty = 0;.    pPg-
14c50 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
14c60 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
14c70 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
14c80 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68  .    h = pager_h
14c90 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ash(pgno);.    p
14ca0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
14cb0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
14cc0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
14cd0 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
14ce0 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
14cf0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
14d00 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
14d10 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
14d20 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
14d30 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
14d40 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
14d50 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
14d60 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
14d70 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
14d80 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
14d90 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
14da0 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
14db0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
14dc0 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
14dd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61  .      sqlite3pa
14de0 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f  ger_unref(PGHDR_
14df0 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20  TO_DATA(pPg));. 
14e00 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
14e10 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
14e20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
14e30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14e40 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
14e50 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3c 28  ecount(pPager)<(
14e60 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20  int)pgno ){.    
14e70 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
14e80 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
14e90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14ea0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14eb0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
14ec0 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d    assert( MEMDB=
14ed0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
14ee0 20 73 71 6c 69 74 65 33 49 6f 2e 78 53 65 65 6b   sqlite3Io.xSeek
14ef0 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
14f00 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
14f10 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
14f20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14f40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f    rc = sqlite3Io
14f50 2e 78 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  .xRead(&pPager->
14f60 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
14f70 41 28 70 50 67 29 2c 0a 20 20 20 20 20 20 20 20  A(pPg),.        
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
14fa0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
14fb0 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 46  .      TRACE3("F
14fc0 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
14fd0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
14fe0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
14ff0 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
15000 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
15010 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
15020 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66  no, 3);.      if
15030 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15040 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 66  ){.        i64 f
15050 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ileSize;.       
15060 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 2e 78   if( sqlite3Io.x
15070 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
15080 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21  ->fd,&fileSize)!
15090 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
150a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c            || fil
150b0 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67  eSize>=pgno*pPag
150c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
150d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
150e0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
150f0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
15100 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
15110 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
15120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15130 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f  clear_simulated_
15140 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20  io_error();.    
15150 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
15160 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
15170 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
15180 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
15190 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
151a0 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28        TEST_INCR(
151b0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
151c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
151d0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
151e0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
151f0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
15200 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
15210 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
15220 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
15230 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
15240 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
15250 20 2a 2f 0a 20 20 20 20 54 45 53 54 5f 49 4e 43   */.    TEST_INC
15260 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
15270 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
15280 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
15290 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  e = PGHDR_TO_DAT
152a0 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  A(pPg);.  return
152b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
152c0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
152d0 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
152e0 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
152f0 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
15300 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
15310 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
15320 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
15330 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
15340 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
15350 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
15360 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
15370 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
15380 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  _get().  The dif
15390 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
153a0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
153b0 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  and sqlite3pager
153c0 5f 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  _get() is that _
153d0 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
153e0 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
153f0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
15400 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
15410 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
15420 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
15430 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
15440 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
15450 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
15460 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
15470 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
15480 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
15490 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70  /.void *sqlite3p
154a0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
154b0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
154c0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
154d0 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
154e0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
154f0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
15500 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
15510 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
15520 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
15530 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
15540 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
15550 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
15560 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
15570 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
15580 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
15590 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
155a0 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
155b0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
155c0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
155d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
155e0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
155f0 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
15600 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
15610 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
15620 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
15630 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
15640 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
15650 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
15660 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
15670 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
15680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
15690 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
156a0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
156b0 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  _unref(void *pDa
156c0 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
156d0 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  g;..  /* Decreme
156e0 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
156f0 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
15700 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20  page.  */.  pPg 
15710 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
15720 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
15730 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
15740 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
15750 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
15760 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
15770 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
15780 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
15790 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
157a0 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
157b0 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
157c0 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
157d0 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
157e0 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
157f0 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
15800 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
15810 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
15820 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
15830 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
15840 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
15850 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
15860 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
15870 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
15880 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
15890 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
158a0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
158b0 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
158c0 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
158d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
158e0 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
158f0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
15900 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
15910 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
15920 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
15930 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
15940 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
15950 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15960 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
15970 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
15980 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
15990 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
159a0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
159b0 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
159c0 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
159d0 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
159e0 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
159f0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
15a00 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
15a10 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
15a20 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
15a30 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
15a40 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
15a50 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45  ->nRef==0 && !ME
15a60 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67  MDB ){.      pag
15a70 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
15a80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
15a90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
15ab0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
15ac0 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
15ad0 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
15ae0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
15af0 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
15b00 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
15b10 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
15b20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
15b30 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
15b40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
15b50 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
15b60 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
15b70 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
15b80 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
15b90 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
15ba0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
15bb0 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
15bc0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
15bd0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
15be0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
15bf0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
15c00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15c10 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
15c20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
15c30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
15c40 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15c50 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
15c60 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
15c70 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
15c80 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
15c90 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
15ca0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
15cb0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
15cc0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
15cd0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
15ce0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
15cf0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
15d00 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
15d10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15d20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
15d30 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
15d40 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
15d50 33 49 6f 2e 78 4f 70 65 6e 45 78 63 6c 75 73 69  3Io.xOpenExclusi
15d60 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ve(pPager->zJour
15d70 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
15d80 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70      pPager->temp
15db0 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  File);.  pPager-
15dc0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
15dd0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
15de0 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
15df0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
15e00 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
15e10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
15e20 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
15e30 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
15e40 20 20 53 45 54 5f 46 55 4c 4c 53 59 4e 43 28 70    SET_FULLSYNC(p
15e50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
15e60 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  er->fullSync);. 
15e70 20 53 45 54 5f 46 55 4c 4c 53 59 4e 43 28 70 50   SET_FULLSYNC(pP
15e80 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
15e90 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73  ->fullSync);.  s
15ea0 71 6c 69 74 65 33 49 6f 2e 78 4f 70 65 6e 44 69  qlite3Io.xOpenDi
15eb0 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e  rectory(pPager->
15ec0 7a 44 69 72 65 63 74 6f 72 79 2c 20 26 70 50 61  zDirectory, &pPa
15ed0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61  ger->jfd);.  pPa
15ee0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
15ef0 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
15f00 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
15f10 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
15f20 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
15f30 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
15f40 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  back = 0;.  pPag
15f50 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
15f60 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
15f70 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
15f80 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
15f90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 67 6f  (pPager);.    go
15fa0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
15fb0 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
15fc0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
15fd0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
15fe0 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72  Size;..  rc = wr
15ff0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
16000 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50  ager);..  if( pP
16010 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
16020 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  en && rc==SQLITE
16030 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
16040 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
16050 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29 3b  t_begin(pPager);
16060 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
16070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16080 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
16090 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
160a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
160b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
160c0 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
160d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
160e0 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
160f0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
16100 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
16110 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
16120 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
16130 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 73  Journal = 0;.  s
16140 71 6c 69 74 65 33 49 6f 2e 78 55 6e 6c 6f 63 6b  qlite3Io.xUnlock
16150 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  (&pPager->fd, NO
16160 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72  _LOCK);.  pPager
16170 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
16180 55 4e 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  UNLOCK;.  return
16190 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
161a0 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
161b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
161c0 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
161d0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
161e0 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
161f0 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
16200 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
16210 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
16220 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
16230 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
16240 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73  er_rollback() is
16250 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
16260 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
16270 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
16280 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
16290 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73  pager_unref() is
162a0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76   called to on ev
162b0 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ery outstanding 
162c0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
162d0 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
162e0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
162f0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
16300 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66  any open page of
16310 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
16320 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20   file.  Nothing 
16330 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68  changes about th
16340 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75  e page - it is u
16350 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a  sed merely to.**
16360 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74   acquire a point
16370 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
16380 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73  structure and as
16390 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72   proof that ther
163a0 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20  e is.** already 
163b0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
163c0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
163d0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61  ** The second pa
163e0 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
163f0 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  s how much space
16400 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73   in bytes to res
16410 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61  erve for a.** ma
16420 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
16430 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74  e-name at the st
16440 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
16450 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72  al when it is cr
16460 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  eated..**.** A j
16470 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
16480 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73  pened if this is
16490 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
164a0 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70   file.  For temp
164b0 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20  orary.** files, 
164c0 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74  the opening of t
164d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
164e0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
164f0 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a  l there is an.**
16500 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
16510 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
16520 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rnal..**.** If t
16530 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
16540 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20  lready reserved 
16550 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69  for writing, thi
16560 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
16570 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  o-op..**.** If e
16580 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67  xFlag is true, g
16590 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74 20  o ahead and get 
165a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
165b0 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  k on the file.**
165c0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73   immediately ins
165d0 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20  tead of waiting 
165e0 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20  until we try to 
165f0 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e  flush the cache.
16600 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20    The.** exFlag 
16610 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20  is ignored if a 
16620 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
16630 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
16640 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
16650 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70  er_begin(void *p
16660 44 61 74 61 2c 20 69 6e 74 20 65 78 46 6c 61 67  Data, int exFlag
16670 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
16680 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
16690 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
166a0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
166b0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
166c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
166d0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
166e0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
166f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
16700 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
16710 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
16720 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
16730 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16740 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
16750 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  al==0 );.    if(
16760 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
16770 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
16780 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
16790 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
167a0 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
167b0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
167c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
167d0 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 4c 6f 63  = sqlite3Io.xLoc
167e0 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  k(&pPager->fd, R
167f0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
16800 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16810 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16820 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
16830 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
16840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
16850 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
16860 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
16870 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
16880 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
16890 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
168a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
168b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
168c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
168d0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
168e0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
168f0 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  che = 0;.      T
16900 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49  RACE2("TRANSACTI
16910 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
16920 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
16930 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
16940 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
16950 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
16960 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
16970 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
16980 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
16990 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
169a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
169b0 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
169c0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
169d0 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
169e0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
169f0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
16a00 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
16a10 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
16a20 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
16a30 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
16a40 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
16a50 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
16a60 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
16a70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
16a80 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
16a90 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
16aa0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
16ab0 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20  ires a RESERVED 
16ac0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
16ad0 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45  base.  If the RE
16ae0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63  SERVED.** lock c
16af0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
16b00 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
16b10 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
16b20 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
16b30 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
16b40 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
16b50 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
16b60 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
16b70 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
16b80 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
16b90 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
16ba0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
16bb0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
16bc0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
16bd0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
16be0 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
16bf0 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
16c00 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
16c10 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
16c20 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
16c30 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
16c40 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
16c50 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
16c60 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
16c70 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
16c80 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
16c90 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
16ca0 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
16cb0 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67 65  ) or sqlite3page
16cc0 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  r_rollback() to.
16cd0 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74  ** reset..*/.int
16ce0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
16cf0 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ite(void *pData)
16d00 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
16d10 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
16d20 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
16d30 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
16d40 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
16d50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
16d60 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
16d70 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
16d80 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b  ager->errMask ){
16d90 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67   .    return pag
16da0 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
16db0 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
16dc0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
16dd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16de0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
16df0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
16e00 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
16e10 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
16e20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
16e30 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
16e40 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
16e50 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
16e60 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
16e70 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
16e80 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
16e90 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
16ea0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
16eb0 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
16ec0 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69  urnal && (pPg->i
16ed0 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d  nStmt || pPager-
16ee0 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
16ef0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
16f00 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
16f10 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
16f20 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
16f30 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
16f40 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
16f50 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
16f60 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
16f70 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
16f80 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
16f90 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
16fa0 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
16fb0 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
16fc0 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
16fd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16fe0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
16ff0 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
17000 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
17010 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
17020 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
17030 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
17040 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
17050 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
17060 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 20  n(pData, 0);.   
17070 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17080 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
17090 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
170a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
170b0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
170c0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
170d0 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
170e0 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
170f0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
17100 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
17110 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
17120 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
17130 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17140 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17150 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
17160 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17170 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73  n || !pPager->us
17180 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
17190 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
171a0 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  he = 1;.  .    /
171b0 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
171c0 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
171d0 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
171e0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
171f0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
17200 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
17210 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
17220 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
17230 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
17240 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
17250 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
17260 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
17270 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
17280 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e      if( !pPg->in
17290 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
172a0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
172b0 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20  | MEMDB) ){.    
172c0 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
172d0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
172e0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
172f0 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a        int szPg;.
17300 20 20 20 20 20 20 20 20 75 33 32 20 73 61 76 65          u32 save
17310 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d  d;.        if( M
17320 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
17330 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
17340 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
17350 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
17360 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
17370 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  3("JOURNAL %d pa
17380 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
17390 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
173a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
173b0 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
173c0 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20  pOrig==0 );.    
173d0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72        pHist->pOr
173e0 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ig = sqliteMallo
173f0 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
17400 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
17410 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
17420 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
17430 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
17440 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54  ->pOrig, PGHDR_T
17450 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
17460 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17470 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17490 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
174a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
174b0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
174c0 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
174d0 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
174e0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
174f0 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
17500 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
17510 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
17520 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
17530 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
17540 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
17550 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17560 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
17570 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
17580 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f   );.          CO
17590 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
175a0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
175b0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75  ;.          cksu
175c0 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
175d0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
175e0 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  o, pData);.     
175f0 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75       saved = *(u
17600 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
17610 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  RA(pPg, pPager);
17620 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
17630 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50  32bits(cksum, pP
17640 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
17650 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
17660 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70  szPg = pPager->p
17670 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20  ageSize+8;.     
17680 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
17690 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
176a0 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -4);.          
176b0 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78  rc = sqlite3Io.x
176c0 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
176d0 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
176e0 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a  ta)[-4], szPg);.
176f0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
17700 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
17710 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20  szPg;.          
17720 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20  TRACE4("JOURNAL 
17730 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
17740 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
17760 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
17770 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
17780 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20  edSync);.       
17790 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
177a0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
177b0 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 0);.         
177c0 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f   *(u32*)PGHDR_TO
177d0 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
177e0 65 72 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20  er) = saved;.   
177f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
17820 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
17830 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
17840 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
17850 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
17860 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  FULL;.          
17870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17890 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
178a0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
178b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
178c0 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
178d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
178e0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
178f0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
17900 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
17910 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
17920 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
17930 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
17940 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17950 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
17960 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
17970 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
17980 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
17990 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
179a0 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
179b0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
179c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
179d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
179e0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d  se{.        pPg-
179f0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
17a00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
17a10 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
17a20 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
17a30 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25  TRACE4("APPEND %
17a40 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
17a50 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
17a60 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
17a70 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
17a80 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
17a90 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ync);.      }.  
17aa0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
17ab0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
17ac0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
17ad0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
17ae0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
17af0 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nal = 1;.    }. 
17b00 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
17b10 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
17b20 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
17b30 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
17b40 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
17b50 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
17b60 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
17b70 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
17b80 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
17b90 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
17ba0 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
17bb0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
17bc0 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
17bd0 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
17be0 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
17bf0 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
17c00 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
17c10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
17c20 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
17c30 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
17c40 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
17c50 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
17c60 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Size ){.      as
17c70 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
17c80 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
17c90 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
17ca0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
17cb0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
17cc0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
17cd0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
17ce0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
17cf0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
17d00 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
17d10 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
17d20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
17d30 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
17d40 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
17d50 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
17d60 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
17d70 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
17d80 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  py(pHist->pStmt,
17d90 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
17da0 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
17db0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
17dc0 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33  }.        TRACE3
17dd0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
17de0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
17df0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
17e00 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
17e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17e20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d  store32bits(pPg-
17e30 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b  >pgno, pPg, -4);
17e40 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
17e50 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
17e60 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
17e70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17e80 33 49 6f 2e 78 57 72 69 74 65 28 26 70 50 61 67  3Io.xWrite(&pPag
17e90 65 72 2d 3e 73 74 66 64 2c 28 28 63 68 61 72 2a  er->stfd,((char*
17ea0 29 70 44 61 74 61 29 2d 34 2c 0a 20 20 20 20 20  )pData)-4,.     
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ec0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
17ed0 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20  ->pageSize+4);. 
17ee0 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53         TRACE3("S
17ef0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
17f00 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
17f10 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
17f20 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
17f30 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
17f40 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17f50 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
17f60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17f70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17f80 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
17f90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
17fa0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
17fb0 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
17fc0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20  _FULL;.         
17fd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
17ff0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
18000 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
18010 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
18020 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
18030 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
18040 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
18050 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
18060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18070 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
18080 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
18090 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
180a0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
180b0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
180c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
180d0 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
180e0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
180f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
18100 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
18110 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
18120 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
18130 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
18140 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
18150 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
18160 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
18170 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18180 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
18190 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
181a0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
181b0 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
181c0 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
181d0 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  o sqlite3pager_w
181e0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
181f0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
18200 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
18210 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
18220 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
18230 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   page..*/.int sq
18240 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
18250 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61  teable(void *pDa
18260 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
18270 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
18280 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
18290 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
182a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
182b0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a  _OMIT_VACUUM./*.
182c0 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
182d0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67  ontent of a sing
182e0 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65  le page with the
182f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
18300 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67  the third.** arg
18310 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
18320 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77  lite3pager_overw
18330 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
18340 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76  er, Pgno pgno, v
18350 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76  oid *pData){.  v
18360 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  oid *pPage;.  in
18370 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  t rc;..  rc = sq
18380 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
18390 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
183a0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
183b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
183c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
183d0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
183e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
183f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18400 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44  memcpy(pPage, pD
18410 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
18420 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
18430 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
18440 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d  nref(pPage);.  }
18450 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18460 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
18470 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
18480 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
18490 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
184a0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
184b0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
184c0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
184d0 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f  e "pgno" back to
184e0 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
184f0 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
18500 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
18510 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a  ked as dirty..**
18520 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
18530 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
18540 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
18550 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
18560 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
18570 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
18580 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61   unused.  The pa
18590 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
185a0 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
185b0 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
185c0 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
185d0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
185e0 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
185f0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  is optimization,
18600 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
18610 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67  he.** sqlite3pag
18620 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
18630 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
18640 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
18650 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
18660 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
18670 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
18680 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
18690 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
186a0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
186b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
186c0 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
186d0 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
186e0 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
186f0 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
18700 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
18710 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
18720 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
18730 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
18740 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
18750 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
18760 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
18770 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
18780 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
18790 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
187a0 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
187b0 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
187c0 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
187d0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
187e0 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
187f0 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
18800 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
18810 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
18820 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
18830 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
18840 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
18850 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
18860 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
18870 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
18880 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
18890 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
188a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
188b0 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
188c0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
188d0 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64  ns.** critical d
188e0 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
188f0 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
18900 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63   gets rolled bac
18910 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66  k in spite.** of
18920 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
18930 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f  ck() call..*/.vo
18940 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
18950 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72  dont_write(Pager
18960 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
18970 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
18980 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  Pg;..  if( MEMDB
18990 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50   ) return;..  pP
189a0 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
189b0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
189c0 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
189d0 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28  lback = 1;.  if(
189e0 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72   pPg && pPg->dir
189f0 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ty ){.    if( pP
18a00 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
18a10 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
18a20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
18a30 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
18a40 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
18a50 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
18a60 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
18a70 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
18a80 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
18a90 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
18aa0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
18ab0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
18ac0 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
18ad0 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
18ae0 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
18af0 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
18b00 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
18b10 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
18b20 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
18b30 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
18b40 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
18b50 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
18b60 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
18b70 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
18b80 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
18b90 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
18ba0 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
18bb0 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
18bc0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
18bd0 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
18be0 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
18bf0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
18c00 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
18c10 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
18c20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
18c30 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
18c40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18c50 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49  TRACE3("DONT_WRI
18c60 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
18c70 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52  \n", pgno, PAGER
18c80 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
18c90 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
18ca0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
18cb0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
18cc0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
18cd0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
18ce0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
18cf0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
18d00 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
18d10 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
18d20 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
18d30 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
18d40 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
18d50 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
18d60 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
18d70 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
18d80 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
18d90 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
18da0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
18db0 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
18dc0 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
18dd0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
18de0 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
18df0 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
18e00 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74  lback(void *pDat
18e10 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
18e20 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
18e30 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
18e40 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
18e50 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70  pPager;..  if( p
18e60 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
18e70 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c  GER_EXCLUSIVE ||
18e80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18e90 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  Open==0 ) return
18ea0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  ;.  if( pPg->alw
18eb0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70  aysRollback || p
18ec0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
18ed0 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29  lback || MEMDB )
18ee0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
18ef0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
18f00 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
18f10 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
18f20 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  DbSize ){.    as
18f30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
18f40 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
18f50 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
18f60 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
18f70 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
18f80 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d  gno&7);.    pPg-
18f90 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
18fa0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18fb0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
18fc0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
18fd0 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
18fe0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
18ff0 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f  &7);.      page_
19000 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
19010 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
19020 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f   TRACE3("DONT_RO
19030 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
19040 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
19050 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
19060 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  er));.  }.  if( 
19070 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
19080 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d  e && !pPg->inStm
19090 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  t && (int)pPg->p
190a0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
190b0 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  tSize ){.    ass
190c0 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
190d0 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
190e0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
190f0 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
19100 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19110 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
19120 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
19130 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
19140 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
19150 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64  7);.    page_add
19160 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
19170 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 6e  g);.  }.}...#ifn
19180 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19190 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43  MEMORYDB./*.** C
191a0 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79  lear a PgHistory
191b0 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63   block.*/.static
191c0 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f   void clearHisto
191d0 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48  ry(PgHistory *pH
191e0 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72  ist){.  sqliteFr
191f0 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29  ee(pHist->pOrig)
19200 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
19210 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
19220 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30  pHist->pOrig = 0
19230 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  ;.  pHist->pStmt
19240 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64   = 0;.}.#else.#d
19250 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f  efine clearHisto
19260 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry(x).#endif../*
19270 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
19280 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
19290 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
192a0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
192b0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
192c0 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
192d0 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
192e0 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
192f0 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
19300 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
19310 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
19320 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
19330 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
19340 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
19350 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
19360 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
19370 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
19380 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
19390 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
193a0 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f  Mask==PAGER_ERR_
193b0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
193c0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
193d0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
193e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
193f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19400 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
19410 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
19420 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
19430 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
19440 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
19450 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
19460 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
19470 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
19480 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
19490 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
194a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
194b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52  _ERROR;.  }.  TR
194c0 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
194d0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
194e0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
194f0 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
19500 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
19510 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
19520 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
19530 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48   ){.      clearH
19540 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
19550 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
19560 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  ));.      pPg->d
19570 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
19580 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
19590 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
195a0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
195b0 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
195c0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
195d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20   = 0;.      pPg 
195e0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
195f0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
19600 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  BUG.    for(pPg=
19610 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
19620 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
19630 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
19640 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
19650 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
19660 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
19670 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
19680 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
19690 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
196a0 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
196b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
196c0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
196d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
196e0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
196f0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
19700 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
19710 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
19720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19730 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69    if( pPager->di
19740 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20  rtyCache==0 ){. 
19750 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79     /* Exit early
19760 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20   (without doing 
19770 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69  the time-consumi
19780 6e 67 20 73 71 6c 69 74 65 33 49 6f 2e 78 53 79  ng sqlite3Io.xSy
19790 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20  nc() calls).    
197a0 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76 65  ** if there have
197b0 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   been no changes
197c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
197d0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73   file. */.    as
197e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
197f0 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
19800 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
19810 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
19820 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
19830 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65  ize = -1;.    re
19840 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
19850 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
19860 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
19870 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
19880 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20 30  r_sync(pPager, 0
19890 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
198a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
198b0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f   goto commit_abo
198c0 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  rt;.  }.  rc = p
198d0 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
198e0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
198f0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
19900 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20  .  return rc;.. 
19910 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
19920 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
19930 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20  rong during the 
19940 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
19950 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72    */.commit_abor
19960 74 3a 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  t:.  sqlite3page
19970 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
19980 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
19990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
199a0 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
199b0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
199c0 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
199d0 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
199e0 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
199f0 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
19a00 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
19a10 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
19a20 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
19a30 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
19a40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19a50 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
19a60 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
19a70 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
19a80 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
19a90 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
19aa0 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45  protocol (SQLITE
19ab0 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e  _PROTOCOL) or un
19ac0 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
19ad0 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
19ae0 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
19af0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
19b00 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
19b10 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
19b20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
19b30 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
19b40 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
19b50 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
19b60 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
19b70 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
19b80 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
19b90 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
19ba0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
19bb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
19bc0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67  ger_rollback(Pag
19bd0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
19be0 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28  nt rc;.  TRACE2(
19bf0 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
19c00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19c10 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
19c20 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
19c30 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
19c40 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
19c50 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
19c60 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
19c70 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
19c80 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
19c90 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
19ca0 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
19cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
19cc0 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
19cd0 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
19ce0 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
19cf0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19d00 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
19d10 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
19d20 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
19d30 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
19d40 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
19d50 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
19d60 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
19d70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
19d80 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
19d90 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
19da0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
19db0 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
19dc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19dd0 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
19de0 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45  3("ROLLBACK-PAGE
19df0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d   %d of %d\n", p-
19e00 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
19e10 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
19e20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52  else{.        TR
19e30 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73  ACE3("PAGE %d is
19e40 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c   clean on %d\n",
19e50 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
19e60 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
19e70 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48    }.      clearH
19e80 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
19e90 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20       p->dirty = 
19ea0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f  0;.      p->inJo
19eb0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
19ec0 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a   p->inStmt = 0;.
19ed0 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74        p->pPrevSt
19ee0 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d  mt = p->pNextStm
19ef0 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  t = 0;..      if
19f00 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
19f10 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ter ){.        p
19f20 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
19f30 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
19f40 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
19f50 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
19f60 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70      .    }.    p
19f70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
19f80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
19f90 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
19fa0 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d  rigDbSize;.    m
19fb0 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
19fc0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
19fd0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
19fe0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
19ff0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1a000 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
1a010 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1a020 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
1a030 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61  rtyCache || !pPa
1a040 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1a050 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1a060 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1a070 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1a080 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1a090 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1a0a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
1a0b0 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26 26  r->errMask!=0 &&
1a0c0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
1a0d0 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  !=PAGER_ERR_FULL
1a0e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1a0f0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1a100 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
1a110 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
1a120 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1a130 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  }.    return pag
1a140 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
1a150 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
1a160 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1a170 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
1a180 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
1a190 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61  rc = pager_reloa
1a1a0 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
1a1b0 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
1a1c0 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
1a1d0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1a1e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a1f0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
1a200 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1a210 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1a220 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
1a230 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1a240 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1a250 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1a260 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 67  T_BKPT;.    pPag
1a270 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
1a280 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
1a290 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1a2a0 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72  dbSize = -1;.  r
1a2b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a2c0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
1a2d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1a2e0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
1a2f0 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
1a300 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
1a310 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
1a320 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
1a330 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1a340 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c  3pager_isreadonl
1a350 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
1a360 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1a370 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
1a380 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1a390 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
1a3a0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
1a3b0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
1a3c0 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73   *sqlite3pager_s
1a3d0 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
1a3e0 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
1a3f0 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
1a400 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  = pPager->nRef;.
1a410 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d    a[1] = pPager-
1a420 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d  >nPage;.  a[2] =
1a430 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b   pPager->mxPage;
1a440 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
1a450 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d  ->dbSize;.  a[4]
1a460 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
1a470 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
1a480 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 23 69 66 64  r->errMask;.#ifd
1a490 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1a4a0 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
1a4b0 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
1a4c0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
1a4d0 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[8] = pPager->n
1a4e0 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70  Ovfl;.  a[9] = p
1a4f0 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
1a500 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
1a510 6e 57 72 69 74 65 3b 0a 23 65 6e 64 69 66 0a 20  nWrite;.#endif. 
1a520 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a   return a;.}../*
1a530 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
1a540 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
1a550 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
1a560 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1a570 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
1a580 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1a590 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
1a5a0 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
1a5b0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1a5c0 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
1a5d0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1a5e0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
1a5f0 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
1a600 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
1a610 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
1a620 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
1a630 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1a640 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70  t_begin(Pager *p
1a650 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1a660 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
1a670 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
1a680 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  IZE];.  assert( 
1a690 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
1a6a0 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  se );.  assert( 
1a6b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
1a6c0 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53  0 );.  TRACE2("S
1a6d0 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c  TMT-BEGIN %d\n",
1a6e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1a6f0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1a700 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
1a710 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20  mtInUse = 1;.   
1a720 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
1a730 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1a740 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ze;.    return S
1a750 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1a760 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
1a770 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
1a780 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1a790 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65  open = 1;.    re
1a7a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a7b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1a7c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1a7d0 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  n );.  pPager->a
1a7e0 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  InStmt = sqliteM
1a7f0 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
1a800 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
1a810 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
1a820 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Stmt==0 ){.    s
1a830 71 6c 69 74 65 33 49 6f 2e 78 4c 6f 63 6b 28 26  qlite3Io.xLock(&
1a840 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
1a850 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65  ED_LOCK);.    re
1a860 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1a870 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  M;.  }.#ifndef N
1a880 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c  DEBUG.  rc = sql
1a890 69 74 65 33 49 6f 2e 78 46 69 6c 65 53 69 7a 65  ite3Io.xFileSize
1a8a0 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
1a8b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
1a8c0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
1a8d0 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
1a8e0 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28  ailed;.  assert(
1a8f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
1a900 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ze == pPager->jo
1a910 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64  urnalOff );.#end
1a920 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  if.  pPager->stm
1a930 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
1a940 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
1a950 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1a960 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1a970 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
1a980 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  HdrOff = 0;.  pP
1a990 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20  ager->stmtCksum 
1a9a0 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
1a9b0 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  nit;.  if( !pPag
1a9c0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
1a9d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a9e0 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
1a9f0 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73  Temp, &pPager->s
1aa00 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tfd);.    if( rc
1aa10 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
1aa20 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70  in_failed;.    p
1aa30 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
1aa40 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
1aa50 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
1aa60 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
1aa70 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
1aa80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1aa90 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
1aaa0 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
1aab0 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->aInStmt ){.  
1aac0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
1aad0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20  ger->aInStmt);. 
1aae0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1aaf0 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
1ab00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ab10 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
1ab20 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
1ab30 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
1ab40 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
1ab50 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
1ab60 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1ab70 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c  .    PgHdr *pPg,
1ab80 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41   *pNext;.    TRA
1ab90 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54  CE2("STMT-COMMIT
1aba0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1abb0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
1abc0 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
1abd0 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 53 65 65    sqlite3Io.xSee
1abe0 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  k(&pPager->stfd,
1abf0 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71   0);.      /* sq
1ac00 6c 69 74 65 33 49 6f 2e 78 54 72 75 6e 63 61 74  lite3Io.xTruncat
1ac10 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  e(&pPager->stfd,
1ac20 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
1ac30 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
1ac40 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
1ac50 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1ac60 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
1ac70 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
1ac80 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
1ac90 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
1aca0 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
1acb0 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73  xtStmt;.      as
1acc0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d  sert( pPg->inStm
1acd0 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  t );.      pPg->
1ace0 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
1acf0 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
1ad00 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1ad10 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
1ad20 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1ad30 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1ad40 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1ad50 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1ad60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
1ad70 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
1ad80 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1ad90 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1ada0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1adb0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
1adc0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1add0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
1ade0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1adf0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
1ae00 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1ae10 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
1ae20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1ae30 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
1ae40 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1ae50 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1ae60 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  mt_rollback(Page
1ae70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1ae80 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
1ae90 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1aea0 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d  .    TRACE2("STM
1aeb0 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
1aec0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1aed0 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
1aee0 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  B ){.      PgHdr
1aef0 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
1af00 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
1af10 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
1af20 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
1af30 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1af40 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1af50 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1af60 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
1af70 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
1af80 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1af90 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
1afa0 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
1afb0 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
1afc0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
1afd0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
1afe0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
1aff0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1b000 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
1b010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b020 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1b030 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1b040 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
1b050 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
1b060 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b070 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1b080 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1b090 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
1b0a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1b0b0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
1b0c0 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
1b0d0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1b0e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b0f0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1b100 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
1b110 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b120 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1b130 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
1b140 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1b150 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1b160 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1b170 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
1b180 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1b190 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
1b1a0 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
1b1b0 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
1b1c0 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
1b1d0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
1b1e0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1b1f0 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28  e3pager_dirname(
1b200 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1b210 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1b220 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
1b230 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1b240 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
1b250 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1b260 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1b270 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1b280 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  journalname(Page
1b290 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1b2a0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
1b2b0 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
1b2c0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
1b2d0 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
1b2e0 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
1b2f0 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
1b300 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
1b310 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
1b320 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
1b330 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1b340 72 5f 6e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  r_nosync(Pager *
1b350 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1b360 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
1b370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1b380 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
1b390 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
1b3a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
1b3b0 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  _codec(.  Pager 
1b3c0 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
1b3d0 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
1b3e0 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
1b3f0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
1b400 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
1b410 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
1b420 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
1b430 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
1b440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b450 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1b460 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
1b470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b480 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
1b490 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
1b4a0 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
1b4b0 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
1b4c0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
1b4d0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1b4e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1b4f0 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
1b500 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
1b510 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1b520 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nter;.  int rc;.
1b530 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20  .  /* Open page 
1b540 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1b550 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1b560 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1b570 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c  r_get(pPager, 1,
1b580 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
1b590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b5a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
1b5b0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1b5c0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69  rite(pPage);.  i
1b5d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b5e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
1b5f0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72   /* Read the cur
1b600 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79  rent value at by
1b610 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48  te 24. */.  pPgH
1b620 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  dr = DATA_TO_PGH
1b630 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61  DR(pPage);.  cha
1b640 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65  nge_counter = re
1b650 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
1b660 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20  Hdr, 24);..  /* 
1b670 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1b680 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1b690 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1b6a0 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1b6b0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
1b6c0 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73  +;.  store32bits
1b6d0 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c  (change_counter,
1b6e0 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20   pPgHdr, 24);.. 
1b6f0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1b700 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1b710 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  */.  sqlite3page
1b720 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1b730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b740 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
1b750 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1b760 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1b770 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1b780 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1b790 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1b7a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b7b0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1b7c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1b7d0 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1b7e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1b7f0 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1b800 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1b810 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1b820 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1b830 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1b840 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1b850 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1b860 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1b870 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1b880 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1b890 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1b8a0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1b8b0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1b8c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1b8d0 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1b8e0 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1b8f0 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1b900 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1b910 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1b920 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1b930 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1b940 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1b950 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1b960 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1b970 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1b980 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1b990 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1b9a0 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1b9b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1b9c0 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  nc() call..**.**
1b9d0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1b9e0 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1b9f0 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1ba00 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1ba10 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1ba20 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1ba30 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1ba40 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1ba50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1ba60 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  er_sync(Pager *p
1ba70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
1ba80 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f  r *zMaster, Pgno
1ba90 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20   nTrunc){.  int 
1baa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bab0 0a 20 20 54 52 41 43 45 34 28 22 44 41 54 41 42  .  TRACE4("DATAB
1bac0 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
1bad0 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
1bae0 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
1baf0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
1bb00 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
1bb10 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  runc);..  /* If 
1bb20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1bb30 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
1bb40 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
1bb50 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
1bb60 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1bb70 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1bb80 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
1bb90 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
1bba0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1bbb0 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
1bbc0 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
1bbd0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1bbe0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1bbf0 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
1bc00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1bc10 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  en );..    /* If
1bc20 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1bc30 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
1bc40 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1bc50 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
1bc60 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
1bc70 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
1bc80 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
1bc90 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
1bca0 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
1bcb0 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
1bcc0 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
1bcd0 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
1bce0 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
1bcf0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1bd00 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
1bd10 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
1bd20 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
1bd30 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1bd40 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
1bd50 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
1bd60 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
1bd70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1bd80 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1bd90 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
1bda0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1bdb0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
1bdc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1bdd0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1bde0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
1bdf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1be00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1be10 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1be20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
1be30 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1be40 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
1be50 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
1be60 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
1be70 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
1be80 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
1be90 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
1bea0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1beb0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1bec0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1bed0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1bee0 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76  gno i;.        v
1bef0 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
1bf00 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20      int iSkip = 
1bf10 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1bf20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ager);.        f
1bf30 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
1bf40 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
1bf50 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
1bf60 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50          if( !(pP
1bf70 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1bf80 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37  [i/8] & (1<<(i&7
1bf90 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20  ))) && i!=iSkip 
1bfa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1bfb0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1bfc0 5f 67 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  _get(pPager, i, 
1bfd0 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
1bfe0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1bff0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1c000 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1c010 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c020 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1c030 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1c040 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1c050 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1c060 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1c070 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1c080 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1c090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c0a0 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  } .      }.#endi
1c0b0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  f.      rc = wri
1c0c0 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1c0d0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1c0e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1c0f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1c100 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1c110 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
1c120 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1c130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c140 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1c150 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  exit;.    }..#if
1c160 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c170 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1c180 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1c190 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c1a0 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
1c1b0 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1c1c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1c1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1c1e0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1c1f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1c200 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
1c210 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
1c220 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1c230 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1c240 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1c250 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1c260 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1c270 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
1c280 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c290 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1c2a0 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
1c2b0 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1c2c0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1c2d0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1c2e0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
1c2f0 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 53 79 6e  = sqlite3Io.xSyn
1c300 63 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  c(&pPager->fd, 0
1c310 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
1c320 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1c330 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a  GER_SYNCED;.  }.
1c340 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65  .sync_exit:.  re
1c350 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1c360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c370 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
1c380 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 69   Move the page i
1c390 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 61  dentified by pDa
1c3a0 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  ta to location p
1c3b0 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
1c3c0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75   .**.** There mu
1c3d0 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
1c3e0 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72 65  ces to the curre
1c3f0 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66  nt page pgno. If
1c400 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a   current page.**
1c410 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
1c420 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  eady in the roll
1c430 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
1c440 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
1c450 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74  there by.** by t
1c460 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65  his routine. The
1c470 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f   same applies to
1c480 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61 20   the page pData 
1c490 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74  refers to on ent
1c4a0 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ry to.** this ro
1c4b0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
1c4c0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
1c4d0 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  age refered to b
1c4e0 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76  y pData remain v
1c4f0 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
1c500 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
1c510 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1c520 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e  page pData (i.e.
1c530 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
1c540 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
1c550 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
1c560 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
1c570 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
1c580 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1c590 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
1c5a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1c5b0 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
1c5c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1c5d0 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
1c5e0 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
1c5f0 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
1c600 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
1c610 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
1c620 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
1c630 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
1c640 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
1c650 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
1c660 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
1c670 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
1c680 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
1c690 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tive)..*/.int sq
1c6a0 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70  lite3pager_movep
1c6b0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
1c6c0 72 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  r, void *pData, 
1c6d0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1c6e0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
1c6f0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
1c700 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
1c710 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67  ; .  int h;.  Pg
1c720 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  no needSyncPgno 
1c730 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1c740 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
1c750 20 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25    TRACE5("MOVE %
1c760 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
1c770 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
1c780 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
1c790 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c7a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
1c7b0 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b  needSync, pgno);
1c7c0 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  ..  if( pPg->nee
1c7d0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65  dSync ){.    nee
1c7e0 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
1c7f0 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
1c800 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1c810 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
1c820 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20   pPg->dirty );. 
1c830 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c840 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
1c850 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
1c860 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
1c870 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e  sh-chain */.  un
1c880 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
1c890 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f  ager, pPg);..  /
1c8a0 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63  * If the cache c
1c8b0 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77  ontains a page w
1c8c0 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ith page-number 
1c8d0 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a  pgno, remove it.
1c8e0 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68    ** from it's h
1c8f0 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
1c900 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
1c910 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
1c920 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
1c930 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
1c940 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
1c950 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
1c960 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
1c970 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
1c980 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
1c990 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
1c9a0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1c9b0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
1c9c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c9d0 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
1c9e0 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
1c9f0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
1ca00 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 4f  PgOld);.    pPgO
1ca10 6c 64 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  ld->dirty = 0;. 
1ca20 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e     if( pPgOld->n
1ca30 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
1ca40 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
1ca50 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  >inJournal );.  
1ca60 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1ca70 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  al = 1;.      pP
1ca80 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  g->needSync = 1;
1ca90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1caa0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1cab0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1cac0 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  /* Change the pa
1cad0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50  ge number for pP
1cae0 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  g and insert it 
1caf0 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73  into the new has
1cb00 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 70 50  h-chain. */.  pP
1cb10 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
1cb20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68    h = pager_hash
1cb30 28 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50  (pgno);.  if( pP
1cb40 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29  ager->aHash[h] )
1cb50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1cb60 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1cb70 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
1cb80 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
1cb90 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
1cba0 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
1cbb0 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
1cbc0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
1cbd0 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
1cbe0 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  h] = pPg;.  pPg-
1cbf0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
1cc00 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20  .  pPg->dirty = 
1cc10 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  1;.  pPager->dir
1cc20 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20  tyCache = 1;..  
1cc30 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
1cc40 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
1cc50 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
1cc60 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
1cc70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
1cc80 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
1cc90 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
1cca0 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
1ccb0 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
1ccc0 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
1ccd0 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
1cce0 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
1ccf0 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
1cd00 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
1cd10 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
1cd20 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e  * Pager.aInJourn
1cd30 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20  al bit has been 
1cd40 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
1cd50 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
1cd60 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a  y loading.    **
1cd70 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
1cd80 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
1cd90 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
1cda0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
1cdb0 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
1cdc0 2a 20 54 68 65 20 73 71 6c 69 74 65 33 70 61 67  * The sqlite3pag
1cdd0 65 72 5f 67 65 74 28 29 20 63 61 6c 6c 20 6d 61  er_get() call ma
1cde0 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
1cdf0 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
1ce00 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
1ce10 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
1ce20 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
1ce30 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
1ce40 69 6e 74 20 72 63 3b 0a 20 20 20 20 76 6f 69 64  int rc;.    void
1ce50 20 2a 70 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20   *pNeedSync;.   
1ce60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ce70 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
1ce80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1ce90 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 6e  er_get(pPager, n
1cea0 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e  eedSyncPgno, &pN
1ceb0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 69 66  eedSync);.    if
1cec0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ced0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1cee0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1cef0 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f  c = 1;.    DATA_
1cf00 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1cf10 6e 63 29 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  nc)->needSync = 
1cf20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50  1;.    DATA_TO_P
1cf30 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d  GHDR(pNeedSync)-
1cf40 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1cf50 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44      DATA_TO_PGHD
1cf60 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 64 69  R(pNeedSync)->di
1cf70 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  rty = 1;.    sql
1cf80 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
1cf90 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a  pNeedSync);.  }.
1cfa0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1cfb0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
1cfc0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1cfd0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1cfe0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1cff0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1d000 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1d010 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b  of the file lock
1d020 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
1d030 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74  ager..** The ret
1d040 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65  urn value is one
1d050 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41   of NO_LOCK, SHA
1d060 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
1d070 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44  ED_LOCK,.** PEND
1d080 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43  ING_LOCK, or EXC
1d090 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a  LUSIVE_LOCK..*/.
1d0a0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1d0b0 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72  _lockstate(Pager
1d0c0 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65   *pPager){.#ifde
1d0d0 66 20 4f 53 5f 54 45 53 54 0a 20 20 72 65 74 75  f OS_TEST.  retu
1d0e0 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 66  rn pPager->fd->f
1d0f0 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6c 73  d.locktype;.#els
1d100 65 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  e.  return pPage
1d110 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a  r->fd.locktype;.
1d120 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a  #endif.}.#endif.
1d130 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d140 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
1d150 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
1d160 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
1d170 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
1d180 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
1d190 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
1d1a0 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67  dump(Pager *pPag
1d1b0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
1d1c0 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  g;.  for(pPg=pPa
1d1d0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
1d1e0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
1d1f0 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  l){.    if( pPg-
1d200 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69  >nRef<=0 ) conti
1d210 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nue;.    sqlite3
1d220 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47  DebugPrintf("PAG
1d230 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52  E %3d addr=%p nR
1d240 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ef=%d\n", .     
1d250 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48    pPg->pgno, PGH
1d260 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1d270 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d   pPg->nRef);.  }
1d280 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69  .}.#endif..#endi
1d290 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1d2a0 5f 44 49 53 4b 49 4f 20 2a 2f 0a                 _DISKIO */.