/ Hex Artifact Content
Login

Artifact bf7e0df511e4cd752f56a7fb24b23383f6e35782:


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 31  : pager.c,v 1.21
0350: 31 20 32 30 30 35 2f 30 39 2f 30 38 20 31 32 3a  1 2005/09/08 12:
0360: 33 38 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a  38:42 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 54 68 65 79 20 61 72 65 20 72 65 71  rs. They are req
0620: 75 69 72 65 64 20 73 6f 20 74 68 61 74 20 74 72  uired so that tr
0630: 61 63 69 6e 67 0a 2a 2a 20 63 61 6e 20 62 65 20  acing.** can be 
0640: 74 75 72 6e 65 64 20 6f 6e 20 77 68 65 6e 20 75  turned on when u
0650: 73 69 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65  sing both the re
0660: 67 75 6c 61 72 20 6f 73 5f 75 6e 69 78 2e 63 20  gular os_unix.c 
0670: 61 6e 64 20 6f 73 5f 74 65 73 74 2e 63 0a 2a 2a  and os_test.c.**
0680: 20 62 61 63 6b 65 6e 64 73 2e 0a 2a 2a 0a 2a 2a   backends..**.**
0690: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
06a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
06b0: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
06c0: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 54  it's argument. T
06d0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
06e0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
06f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49   is returned. FI
0700: 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b  LEHANDLEID() tak
0710: 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20  es an OsFile.** 
0720: 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20 61  struct as it's a
0730: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 64  rgument..*/.#ifd
0740: 65 66 20 4f 53 5f 54 45 53 54 0a 23 64 65 66 69  ef OS_TEST.#defi
0750: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 70  ne PAGERID(p) (p
0760: 2d 3e 66 64 2d 3e 66 64 2e 68 29 0a 23 64 65 66  ->fd->fd.h).#def
0770: 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  ine FILEHANDLEID
0780: 28 66 64 29 20 28 66 64 2d 3e 66 64 2e 68 29 0a  (fd) (fd->fd.h).
0790: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
07a0: 47 45 52 49 44 28 70 29 20 28 70 2d 3e 66 64 2e  GERID(p) (p->fd.
07b0: 68 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48  h).#define FILEH
07c0: 41 4e 44 4c 45 49 44 28 66 64 29 20 28 66 64 2e  ANDLEID(fd) (fd.
07d0: 68 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  h).#endif../*.**
07e0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
07f0: 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c  as a whole is al
0800: 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  ways in one of t
0810: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
0820: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
0830: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
0840: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0850: 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  he is not curren
0860: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a  tly reading or .
0870: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0880: 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e 67           writing
0890: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
08a0: 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  le.  There is no
08b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08c0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 68            data h
08d0: 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  eld in memory.  
08e0: 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  This is the init
08f0: 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ial.**          
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
0910: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  te..**.**   PAGE
0920: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 20  R_SHARED        
0930: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0940: 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  s reading the da
0950: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20   Writing is not 
0980: 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72  permitted.  Ther
0990: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20  e can be.**     
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65    multiple reade
09c0: 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  rs accessing the
09d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
09e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
09f0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74 20          file at 
0a00: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
0a10: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53  *.**   PAGER_RES
0a20: 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73 20  ERVED      This 
0a30: 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73 65  process has rese
0a40: 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61 73  rved the databas
0a50: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  e for writing.**
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20 6e         but has n
0a80: 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20  ot yet made any 
0a90: 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f  changes.  Only o
0aa0: 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20  ne process.**   
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63 61      at a time ca
0ad0: 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64 61  n reserve the da
0ae0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69  tabase.  The ori
0af0: 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0b10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
0b20: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
0b30: 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20  ed so other.**  
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d       processes m
0b60: 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
0b70: 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a  ing the on-disk.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
0bb0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
0bc0: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0bd0: 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68  he is writing th
0be0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65       Access is e
0c10: 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74  xclusive.  No ot
0c20: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72  her processes or
0c30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0c40: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
0c50: 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
0c60: 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c   or writing whil
0c70: 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0c90: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
0ca0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  g..**.**   PAGER
0cb0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20 54  _SYNCED        T
0cc0: 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
0cd0: 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72 6f  o this state fro
0ce0: 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  m PAGER_EXCLUSIV
0cf0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  E.**            
0d00: 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65 72             after
0d10: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
0d20: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0d30: 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  en to the.**    
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0d60: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
0d70: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
0d80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d90: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20            disk. 
0da0: 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73  All that remains
0db0: 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d   to do is to rem
0dc0: 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ove the.**      
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
0df0: 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
0e00: 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20 20  n will be.**    
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a     committed..**
0e30: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0e40: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0e50: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0e60: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0e70: 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  * sqlite3pager_g
0e80: 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65  et() occurs, the
0e90: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0ea0: 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ns to PAGER_SHAR
0eb0: 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c  ED..** After all
0ec0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0ed0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
0ee0: 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65  sqlite_page_unre
0ef0: 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74  f(),.** the stat
0f00: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61  e transitions ba
0f10: 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f  ck to PAGER_UNLO
0f20: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0f30: 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69  ime.** that sqli
0f40: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
0f50: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
0f60: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0f70: 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45  s to.** PAGER_RE
0f80: 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74  SERVED.  (Note t
0f90: 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f  hat sqlite_page_
0fa0: 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79  write() can only
0fb0: 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e   be.** called on
0fc0: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
0fd0: 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73  page which means
0fe0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
0ff0: 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41  must.** be in PA
1000: 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72  GER_SHARED befor
1010: 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73  e it transitions
1020: 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56   to PAGER_RESERV
1030: 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ED.).** The tran
1040: 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f  sition to PAGER_
1050: 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73  EXCLUSIVE occurs
1060: 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e 79   when before any
1070: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1080: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1090: 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74 65  base file.  Afte
10a0: 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65  r an sqlite3page
10b0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  r_rollback().** 
10c0: 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72 5f  or sqlite_pager_
10d0: 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73 74  commit(), the st
10e0: 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74 6f  ate goes back to
10f0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a   PAGER_SHARED..*
1100: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1110: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64  UNLOCK      0.#d
1120: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52  efine PAGER_SHAR
1130: 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73  ED      1   /* s
1140: 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f  ame as SHARED_LO
1150: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1160: 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20  GER_RESERVED    
1170: 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52  2   /* same as R
1180: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a  ESERVED_LOCK */.
1190: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58  #define PAGER_EX
11a0: 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a  CLUSIVE   4   /*
11b0: 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49   same as EXCLUSI
11c0: 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  VE_LOCK */.#defi
11d0: 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  ne PAGER_SYNCED 
11e0: 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66       5../*.** If
11f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
1200: 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d  _RESERVED_LOCK m
1210: 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74  acro is set to t
1220: 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  rue at compile-t
1230: 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69  ime,.** then fai
1240: 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20  led attempts to 
1250: 67 65 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  get a reserved l
1260: 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20  ock will invoke 
1270: 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
1280: 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66  k..** This is of
1290: 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54  f by default.  T
12a0: 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69  o see why, consi
12b0: 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
12c0: 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a  g scenario:.** .
12d0: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65 61  ** Suppose threa
12e0: 64 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  d A already has 
12f0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
1300: 64 20 77 61 6e 74 73 20 61 20 72 65 73 65 72 76  d wants a reserv
1310: 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65  ed lock..** Thre
1320: 61 64 20 42 20 61 6c 72 65 61 64 79 20 68 61 73  ad B already has
1330: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1340: 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78   and wants an ex
1350: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
1360: 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64  f.** both thread
1370: 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 69  s are using thei
1380: 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73  r busy callbacks
1390: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  , it might be a 
13a0: 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20  long time.** be 
13b0: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  for one of the t
13c0: 68 72 65 61 64 73 20 67 69 76 65 20 75 70 20 61  hreads give up a
13d0: 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74  nd allows the ot
13e0: 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a  her to proceed..
13f0: 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74 68  ** But if the th
1400: 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67  read trying to g
1410: 65 74 20 74 68 65 20 72 65 73 65 72 76 65 64 20  et the reserved 
1420: 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71 75  lock gives up qu
1430: 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20  ickly.** (if it 
1440: 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74  never invokes it
1450: 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29  s busy callback)
1460: 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
1470: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  tion will be.** 
1480: 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79  resolved quickly
1490: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
14a0: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
14b0: 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  D_LOCK.# define 
14c0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
14d0: 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64  RVED_LOCK 0.#end
14e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  if../*.** This m
14f0: 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75  acro rounds valu
1500: 65 73 20 75 70 20 73 6f 20 74 68 61 74 20 69 66  es up so that if
1510: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
1520: 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69   address it.** i
1530: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1540: 62 65 20 61 6e 20 61 64 64 72 65 73 73 20 74 68  be an address th
1550: 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f  at is aligned to
1560: 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
1570: 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ary..*/.#define 
1580: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
1590: 58 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37  X)   (((X)+7)&~7
15a0: 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  )../*.** Each in
15b0: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
15c0: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
15d0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
15e0: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
15f0: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
1600: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
1610: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
1620: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
1630: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
1640: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
1650: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1660: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
1670: 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64  **.** Client cod
1680: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71  e should call sq
1690: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
16a0: 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69  () on a page pri
16b0: 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20  or to making.** 
16c0: 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  any modification
16d0: 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20  s to that page. 
16e0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
16f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1700: 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  te().** is calle
1710: 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  d, the original 
1720: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
1730: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1740: 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a  he rollback.** j
1750: 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72  ournal and PgHdr
1760: 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50  .inJournal and P
1770: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72  gHdr.needSync ar
1780: 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f  e set.  Later, o
1790: 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  nce.** the journ
17a0: 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64 65  al page has made
17b0: 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73   it onto the dis
17c0: 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64 72  k surface, PgHdr
17d0: 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20  .needSync.** is 
17e0: 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f  cleared.  The mo
17f0: 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e  dified page cann
1800: 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 61  ot be written ba
1810: 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  ck into the orig
1820: 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  inal.** database
1830: 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
1840: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61  journal pages ha
1850: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
1860: 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a   disk and the.**
1870: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
1880: 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
1890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64  ..**.** The PgHd
18a0: 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73 20  r.dirty flag is 
18b0: 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33  set when sqlite3
18c0: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
18d0: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
18e0: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
18f0: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1900: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1910: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1920: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1930: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  e file..*/.typed
1940: 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20  ef struct PgHdr 
1950: 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67  PgHdr;.struct Pg
1960: 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70  Hdr {.  Pager *p
1970: 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
1980: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1990: 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69  ger to which thi
19a0: 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a  s page belongs *
19b0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
19e0: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
19f0: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1a00: 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65  pNextHash, *pPre
1a10: 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20  vHash;  /* Hash 
1a20: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20  collision chain 
1a30: 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a  for PgHdr.pgno *
1a40: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1a50: 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65  Free, *pPrevFree
1a60: 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f  ;  /* Freelist o
1a70: 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  f pages where nR
1a80: 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  ef==0 */.  PgHdr
1a90: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
1aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
1ab0: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
1ac0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
1ad0: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
1ae0: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
1af0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
1b00: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
1b10: 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c  /.  u8 inJournal
1b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b30: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61     /* TRUE if ha
1b40: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
1b50: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  o journal */.  u
1b60: 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  8 inStmt;       
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b80: 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20   TRUE if in the 
1b90: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
1ba0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
1bb0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
1bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
1bd0: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77   if we need to w
1be0: 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65  rite back change
1bf0: 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  s */.  u8 needSy
1c00: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
1c10: 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f        /* Sync jo
1c20: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69  urnal before wri
1c30: 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a  ting this page *
1c40: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1c50: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1c60: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f     /* Disable do
1c70: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
1c80: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1c90: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
1cc0: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
1cd0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
1ce0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
1cf0: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
1d00: 65 73 20 73 6f 72 74 65 64 20 62 79 20 50 67 48  es sorted by PgH
1d10: 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66 64 65  dr.pgno */.#ifde
1d20: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1d30: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
1d40: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ash;.#endif.  /*
1d50: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d60: 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  e bytes of page 
1d70: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
1d80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
1d90: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
1da0: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
1db0: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
1dc0: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
1dd0: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
1de0: 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73  ory only databas
1df0: 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e  e, some extra in
1e00: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63  formation is rec
1e10: 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65  orded about.** e
1e20: 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74  ach page so that
1e30: 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20   changes can be 
1e40: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a  rolled back.  (J
1e50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
1e60: 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72   not.** used for
1e70: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1e80: 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c  ases.)  The foll
1e90: 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  owing informatio
1ea0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  n is added to.**
1eb0: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
1ec0: 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f  y EXTRA block fo
1ed0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
1ee0: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bases..**.** Thi
1ef0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f  s information co
1f00: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64  uld have been ad
1f10: 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ded directly to 
1f20: 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74  the PgHdr struct
1f30: 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e  ure..** But then
1f40: 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75   it would take u
1f50: 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74  p an extra 8 byt
1f60: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e  es of storage on
1f70: 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20   every PgHdr.** 
1f80: 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61  even for disk-ba
1f90: 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  sed databases.  
1fa0: 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74  Splitting it out
1fb0: 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20   saves 8 bytes. 
1fc0: 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
1fd0: 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e   a savings of 0.
1fe0: 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72  8% but those per
1ff0: 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e  centages add up.
2000: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2010: 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48  ct PgHistory PgH
2020: 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50  istory;.struct P
2030: 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20  gHistory {.  u8 
2040: 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f  *pOrig;     /* O
2050: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78  riginal page tex
2060: 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74  t.  Restore to t
2070: 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f  his on a full ro
2080: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a  llback */.  u8 *
2090: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65  pStmt;     /* Te
20a0: 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20  xt as it was at 
20b0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
20c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
20d0: 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  tement */.};../*
20e0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
20f0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
2100: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
2110: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
2120: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2130: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
2140: 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50  C(P,D,N,X) if( P
2150: 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78  ->xCodec ){ P->x
2160: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
2170: 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c  rg,D,N,X); }.#el
2180: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
2190: 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69  C(P,D,N,X).#endi
21a0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
21b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
21c0: 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69  PgHdr into a poi
21d0: 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61  nter to its data
21e0: 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61  .** and back aga
21f0: 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  in..*/.#define P
2200: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20  GHDR_TO_DATA(P) 
2210: 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31   ((void*)(&(P)[1
2220: 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41  ])).#define DATA
2230: 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26  _TO_PGHDR(D)  (&
2240: 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31  ((PgHdr*)(D))[-1
2250: 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  ]).#define PGHDR
2260: 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28  _TO_EXTRA(G,P) (
2270: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
2280: 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e  (&(G)[1]))[(P)->
2290: 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66 69  pageSize]).#defi
22a0: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ne PGHDR_TO_HIST
22b0: 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20  (P,PGR)  \.     
22c0: 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f         ((PgHisto
22d0: 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  ry*)&((char*)(&(
22e0: 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70  P)[1]))[(PGR)->p
22f0: 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e  ageSize+(PGR)->n
2300: 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48  Extra])../*.** H
2310: 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74  ow big to make t
2320: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73  he hash table us
2330: 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20  ed for locating 
2340: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a  in-memory pages.
2350: 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ** by page numbe
2360: 72 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 6c 6f  r. This macro lo
2370: 6f 6b 73 20 61 20 6c 69 74 74 6c 65 20 73 69 6c  oks a little sil
2380: 6c 79 2c 20 62 75 74 20 69 73 20 65 76 61 6c 75  ly, but is evalu
2390: 61 74 65 64 0a 2a 2a 20 61 74 20 63 6f 6d 70 69  ated.** at compi
23a0: 6c 65 2d 74 69 6d 65 2c 20 6e 6f 74 20 72 75 6e  le-time, not run
23b0: 2d 74 69 6d 65 20 28 61 74 20 6c 65 61 73 74 20  -time (at least 
23c0: 66 6f 72 20 67 63 63 20 74 68 69 73 20 69 73 20  for gcc this is 
23d0: 74 72 75 65 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  true)..*/.#defin
23e0: 65 20 4e 5f 50 47 5f 48 41 53 48 20 28 5c 0a 20  e N_PG_HASH (\. 
23f0: 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 30 32 34   (MAX_PAGES>1024
2400: 29 3f 32 30 34 38 3a 20 5c 0a 20 20 28 4d 41 58  )?2048: \.  (MAX
2410: 5f 50 41 47 45 53 3e 35 31 32 29 3f 31 30 32 34  _PAGES>512)?1024
2420: 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53  : \.  (MAX_PAGES
2430: 3e 32 35 36 29 3f 35 31 32 3a 20 5c 0a 20 20 28  >256)?512: \.  (
2440: 4d 41 58 5f 50 41 47 45 53 3e 31 32 38 29 3f 32  MAX_PAGES>128)?2
2450: 35 36 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47  56: \.  (MAX_PAG
2460: 45 53 3e 36 34 29 3f 31 32 38 3a 36 34 20 5c 0a  ES>64)?128:64 \.
2470: 29 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20  )../*.** Hash a 
2480: 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23  page number.*/.#
2490: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61 73  define pager_has
24a0: 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e 5f  h(PN)  ((PN)&(N_
24b0: 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a 0a  PG_HASH-1))../*.
24c0: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
24d0: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
24e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
24f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
2500: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
2510: 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  {.  u8 journalOp
2520: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2530: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
2540: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
2550: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
2560: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
2570: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
2580: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
2590: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
25a0: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
25b0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
25c0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
25d0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
25e0: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
25f0: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2610: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
2620: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
2630: 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f  ks */.  u8 stmtO
2640: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2650: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2660: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
2670: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
2680: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73  */.  u8 stmtInUs
2690: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
26a0: 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20   /* True we are 
26b0: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  in a statement s
26c0: 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  ubtransaction */
26d0: 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70  .  u8 stmtAutoop
26e0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  en;            /
26f0: 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72  * Open stmt jour
2700: 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f  nal when main jo
2710: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a  urnal is opened*
2720: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
2750: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
2760: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
2770: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2780: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
2790: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
27a0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
27b0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74  ess */.  u8 stat
27c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27d0: 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e       /* PAGER_UN
27e0: 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f  LOCK, _SHARED, _
27f0: 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a  RESERVED, etc. *
2800: 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20  /.  u8 errMask; 
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
2830: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
2840: 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  s */.  u8 tempFi
2850: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2860: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2870: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2880: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
2890: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
28a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
28b0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
28c0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65  abase */.  u8 ne
28d0: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
28e0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28f0: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
2900: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
2910: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
2920: 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20  rtyCache;       
2930: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2940: 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68  f cached pages h
2950: 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ave changed */. 
2960: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
2970: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ck;          /* 
2980: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
2990: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
29a0: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
29b0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
29c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
29d0: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
29e0: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73  le I/O */.  u8 s
29f0: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a10: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2a20: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2a30: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20  o jrnl */.  int 
2a40: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
2a50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a60: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2a70: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2a80: 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20  origDbSize;     
2a90: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
2aa0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
2ab0: 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20  rent change */. 
2ac0: 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20   int stmtSize;  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae0: 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
2af0: 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73   (in pages) at s
2b00: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
2b10: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b30: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2b40: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
2b50: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
2b60: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
2b70: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
2b80: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
2b90: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
2ba0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73  cksum */.  int s
2bb0: 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20  tmtNRec;        
2bc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2bd0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73   of records in s
2be0: 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  tmt subjournal *
2bf0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20  /.  int nExtra; 
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
2c20: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
2c30: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2c40: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2c70: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
2c80: 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ca0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
2cc0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61 67  */.  int nMaxPag
2cd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ce0: 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20 6d   /* High water m
2cf0: 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f 0a  ark of nPage */.
2d00: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d20: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   Number of in-me
2d30: 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20  mory pages with 
2d40: 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a  PgHdr.nRef>0 */.
2d50: 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20    int mxPage;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d70: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
2d80: 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64  of pages to hold
2d90: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 75   in cache */.  u
2da0: 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  8 *aInJournal;  
2db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2dc0: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
2dd0: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2de0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
2df0: 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20   *aInStmt;      
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2e10: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
2e20: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
2e30: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  se */.  char *zF
2e40: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
2e50: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2e60: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e70: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
2e80: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
2e90: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2ea0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
2eb0: 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74  .  char *zDirect
2ec0: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ory;           /
2ed0: 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64  * Directory hold
2ee0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
2ef0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20  urnal files */. 
2f00: 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b   OsFile fd, jfd;
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f20: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  File descriptors
2f30: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e   for database an
2f40: 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f  d journal */.  O
2f50: 73 46 69 6c 65 20 73 74 66 64 3b 20 20 20 20 20  sFile stfd;     
2f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2f70: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
2f80: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
2f90: 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42  subjournal*/.  B
2fa0: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
2fb0: 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f  yHandler;  /* Po
2fc0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e  inter to sqlite.
2fd0: 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  busyHandler */. 
2fe0: 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20   PgHdr *pFirst, 
2ff0: 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20  *pLast;      /* 
3000: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  List of free pag
3010: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
3020: 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20  FirstSynced;    
3030: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65      /* First fre
3040: 65 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64  e page with PgHd
3050: 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f  r.needSync==0 */
3060: 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20  .  PgHdr *pAll; 
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3080: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  * List of all pa
3090: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
30a0: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
30b0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
30c0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
30d0: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
30e0: 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  l */.  i64 journ
30f0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
3100: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
3110: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
3120: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
3130: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
3140: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3150: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
3160: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
3170: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
3180: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
3190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
31a0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
31b0: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
31c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
31d0: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
31e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
31f0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
3200: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
3210: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
3220: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3230: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
3240: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
3250: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
3260: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3270: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3280: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3290: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
32a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
32b0: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
32c0: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
32d0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
32e0: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
32f0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
3300: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
3310: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3320: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
3330: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
3340: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
3350: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
3360: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
3370: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3380: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
3390: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
33a0: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
33b0: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
33c0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
33d0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
33e0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
33f0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
3400: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
3410: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
3420: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
3430: 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20  oid *pCodecArg; 
3440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3450: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
3460: 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 50 67  xCodec() */.  Pg
3470: 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f  Hdr *aHash[N_PG_
3480: 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73  HASH];    /* Has
3490: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
34a0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
34b0: 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Hdr */.};../*.**
34c0: 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   If SQLITE_TEST 
34d0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
34e0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  increment the va
34f0: 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a  riable given in.
3500: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  ** the argument.
3510: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3520: 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54  _TEST.# define T
3530: 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b  EST_INCR(x)  x++
3540: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3550: 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e  TEST_INCR(x).#en
3560: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  dif../*.** These
3570: 20 61 72 65 20 62 69 74 73 20 74 68 61 74 20 63   are bits that c
3580: 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61 67  an be set in Pag
3590: 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23  er.errMask..*/.#
35a0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
35b0: 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20  _FULL     0x01  
35c0: 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66 61 69  /* a write() fai
35d0: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
35e0: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20  AGER_ERR_MEM    
35f0: 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f    0x02  /* mallo
3600: 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64  c() failed */.#d
3610: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
3620: 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f  LOCK     0x04  /
3630: 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c  * error in the l
3640: 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
3650: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3660: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78  _ERR_CORRUPT  0x
3670: 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20  08  /* database 
3680: 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  or journal corru
3690: 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ption */.#define
36a0: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20   PAGER_ERR_DISK 
36b0: 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e      0x10  /* gen
36c0: 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72  eral disk I/O er
36d0: 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64 20 64  ror - bad hard d
36e0: 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rive? */../*.** 
36f0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3700: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3710: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3720: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3730: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3740: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3750: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3760: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3770: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3780: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3790: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
37a0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
37b0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
37c0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
37d0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
37e0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
37f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3800: 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e  begin.** written
3810: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3820: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3830: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3840: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3850: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3860: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3870: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3880: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3890: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
38a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
38b0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
38c0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
38d0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
38e0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
38f0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3900: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3910: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3920: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3940: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3950: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
3960: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
3970: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
3980: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
3990: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
39a0: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
39b0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
39c0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
39d0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
39e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
39f0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
3a00: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
3a10: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
3a20: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
3a30: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
3a40: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
3a50: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3a60: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
3a70: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
3a80: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
3a90: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
3aa0: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
3ab0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
3ac0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
3ad0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
3ae0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
3af0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
3b00: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
3b10: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
3b20: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
3b30: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
3b40: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
3b50: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
3b60: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
3b70: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
3b80: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
3b90: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
3ba0: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
3bb0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
3bc0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
3bd0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
3be0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
3bf0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
3c00: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
3c10: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
3c20: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
3c30: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
3c40: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
3c50: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
3c60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
3c70: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
3c80: 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   and of each pag
3c90: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
3ca0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
3cb0: 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * by the followi
3cc0: 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64  ng macros..*/.#d
3cd0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
3ce0: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
3cf0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
3d00: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
3d10: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3d20: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
3d30: 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75  ger. In the futu
3d40: 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62  re, this could b
3d50: 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65  e.** set to some
3d60: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
3d70: 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f   the disk contro
3d80: 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74  ller. The import
3d90: 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ant.** character
3da0: 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74  istic is that it
3db0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a   is the same siz
3dc0: 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74  e as a disk sect
3dd0: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  or..*/.#define J
3de0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
3df0: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
3e00: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
3e10: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
3e20: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
3e30: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
3e40: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
3e50: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
3e60: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
3e70: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
3e80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
3e90: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
3ea0: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
3eb0: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
3ec0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
3ed0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
3ee0: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
3ef0: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
3f00: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
3f10: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3f20: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
3f30: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
3f40: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3f50: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
3f60: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
3f70: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 69  * The default si
3f80: 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73 65 63  ze of a disk sec
3f90: 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  tor.*/.#define P
3fa0: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
3fb0: 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65   512../*.** Page
3fc0: 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a   number PAGER_MJ
3fd0: 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75  _PGNO is never u
3fe0: 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  sed in an SQLite
3ff0: 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73   database (it is
4000: 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72  .** reserved for
4010: 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20   working around 
4020: 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20  a windows/posix 
4030: 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29  incompatibility)
4040: 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20  . It is.** used 
4050: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  in the journal t
4060: 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74  o signify that t
4070: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
4080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4090: 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20   .** is devoted 
40a0: 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73  to storing a mas
40b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
40c0: 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   - there are no 
40d0: 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a  more pages to.**
40e0: 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20   roll back. See 
40f0: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e  comments for fun
4100: 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65  ction writeMaste
4110: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64  rJournal() for d
4120: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64  etails..*/./* #d
4130: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
4140: 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f  GNO(x) (PENDING_
4150: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
4160: 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65  ize)) */.#define
4170: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
4180: 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  ) ((PENDING_BYTE
4190: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
41a0: 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )+1)../*.** The 
41b0: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
41c0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
41d0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
41e0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
41f0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
4200: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65  *.** Enable refe
4210: 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63  rence count trac
4220: 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67  king (for debugg
4230: 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69  ing) here:.*/.#i
4240: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4250: 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72  G.  int pager3_r
4260: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20  efinfo_enable = 
4270: 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  0;.  static void
4280: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50   pager_refinfo(P
4290: 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74  gHdr *p){.    st
42a0: 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30  atic int cnt = 0
42b0: 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72  ;.    if( !pager
42c0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
42d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
42e0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
42f0: 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e  f(.       "REFCN
4300: 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e  T: %4d addr=%p n
4310: 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Ref=%d\n",.     
4320: 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52    p->pgno, PGHDR
4330: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
4340: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
4350: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
4360: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
4370: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
4380: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
4390: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
43a0: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
43b0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
43c0: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
43d0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
43e0: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
43f0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
4400: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
4410: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
4420: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
4430: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
4440: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
4450: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
4460: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
4470: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4480: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4490: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
44a0: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
44b0: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
44c0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
44d0: 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64  2bits(OsFile *fd
44e0: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
44f0: 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72  u32 res;.  int r
4500: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
4510: 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65 73  3OsRead(fd, &res
4520: 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a  , sizeof(res));.
4530: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4540: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  _OK ){.    unsig
4550: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4560: 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26      memcpy(ac, &
4570: 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73  res, 4);.    res
4580: 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c   = (ac[0]<<24) |
4590: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
45a0: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
45b0: 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  ];.  }.  *pRes =
45c0: 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72   res;.  return r
45d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
45e0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
45f0: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
4600: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4610: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
4620: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
4630: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
4640: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
4650: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
4660: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
4670: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4680: 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75  d, u32 val){.  u
4690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
46a0: 34 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  4];.  ac[0] = (v
46b0: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
46c0: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
46d0: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
46e0: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
46f0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
4700: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72   val & 0xff;.  r
4710: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
4720: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
4730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4740: 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  the 32-bit integ
4750: 65 72 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68  er 'val' into th
4760: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
4770: 64 20 62 79 20 70 61 67 65 20 68 65 61 64 65 72  d by page header
4780: 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65  .** 'p' at offse
4790: 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73  t 'offset'..*/.s
47a0: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
47b0: 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20  32bits(u32 val, 
47c0: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
47d0: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
47e0: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
47f0: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
4800: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
4810: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
4820: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
4830: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
4840: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
4850: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
4860: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
4870: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
4880: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
4890: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
48a0: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
48b0: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
48c0: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
48d0: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
48e0: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
48f0: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
4900: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
4910: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
4920: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4930: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
4940: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
4950: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
4960: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
4970: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4980: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4990: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
49a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
49b0: 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  rt the bits in t
49c0: 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  he pPager->errMa
49d0: 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f  sk into an appro
49e0: 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20  prate.** return 
49f0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
4a00: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64  int pager_errcod
4a10: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
4a20: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4a30: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
4a40: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
4a50: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29  PAGER_ERR_LOCK )
4a60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4a70: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20  PROTOCOL;.  if( 
4a80: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4a90: 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  & PAGER_ERR_DISK
4aa0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
4ab0: 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70  E_IOERR;.  if( p
4ac0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
4ad0: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
4ae0: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
4af0: 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61  _FULL;.  if( pPa
4b00: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
4b10: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20  AGER_ERR_MEM )  
4b20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4b30: 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67  OMEM;.  if( pPag
4b40: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4b50: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
4b60: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
4b70: 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  RRUPT;.  return 
4b80: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
4b90: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
4ba0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
4bb0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
4bc0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
4bd0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
4be0: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
4bf0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
4c00: 65 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  e){.  u32 hash =
4c10: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75   0;.  int i;.  u
4c20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
4c30: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
4c40: 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f  char *)PGHDR_TO_
4c50: 44 41 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66  DATA(pPage);.  f
4c60: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
4c70: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
4c80: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
4c90: 68 20 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61  h = (hash+i)^pDa
4ca0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
4cb0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a  urn hash;.}../*.
4cc0: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
4cd0: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
4ce0: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
4cf0: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
4d00: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
4d10: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
4d20: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
4d30: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
4d40: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
4d50: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
4d60: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
4d70: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
4d80: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
4d90: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
4da0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
4db0: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
4dc0: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
4dd0: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
4de0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
4df0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
4e00: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
4e10: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
4e20: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   || pPager->errM
4e30: 61 73 6b 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  ask || MEMDB || 
4e40: 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20  pPg->dirty || . 
4e50: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
4e60: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
4e70: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
4e80: 6c 73 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43  lse.#define CHEC
4e90: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
4ea0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
4eb0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
4ec0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
4ed0: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
4ee0: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
4ef0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
4f00: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72  l file name is r
4f10: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ead from the end
4f20: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
4f30: 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
4f40: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4f50: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
4f60: 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72  loc(). *pzMaster
4f70: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f   is.** set to po
4f80: 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72  int at the memor
4f90: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
4fa0: 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
4fb0: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c  ller must.** sql
4fc0: 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73  iteFree() *pzMas
4fd0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ter..**.** If no
4fe0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4ff0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
5000: 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69  sent *pzMaster i
5010: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
5020: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
5030: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
5040: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
5050: 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a  urnal(OsFile *pJ
5060: 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61  rnl, char **pzMa
5070: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
5080: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
5090: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
50a0: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
50b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
50c0: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
50d0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
50e0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
50f0: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30  .  *pzMaster = 0
5100: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5110: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
5120: 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  l, &szJ);.  if( 
5130: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5140: 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e   szJ<16 ) return
5150: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
5160: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
5170: 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28  , szJ-16);.  if(
5180: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5190: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20   return rc;. .  
51a0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
51b0: 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20  pJrnl, &len);.  
51c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
51d0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
51e0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
51f0: 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29  s(pJrnl, &cksum)
5200: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5210: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5220: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5230: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
5240: 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66  aMagic, 8);.  if
5250: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5260: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
5270: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
5280: 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b   8) ) return rc;
5290: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
52a0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
52b0: 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-16-len);.  if(
52c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
52d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a   return rc;..  *
52e0: 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72  pzMaster = (char
52f0: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
5300: 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a  len+1);.  if( !*
5310: 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  pzMaster ){.    
5320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5330: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
5340: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5350: 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20  rnl, *pzMaster, 
5360: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
5370: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5380: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
5390: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
53a0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  aster = 0;.    r
53b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
53c0: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
53d0: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
53e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
53f0: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
5400: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
5410: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
5420: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a  (*pzMaster)[i];.
5430: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
5440: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
5450: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
5460: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
5470: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
5480: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
5490: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
54a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
54b0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
54c0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
54d0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
54e0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
54f0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
5500: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
5510: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
5520: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
5530: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
5540: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
5550: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
5560: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
5570: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
5580: 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e   (*pzMaster)[len
5590: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
55a0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
55b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
55c0: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  eek the journal 
55d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
55e0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
55f0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72  or boundary wher
5600: 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  e a.** journal h
5610: 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61  eader may be rea
5620: 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61  d or written. Pa
5630: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  ger.journalOff i
5640: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a  s updated with.*
5650: 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f  * the new seek o
5660: 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ffset..**.** i.e
5670: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
5680: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
5690: 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20   Input Offset   
56a0: 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75             Outpu
56b0: 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d  t Offset.** ----
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20  ---.** 0        
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20   0.** 512       
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20  512.** 100      
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20   512.** 2000    
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
5770: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75  atic int seekJou
5780: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
5790: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
57a0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
57b0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
57c0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
57d0: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
57e0: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
57f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
5800: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
5810: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
5820: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
5830: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
5840: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
5850: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
5860: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
5870: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
5880: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5890: 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ) );.  pPager->j
58a0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73  ournalOff = offs
58b0: 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  et;.  return sql
58c0: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
58d0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
58e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a  >journalOff);.}.
58f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
5900: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
5910: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
5920: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5930: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
5940: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
5950: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
5960: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
5970: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
5980: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5990: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
59a0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
59b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
59c0: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
59d0: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
59e0: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
59f0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
5a00: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
5a10: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
5a20: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
5a30: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
5a40: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
5a50: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
5a60: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
5a70: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
5a80: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
5a90: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
5aa0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5ab0: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
5ac0: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
5ad0: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
5ae0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20  journal..** .** 
5af0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
5b00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34  RNAL_HDR_SZ - 24
5b10: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
5b20: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
5b30: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
5b40: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
5b50: 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63  ager){..  int rc
5b60: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5b70: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5b80: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5b90: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
5ba0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
5bb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5bc0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
5bd0: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
5be0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
5bf0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
5c00: 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70  rnalHdr;.  }.  p
5c10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5c20: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
5c30: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
5c40: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
5c50: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
5c60: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
5c70: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
5c80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
5c90: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
5ca0: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
5cb0: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
5cc0: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
5cd0: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
5ce0: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
5cf0: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
5d00: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
5d10: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
5d20: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
5d30: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
5d40: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
5d50: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
5d60: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
5d70: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
5d80: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
5d90: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
5da0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
5db0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5dc0: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
5dd0: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
5de0: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
5df0: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72  . */.    rc = wr
5e00: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
5e10: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5e20: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
5e30: 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  fff : 0);.  }.  
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: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
5e70: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
5e80: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e   .    sqlite3Ran
5e90: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
5ea0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
5eb0: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
5ec0: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20 3d  mInit);.    rc =
5ed0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
5ee0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
5ef0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
5f00: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
5f10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5f20: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
5f30: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
5f40: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
5f50: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
5f60: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
5f70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
5f80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5f90: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
5fa0: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
5fb0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
5fc0: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
5fd0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5fe0: 64 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  d, pPager->secto
5ff0: 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rSize);.  }..  /
6000: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
6010: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
6020: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
6030: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
6040: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
6050: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
6060: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
6070: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
6080: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
6090: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
60a0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
60b0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
60c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
60d0: 66 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  f-1);.    rc = s
60e0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
60f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30  Pager->jfd, "\00
6100: 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  0", 1);.  }.  re
6110: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6120: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
6130: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
6140: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
6150: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
6160: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
6170: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
6180: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
6190: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
61a0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
61b0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53  urnal.** file. S
61c0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
61d0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
61e0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
61f0: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
6200: 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  f.** the journal
6210: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
6220: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
6230: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
6240: 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20  essfully, *nRec 
6250: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
6260: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
6270: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
6280: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
6290: 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74  d *dbSize is set
62a0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
62b0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
62c0: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
62d0: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
62e0: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
62f0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
6300: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
6310: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
6320: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
6330: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
6340: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
6350: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
6360: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
6370: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
6380: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
6390: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
63a0: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
63b0: 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a   and *nRec and *
63c0: 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73  dbSize are not s
63d0: 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  et.  If JOURNAL_
63e0: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
63f0: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
6400: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
6410: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
6420: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
6430: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
6440: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
6450: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a  Pager *pPager, .
6460: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
6470: 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  e,.  u32 *pNRec,
6480: 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65   .  u32 *pDbSize
6490: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
64a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
64b0: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
64c0: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
64d0: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
64e0: 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75  ..  rc = seekJou
64f0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
6500: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6510: 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  rn rc;..  if( pP
6520: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6530: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
6540: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
6550: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
6560: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
6570: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
6580: 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67  ite3OsRead(&pPag
6590: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
65a0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
65b0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
65c0: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d  urn rc;..  if( m
65d0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
65e0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
65f0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
6600: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6610: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6620: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6630: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
6640: 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  pNRec);.  if( rc
6650: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6660: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6670: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
6680: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6690: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
66a0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
66b0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50  = read32bits(&pP
66c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69  ager->jfd, pDbSi
66d0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
66e0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
66f0: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
6700: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
6710: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
6720: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
6730: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
6740: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
6750: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
6760: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
6770: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
6780: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
6790: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
67a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
67b0: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
67c0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
67d0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
67e0: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
67f0: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
6800: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
6810: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
6820: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
6830: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
6840: 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  d32bits(&pPager-
6850: 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50  >jfd, (u32 *)&pP
6860: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
6870: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6880: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67  turn rc;..  pPag
6890: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
68a0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
68b0: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
68c0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
68d0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
68e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
68f0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
6900: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
6910: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
6920: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
6930: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
6940: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
6950: 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
6960: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
6970: 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
6980: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
6990: 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
69a0: 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
69b0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
69c0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
69d0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
69e0: 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
69f0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
6a00: 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
6a10: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
6a20: 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
6a30: 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
6a40: 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
6a50: 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20  mat is:.**.** + 
6a60: 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
6a70: 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62  J_PGNO..** + N b
6a80: 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20  ytes: length of 
6a90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6aa0: 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65  ame..** + 4 byte
6ab0: 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65  s: N.** + 4 byte
6ac0: 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
6ad0: 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
6ae0: 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61  .** + 8 bytes: a
6af0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
6b00: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
6b10: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68   journal page ch
6b20: 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75  ecksum is the su
6b30: 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69  m of the bytes i
6b40: 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  n the master.** 
6b50: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2f  journal name..*/
6b60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
6b70: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
6b80: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
6b90: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
6ba0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
6bb0: 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20  int len; .  int 
6bc0: 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  i; .  u32 cksum 
6bd0: 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20 21 7a 4d  = 0; ..  if( !zM
6be0: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
6bf0: 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75  >setMaster) retu
6c00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6c10: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
6c20: 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20  r = 1;..  len = 
6c30: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b  strlen(zMaster);
6c40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
6c50: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
6c60: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
6c70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
6c80: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
6c90: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
6ca0: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
6cb0: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
6cc0: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
6cd0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
6ce0: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
6cf0: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
6d00: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
6d10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
6d20: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
6d30: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
6d40: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
6d50: 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  c ){.    rc = se
6d60: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
6d70: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
6d80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6d90: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
6da0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6db0: 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a  f += (len+20);..
6dc0: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
6dd0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
6de0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
6df0: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
6e00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
6e10: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6e20: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
6e30: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  (&pPager->jfd, z
6e40: 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20  Master, len);.  
6e50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6e60: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
6e70: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
6e80: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
6e90: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
6ea0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
6eb0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6ec0: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
6ed0: 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73 75 6d 29  ger->jfd, cksum)
6ee0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
6ef0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
6f00: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
6f10: 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
6f20: 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
6f30: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
6f40: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
6f50: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
6f60: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
6f70: 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ync;.  return rc
6f80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
6f90: 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20  r remove a page 
6fa0: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
6fb0: 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20   all pages that 
6fc0: 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74  are in the.** st
6fd0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
6fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
6ff0: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
7000: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
7010: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
7020: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61  ly in.** the sta
7030: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
7040: 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20   This helps the 
7050: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
7060: 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f  t_commit().** ro
7070: 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66  utine run MUCH f
7080: 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  aster for the co
7090: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
70a0: 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a  there are many.*
70b0: 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72  * pages in memor
70c0: 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77  y but only a few
70d0: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
70e0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
70f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7100: 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
7110: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
7120: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
7130: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
7140: 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d    if( pPg->inStm
7150: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  t ) return;.  as
7160: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76  sert( pPg->pPrev
7170: 53 74 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Stmt==0 && pPg->
7180: 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a  pNextStmt==0 );.
7190: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
71a0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
71b0: 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  er->pStmt ){.   
71c0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e   pPager->pStmt->
71d0: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b  pPrevStmt = pPg;
71e0: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
71f0: 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e  tStmt = pPager->
7200: 70 53 74 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d  pStmt;.  pPager-
7210: 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  >pStmt = pPg;.  
7220: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pPg->inStmt = 1;
7230: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
7240: 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
7250: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
7260: 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50  *pPg){.  if( !pP
7270: 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75  g->inStmt ) retu
7280: 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  rn;.  if( pPg->p
7290: 50 72 65 76 53 74 6d 74 20 29 7b 0a 20 20 20 20  PrevStmt ){.    
72a0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72  assert( pPg->pPr
72b0: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
72c0: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
72d0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
72e0: 65 78 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  extStmt = pPg->p
72f0: 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  NextStmt;.  }els
7300: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7310: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d  Pg->pPager->pStm
7320: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
7330: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  g->pPager->pStmt
7340: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
7350: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  t;.  }.  if( pPg
7360: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20  ->pNextStmt ){. 
7370: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
7380: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
7390: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
73a0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
73b0: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
73c0: 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d  ->pPrevStmt;.  }
73d0: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  .  pPg->pNextStm
73e0: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50  t = 0;.  pPg->pP
73f0: 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  revStmt = 0;.  p
7400: 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
7410: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
7420: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
7430: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
7440: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
7450: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
7460: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
7470: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
7480: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
7490: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
74a0: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
74b0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
74c0: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65  PgHdr *p = pPage
74d0: 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68  r->aHash[pager_h
74e0: 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68  ash(pgno)];.  wh
74f0: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
7500: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
7510: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
7520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
7530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
7540: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
7550: 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  d clear the in-m
7560: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
7570: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
7580: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
7590: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
75a0: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
75b0: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
75c0: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
75d0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
75e0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
75f0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
7600: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
7610: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
7620: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
7630: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
7640: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
7650: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
7660: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7670: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
7680: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50 61 67  Next;.  if( pPag
7690: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 20 72 65  er->errMask ) re
76a0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d  turn;.  for(pPg=
76b0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
76c0: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
76d0: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
76e0: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
76f0: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
7700: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69   }.  pPager->pFi
7710: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
7720: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
7730: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
7740: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Last = 0;.  pPag
7750: 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20  er->pAll = 0;.  
7760: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
7770: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
7780: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
7790: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
77a0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
77b0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
77c0: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
77d0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
77e0: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
77f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55    }.  sqlite3OsU
7800: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
7810: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70  d, NO_LOCK);.  p
7820: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
7830: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70  AGER_UNLOCK;.  p
7840: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
7850: 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52  -1;.  pPager->nR
7860: 65 66 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ef = 0;.  assert
7870: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
7880: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  lOpen==0 );.}../
7890: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
78a0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
78b0: 73 65 74 20 74 68 65 20 70 61 67 65 72 20 61 66  set the pager af
78c0: 74 65 72 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66  ter a malloc() f
78d0: 61 69 6c 75 72 65 2e 20 54 68 69 73 0a 2a 2a 20  ailure. This.** 
78e0: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 77 69 74  doesn't work wit
78f0: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  h in-memory data
7900: 62 61 73 65 73 2e 20 49 66 20 61 20 6d 61 6c 6c  bases. If a mall
7910: 6f 63 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  oc() fails when 
7920: 61 6e 20 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  an .** in-memory
7930: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
7940: 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  use it is not po
7950: 73 73 69 62 6c 65 20 74 6f 20 72 65 63 6f 76 65  ssible to recove
7960: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  r..**.** If a tr
7970: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 74 61  ansaction or sta
7980: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
7990: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 69 74  on is active, it
79a0: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
79b0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  .**.** It is an 
79c0: 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68  error to call th
79d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 61  is function if a
79e0: 6e 79 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ny pages are in 
79f0: 75 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  use..*/.#ifndef 
7a00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42  SQLITE_OMIT_GLOB
7a10: 41 4c 52 45 43 4f 56 45 52 0a 69 6e 74 20 73 71  ALRECOVER.int sq
7a20: 6c 69 74 65 33 70 61 67 65 72 5f 72 65 73 65 74  lite3pager_reset
7a30: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7a40: 0a 20 20 69 66 28 20 70 50 61 67 65 72 20 29 7b  .  if( pPager ){
7a50: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
7a60: 3e 6e 52 65 66 20 7c 7c 20 4d 45 4d 44 42 20 29  >nRef || MEMDB )
7a70: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
7a80: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
7a90: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
7aa0: 72 72 4d 61 73 6b 20 26 3d 20 7e 28 50 41 47 45  rrMask &= ~(PAGE
7ab0: 52 5f 45 52 52 5f 4d 45 4d 29 3b 0a 20 20 20 20  R_ERR_MEM);.    
7ac0: 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
7ad0: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
7ae0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
7af0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68  endif.../*.** Wh
7b00: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7b10: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7b20: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7b30: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7b40: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
7b50: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
7b60: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7b70: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7b80: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
7b90: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
7ba0: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7bb0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7bc0: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
7bd0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
7be0: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
7bf0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
7c00: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
7c10: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
7c20: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
7c30: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
7c40: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
7c50: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
7c60: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
7c70: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
7c80: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
7c90: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
7ca0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
7cb0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
7cc0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
7cd0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
7ce0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
7cf0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
7d00: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
7d10: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
7d20: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
7d30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7d40: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
7d50: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
7d60: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
7d70: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
7d80: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
7d90: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
7da0: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
7db0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
7dc0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
7dd0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7de0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7df0: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7e00: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
7e10: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
7e20: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
7e30: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
7e40: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
7e50: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
7e60: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
7e70: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
7e80: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
7e90: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
7ea0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
7eb0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
7ec0: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
7ed0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
7ee0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
7ef0: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
7f00: 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  nc = 0;.#ifdef S
7f10: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
7f20: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
7f30: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
7f40: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
7f50: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
7f60: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
7f70: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
7f80: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
7f90: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7fa0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
7fb0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
7fc0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
7fd0: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
7fe0: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
7ff0: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63  l==0 );.  }.  rc
8000: 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   = sqlite3OsUnlo
8010: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
8020: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
8030: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
8040: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
8050: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
8060: 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ze = 0;.  pPager
8070: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
8080: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8090: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
80a0: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
80b0: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
80c0: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
80d0: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
80e0: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
80f0: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
8100: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8110: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
8120: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
8130: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
8140: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
8150: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
8160: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
8170: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
8180: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
8190: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
81a0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
81b0: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
81c0: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
81d0: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
81e0: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
81f0: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8200: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
8210: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
8220: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
8230: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
8240: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
8250: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
8260: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
8270: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
8280: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
8290: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
82a0: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
82b0: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
82c0: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
82d0: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
82e0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
82f0: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
8300: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
8310: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
8320: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
8330: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
8340: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
8350: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
8360: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
8370: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
8380: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
8390: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
83a0: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
83b0: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
83c0: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
83d0: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
83e0: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
83f0: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
8400: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
8410: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
8420: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
8430: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
8440: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
8450: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
8460: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
8470: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
8480: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
8490: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
84a0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
84b0: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
84c0: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
84d0: 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  no, const char *
84e0: 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
84f0: 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
8500: 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69  sumInit;.  int i
8510: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
8520: 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65  ize-200;.  while
8530: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
8540: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
8550: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
8560: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
8570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
8580: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
8590: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
85a0: 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69  ile opened on fi
85b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
85c0: 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20   jfd.  Playback 
85d0: 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  this one page..*
85e0: 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d  *.** If useCksum
85f0: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
8600: 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  s journal does n
8610: 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73  ot use checksums
8620: 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  .  Checksums.** 
8630: 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20  are not used in 
8640: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8650: 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65  ls because state
8660: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f  ment journals do
8670: 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20   not.** need to 
8680: 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61  survive power fa
8690: 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ilures..*/.stati
86a0: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
86b0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61  back_one_page(Pa
86c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46  ger *pPager, OsF
86d0: 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73  ile *jfd, int us
86e0: 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72  eCksum){.  int r
86f0: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
8720: 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
8730: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  che */.  Pgno pg
8740: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
8750: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
8760: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70  ge number of a p
8770: 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  age in journal *
8780: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73    /* Checksum us
87b0: 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ed for sanity ch
87c0: 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61  ecking */.  u8 a
87d0: 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41 58 5f  Data[SQLITE_MAX_
87e0: 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20  PAGE_SIZE];  /* 
87f0: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72  Temp storage for
8800: 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a   a page */..  /*
8810: 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64   useCksum should
8820: 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65   be true for the
8830: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
8840: 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a  d false for.  **
8850: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8860: 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  als.  Verify tha
8870: 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73  t this is always
8880: 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20   the case.  */. 
8890: 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20   assert( jfd == 
88a0: 28 75 73 65 43 6b 73 75 6d 20 3f 20 26 70 50 61  (useCksum ? &pPa
88b0: 67 65 72 2d 3e 6a 66 64 20 3a 20 26 70 50 61 67  ger->jfd : &pPag
88c0: 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 0a 0a 20  er->stfd) );... 
88d0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
88e0: 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  (jfd, &pgno);.  
88f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8900: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
8910: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
8920: 65 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c  ead(jfd, &aData,
8930: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8940: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
8950: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8960: 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   rc;.  pPager->j
8970: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
8980: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
8990: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
89a0: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
89b0: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
89c0: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
89d0: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
89e0: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
89f0: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
8a00: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
8a10: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
8a20: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
8a30: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
8a40: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
8a50: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
8a60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
8a70: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
8a80: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
8a90: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
8aa0: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
8ab0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
8ac0: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
8ad0: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
8ae0: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
8af0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8b00: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
8b10: 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69    if( pgno>(unsi
8b20: 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
8b30: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
8b40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8b50: 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20  .  if( useCksum 
8b60: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
8b70: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73  32bits(jfd, &cks
8b80: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
8b90: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
8ba0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8bb0: 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66  Off += 4;.    if
8bc0: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
8bd0: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74  ager, pgno, aDat
8be0: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
8bf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8c00: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
8c10: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
8c20: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
8c30: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
8c40: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
8c50: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
8c60: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
8c70: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
8c80: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
8c90: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
8ca0: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
8cb0: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
8cc0: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
8cd0: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
8ce0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
8cf0: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
8d00: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
8d10: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
8d20: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
8d30: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
8d40: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
8d50: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
8d60: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
8d70: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
8d80: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
8d90: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
8da0: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
8db0: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
8dc0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
8dd0: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
8de0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8df0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
8e00: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
8e10: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
8e20: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
8e30: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
8e40: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
8e50: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
8e60: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
8e70: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
8e80: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
8e90: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
8ea0: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
8eb0: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
8ec0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
8ed0: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
8ee0: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
8ef0: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
8f00: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
8f10: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
8f20: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
8f30: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
8f40: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
8f50: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
8f60: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69  s are in the mai
8f70: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
8f80: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
8f90: 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52  ise, if a full R
8fa0: 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61  OLLBACK occurs a
8fb0: 66 74 65 72 20 74 68 65 20 73 74 61 74 65 6d 65  fter the stateme
8fc0: 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  nt.  ** rollback
8fd0: 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41   the full ROLLBA
8fe0: 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74  CK will not rest
8ff0: 6f 72 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ore the page to 
9000: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
9010: 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20  * content.  Two 
9020: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
9030: 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  be met before wr
9040: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
9050: 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73  abase.  ** files
9060: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
9070: 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65  se must be locke
9080: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
9090: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
90a0: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74  l.  ** page cont
90b0: 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ent is in the ma
90c0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
90d0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
90e0: 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a  ge is not in.  *
90f0: 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20  * cache or else 
9100: 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
9110: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
9120: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
9130: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
9140: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
9150: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
9160: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
9170: 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 54 52  | pPg!=0 );.  TR
9180: 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE3("PLAYBACK %
9190: 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
91a0: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
91b0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67  gno);.  if( pPag
91c0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
91d0: 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70  _EXCLUSIVE && (p
91e0: 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65  Pg==0 || pPg->ne
91f0: 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20  edSync==0) ){.  
9200: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
9210: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
9220: 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
9230: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9240: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9250: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66  Write(&pPager->f
9260: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
9270: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9280: 20 69 66 28 20 70 50 67 20 29 20 70 50 67 2d 3e   if( pPg ) pPg->
9290: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dirty = 0;.  }. 
92a0: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
92b0: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
92c0: 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
92d0: 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
92e0: 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
92f0: 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
9300: 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
9310: 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
9320: 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
9330: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
9340: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
9350: 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
9360: 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
9370: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
9380: 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
9390: 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
93a0: 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
93b0: 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
93c0: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
93d0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
93e0: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
93f0: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
9400: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
9410: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
9420: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20  pPg->pgno==1 ); 
9430: 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50  */.    pData = P
9440: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
9450: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  );.    memcpy(pD
9460: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
9470: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9480: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
9490: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f  Destructor ){  /
94a0: 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f  *** FIX ME:  Sho
94b0: 75 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69  uld this be xRei
94c0: 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20  nit? ***/.      
94d0: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
94e0: 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65  tor(pData, pPage
94f0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9500: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
9510: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
9520: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
9530: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
9540: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
9550: 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
9560: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
9570: 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 3);.  }.  retu
9580: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9590: 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
95a0: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
95b0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
95c0: 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
95d0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
95e0: 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
95f0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
9600: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
9610: 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
9620: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
9630: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
9640: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
9650: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
9660: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
9670: 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
9680: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
9690: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
96a0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
96b0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
96c0: 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  l child journals
96d0: 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20  ..** To tell if 
96e0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
96f0: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c   can be deleted,
9700: 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f   check to each o
9710: 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65  f the.** childre
9720: 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64  n.  If all child
9730: 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d  ren are either m
9740: 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74  issing or do not
9750: 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64   refer to.** a d
9760: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20  ifferent master 
9770: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68  journal, then th
9780: 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  is master journa
9790: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
97a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
97b0: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
97c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
97d0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
97e0: 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65    int master_ope
97f0: 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20  n = 0;.  OsFile 
9800: 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20 2a  master;.  char *
9810: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
9820: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
9830: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
9840: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
9850: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
9860: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9870: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9880: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
9890: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
98a0: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
98b0: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
98c0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
98d0: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
98e0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
98f0: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
9900: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
9910: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
9920: 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61 73 74 65  .  memset(&maste
9930: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61 73  r, 0, sizeof(mas
9940: 74 65 72 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ter));.  rc = sq
9950: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
9960: 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61  nly(zMaster, &ma
9970: 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ster);.  if( rc!
9980: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
9990: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
99a0: 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  .  master_open =
99b0: 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   1;.  rc = sqlit
99c0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61  e3OsFileSize(&ma
99d0: 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
99e0: 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
99f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
9a00: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
9a10: 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72  ;..  if( nMaster
9a20: 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20  Journal>0 ){.   
9a30: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
9a40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
9a50: 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20  erPtr = 0;..    
9a60: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
9a70: 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
9a80: 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
9a90: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
9aa0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c      ** sqliteMal
9ab0: 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
9ac0: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
9ad0: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
9ae0: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
9af0: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
9b00: 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  iteMalloc(nMaste
9b10: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69  rJournal);.    i
9b20: 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
9b30: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
9b40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9b50: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9b60: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
9b70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9b80: 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20 7a  sRead(&master, z
9b90: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
9ba0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
9bb0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9bc0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
9bd0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
9be0: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
9bf0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
9c00: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
9c10: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
9c20: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
9c30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9c40: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
9c50: 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20  (zJournal) ){.  
9c60: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
9c70: 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
9c80: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
9c90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
9ca0: 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
9cb0: 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
9cc0: 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
9cd0: 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
9ce0: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
9cf0: 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
9d00: 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
9d10: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9d20: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
9d30: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46    */.        OsF
9d40: 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20  ile journal;.   
9d50: 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20       int c;..   
9d60: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f 75       memset(&jou
9d70: 72 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  rnal, 0, sizeof(
9d80: 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20 20  journal));.     
9d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9da0: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a  sOpenReadOnly(zJ
9db0: 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c  ournal, &journal
9dc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
9dd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9de0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
9df0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
9e00: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
9e10: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
9e20: 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c  Journal(&journal
9e30: 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a  , &zMasterPtr);.
9e40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
9e50: 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29  sClose(&journal)
9e60: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
9e70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9e80: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
9e90: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
9ea0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
9eb0: 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d  c = zMasterPtr!=
9ec0: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
9ed0: 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
9ee0: 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ==0;.        sql
9ef0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50  iteFree(zMasterP
9f00: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  tr);.        if(
9f10: 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
9f20: 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
9f30: 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
9f40: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9f50: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
9f60: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
9f70: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
9f80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9f90: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
9fa0: 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c  (strlen(zJournal
9fb0: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
9fc0: 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65    .  sqlite3OsDe
9fd0: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a  lete(zMaster);..
9fe0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
9ff0: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
a000: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
a010: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  eFree(zMasterJou
a020: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
a030: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
a040: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
a050: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
a060: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
a070: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76  }../*.** Make ev
a080: 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
a090: 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68  cache agree with
a0a0: 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
a0b0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
a0c0: 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65  s,.** reread the
a0d0: 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74   disk to reset t
a0e0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
a0f0: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
a100: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a110: 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  led after a roll
a120: 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f  back in which so
a130: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20  me of the dirty 
a140: 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68  cache.** pages h
a150: 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ad never been wr
a160: 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73  itten out to dis
a170: 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  k.  We need to r
a180: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  oll back the.** 
a190: 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  cache content an
a1a0: 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61  d the easiest wa
a1b0: 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20  y to do that is 
a1c0: 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c  to reread the ol
a1d0: 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63  d content.** bac
a1e0: 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e  k from the disk.
a1f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a200: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
a210: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
a220: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
a230: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a240: 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d  E_OK;.  for(pPg=
a250: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
a260: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
a270: 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20  tAll){.    char 
a280: 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f  zBuf[SQLITE_MAX_
a290: 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20  PAGE_SIZE];.    
a2a0: 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20  if( !pPg->dirty 
a2b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a2c0: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
a2d0: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
a2e0: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
a2f0: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
a300: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  &pPager->fd, pPa
a310: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
a320: 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  64)(pPg->pgno-1)
a330: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
a340: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
a350: 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
a360: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
a370: 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  ;.      TRACE3("
a380: 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65 20  REFETCH %d page 
a390: 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
a3a0: 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
a3b0: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
a3c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
a3d0: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42  CODEC(pPager, zB
a3e0: 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32  uf, pPg->pgno, 2
a3f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a400: 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c      memset(zBuf,
a410: 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
a420: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
a430: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
a440: 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66  0 || memcmp(zBuf
a450: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
a460: 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
a470: 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20  geSize) ){.     
a480: 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
a490: 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66  _DATA(pPg), zBuf
a4a0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a4b0: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ze);.      if( p
a4c0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
a4d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
a4e0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47  er->xReiniter(PG
a4f0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a500: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a510: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
a520: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
a530: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
a540: 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
a550: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
a560: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a570: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
a580: 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  c = 0;.    pPg->
a590: 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
a5a0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
a5b0: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
a5c0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
a5d0: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
a5e0: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
a5f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
a600: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
a610: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
a620: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
a630: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
a640: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f  ** indicated..*/
a650: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
a660: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
a670: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
a680: 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
a690: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
a6a0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
a6b0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
a6c0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50  e3OsTruncate(&pP
a6d0: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
a6e0: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
a6f0: 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nPage);.}../*.**
a700: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
a710: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
a720: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
a730: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
a740: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
a750: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
a760: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
a770: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
a780: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
a790: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
a7a0: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
a7b0: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
a7c0: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
a7d0: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
a7e0: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
a7f0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
a800: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
a810: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
a820: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
a830: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
a840: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
a850: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
a860: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
a870: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
a880: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
a890: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
a8a0: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
a8b0: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
a8c0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
a8d0: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
a8e0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
a8f0: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
a900: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
a910: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
a920: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
a930: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
a940: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
a950: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
a960: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
a970: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
a980: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
a990: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
a9a0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
a9b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a9c0: 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20  .**       name. 
a9d0: 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62   The value may b
a9e0: 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65  e zero (indicate
a9f0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
aa00: 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  o master.**     
aa10: 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20    journal.).**  
aa20: 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20  (6)  N bytes of 
aa30: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
aa40: 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61  al name.  The na
aa50: 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74  me will be nul-t
aa60: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20  erminated.**    
aa70: 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20     and might be 
aa80: 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65  shorter than the
aa90: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
aaa0: 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69   (5).  If the fi
aab0: 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  rst byte.**     
aac0: 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73    of the name is
aad0: 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65   \000 then there
aae0: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   is no master jo
aaf0: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74  urnal.  The mast
ab00: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
ab10: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72  nal name is stor
ab20: 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
ab30: 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (7)  Zero or mo
ab40: 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
ab50: 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
ab60: 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
ab70: 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
ab80: 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
ab90: 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
aba0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
abb0: 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
abc0: 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
abd0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
abe0: 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
abf0: 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
ac00: 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69  an the first 6 i
ac10: 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
ac20: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
ac30: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
ac40: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37  nstance of the 7
ac50: 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
ac60: 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
ac70: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
ac80: 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
ac90: 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
aca0: 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
acb0: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
acc0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
acd0: 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
ace0: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
acf0: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
ad00: 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
ad10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ad20: 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
ad30: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
ad40: 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
ad50: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
ad60: 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
ad70: 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
ad80: 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
ad90: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
ada0: 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
adb0: 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
adc0: 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
add0: 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
ade0: 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
adf0: 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
ae00: 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
ae10: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
ae20: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
ae30: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
ae40: 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
ae50: 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
ae60: 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
ae70: 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
ae80: 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
ae90: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
aea0: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
aeb0: 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
aec0: 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
aed0: 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
aee0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
aef0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
af00: 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
af10: 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
af20: 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
af30: 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
af40: 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
af50: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
af60: 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
af70: 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
af80: 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
af90: 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
afa0: 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
afb0: 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
afc0: 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
afd0: 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
afe0: 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
aff0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
b000: 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
b010: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
b020: 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
b030: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
b040: 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
b050: 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
b060: 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
b070: 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
b080: 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
b090: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b0a0: 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
b0b0: 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
b0c0: 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
b0d0: 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
b0e0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
b0f0: 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
b100: 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
b110: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
b120: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
b130: 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
b140: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
b150: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
b160: 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
b170: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
b180: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
b190: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b1a0: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
b1b0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
b1c0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
b1d0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b1e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b1f0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
b200: 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
b210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b220: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
b230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
b240: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b260: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b270: 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
b280: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b290: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
b2a0: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
b2b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b2d0: 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
b2e0: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
b2f0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
b300: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
b310: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
b320: 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
b330: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
b340: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
b350: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
b360: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
b370: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
b380: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
b390: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
b3a0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
b3b0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
b3c0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
b3d0: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
b3e0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
b3f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b400: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
b410: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
b420: 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
b430: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
b440: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
b450: 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
b460: 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
b470: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
b480: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
b490: 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
b4a0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
b4b0: 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
b4c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
b4d0: 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
b4e0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
b4f0: 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
b500: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
b510: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
b520: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  &pPager->jfd, &z
b530: 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72  Master);.  asser
b540: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
b550: 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  NE );.  if( rc!=
b560: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d  SQLITE_OK || (zM
b570: 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74 65  aster && !sqlite
b580: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d  3OsFileExists(zM
b590: 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73  aster)) ){.    s
b5a0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
b5b0: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
b5c0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  = 0;.    if( rc=
b5d0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
b5e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b5f0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
b600: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  back;.  }.  sqli
b610: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
b620: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50  r->jfd, 0);.  pP
b630: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b640: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
b650: 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
b660: 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65   either when the
b670: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
b680: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  ) call returns. 
b690: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20   ** SQLITE_DONE 
b6a0: 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  or an IO error o
b6b0: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c  ccurs. */.  whil
b6c0: 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
b6d0: 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
b6e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
b6f0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
b700: 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
b710: 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
b720: 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
b730: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
b740: 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
b750: 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
b760: 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
b770: 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
b780: 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
b790: 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
b7a0: 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
b7b0: 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
b7c0: 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
b7d0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
b7e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
b7f0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
b800: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
b810: 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
b820: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b830: 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
b840: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
b850: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
b860: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
b870: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
b880: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
b890: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
b8a0: 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
b8b0: 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
b8c0: 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
b8d0: 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
b8e0: 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
b8f0: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
b900: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
b910: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
b920: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
b930: 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
b940: 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
b950: 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
b960: 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
b970: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
b980: 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
b990: 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
b9a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b9b0: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
b9c0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
b9d0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
b9e0: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
b9f0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
ba00: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
ba10: 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
ba20: 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
ba30: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
ba40: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
ba50: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
ba60: 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
ba70: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
ba80: 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
ba90: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
baa0: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
bab0: 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  's original size
bac0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
bad0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
bae0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
baf0: 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
bb00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
bb10: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
bb20: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
bb30: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
bb40: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
bb50: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
bb60: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20  ize==mxPg );.   
bb70: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
bb80: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
bb90: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
bba0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bbb0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
bbc0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
bbd0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
bbe0: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
bbf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72  .    }..    /* r
bc00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
bc10: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
bc20: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
bc30: 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20  Pager)); */.    
bc40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
bc50: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61  K ) goto end_pla
bc60: 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a  yback;.  .    /*
bc70: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
bc80: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
bc90: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
bca0: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
bcb0: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
bcc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
bcd0: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Rec; i++){.     
bce0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
bcf0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
bd00: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
bd10: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fd, 1);.      if
bd20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bd30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
bd40: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
bd50: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
bd60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
bd70: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
bd80: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
bd90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bda0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
bdb0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
bdc0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
bdd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
bde0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
bdf0: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ages that have b
be00: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
be10: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e  he journal but n
be20: 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ever synced.  **
be30: 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f   where not resto
be40: 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20  red by the loop 
be50: 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20  above.  We have 
be60: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65  to restore those
be70: 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72  .  ** pages by r
be80: 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b  eading them back
be90: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
bea0: 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  al database..  *
beb0: 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  /.  assert( rc==
bec0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70  SQLITE_OK );.  p
bed0: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
bee0: 65 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f  e(pPager);..end_
bef0: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
bf00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bf10: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
bf20: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
bf30: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
bf40: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
bf50: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
bf60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
bf70: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
bf80: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65  will return true
bf90: 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
bfa0: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
bfb0: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
bfc0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
bfd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
bfe0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bff0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
c000: 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29  lmaster(zMaster)
c010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
c020: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
c030: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
c040: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
c050: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
c060: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
c070: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
c080: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
c090: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
c0a0: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
c0b0: 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43  ferent PAGER_SEC
c0c0: 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61  TOR_SIZE.  ** va
c0d0: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
c0e0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
c0f0: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
c100: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ess..  */.  pPag
c110: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
c120: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
c130: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ZE;.  return rc;
c140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
c150: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
c160: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c170: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
c180: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
c190: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
c1a0: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
c1b0: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
c1c0: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
c1d0: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
c1e0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
c1f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
c200: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
c210: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
c220: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
c230: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
c240: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
c250: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
c260: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
c270: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
c280: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
c290: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
c2a0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
c2b0: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
c2c0: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
c2d0: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
c2e0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
c2f0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
c300: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
c310: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
c320: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c330: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
c340: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
c350: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
c380: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
c390: 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
c3a0: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
c3b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c3c0: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
c3d0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c3e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
c3f0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
c400: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
c410: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c420: 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  Off;.#ifndef NDE
c430: 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34  BUG .  {.    i64
c440: 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20   os_szJ;.    rc 
c450: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
c460: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
c470: 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20  , &os_szJ);.    
c480: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c490: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
c4a0: 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d     assert( szJ==
c4b0: 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65  os_szJ );.  }.#e
c4c0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68  ndif..  /* Set h
c4d0: 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20  drOff to be the 
c4e0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 66 69  offset to the fi
c4f0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
c500: 65 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  er written.  ** 
c510: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74  this statement t
c520: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74  ransaction, or t
c530: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
c540: 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c  le if no journal
c550: 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73  .  ** header was
c560: 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   written..  */. 
c570: 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72   hdrOff = pPager
c580: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20  ->stmtHdrOff;.  
c590: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c5a0: 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72  fullSync || !hdr
c5b0: 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64  Off );.  if( !hd
c5c0: 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f  rOff ){.    hdrO
c5d0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
c5e0: 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
c5f0: 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
c600: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
c610: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   size..  */.  if
c620: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
c630: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
c640: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
c650: 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
c660: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  er, pPager->stmt
c670: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Size);.  }.  pPa
c680: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
c690: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a  ager->stmtSize;.
c6a0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
c6b0: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
c6c0: 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  s are in the sta
c6d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
c6e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
c6f0: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
c700: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
c710: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c  nalOpen );.  sql
c720: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
c730: 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
c740: 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73  nRec = pPager->s
c750: 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a  tmtNRec;.  .  /*
c760: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
c770: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
c780: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
c790: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
c7a0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
c7b0: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
c7c0: 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
c7d0: 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63   journal omits c
c7e0: 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20  hecksums from.  
c7f0: 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73  ** each record s
c800: 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75  ince power-failu
c810: 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e  re recovery is n
c820: 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  ot important to 
c830: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a  statement.  ** j
c840: 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
c850: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
c860: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63  =0; i--){.    rc
c870: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
c880: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
c890: 72 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64  r, &pPager->stfd
c8a0: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
c8b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
c8c0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
c8d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
c8e0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
c8f0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
c900: 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
c910: 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
c920: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
c930: 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
c940: 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
c950: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c960: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c970: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
c980: 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
c990: 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
c9a0: 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
c9b0: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
c9c0: 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
c9d0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
c9e0: 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
c9f0: 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
ca00: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
ca10: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
ca20: 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
ca30: 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
ca40: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
ca50: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
ca60: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
ca70: 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
ca80: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
ca90: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
caa0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
cab0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
cac0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
cad0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
cae0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
caf0: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
cb00: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
cb10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
cb20: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  = pPager->stmtJS
cb30: 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
cb40: 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65  ksumInit = pPage
cb50: 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20  r->stmtCksum;.  
cb60: 61 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f  assert( JOURNAL_
cb70: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28  HDR_SZ(pPager)<(
cb80: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
cb90: 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  +8) );.  while( 
cba0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cbb0: 66 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70  ff <= (hdrOff-(p
cbc0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
cbd0: 38 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  8)) ){.    rc = 
cbe0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
cbf0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
cc00: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29  &pPager->jfd, 1)
cc10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
cc20: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
cc30: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
cc40: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
cc50: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
cc60: 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70  .  }..  while( p
cc70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cc80: 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75  f < szJ ){.    u
cc90: 33 32 20 6e 52 65 63 3b 0a 20 20 20 20 75 33 32  32 nRec;.    u32
cca0: 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
ccb0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
ccc0: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
ccd0: 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
cce0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ccf0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
cd00: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
cd10: 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ONE );.      got
cd20: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
cd30: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ack;.    }.    i
cd40: 66 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20  f( nRec==0 ){.  
cd50: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
cd60: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
cd70: 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d  lOff) / (pPager-
cd80: 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20  >pageSize+8);.  
cd90: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 52    }.    for(i=nR
cda0: 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50  ec-1; i>=0 && pP
cdb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cdc0: 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20   < szJ; i--){.  
cdd0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
cde0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
cdf0: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
ce00: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20  ->jfd, 1);.     
ce10: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
ce20: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
ce30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ce40: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
ce50: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
ce60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
ce70: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
ce80: 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74  szJ;.  .end_stmt
ce90: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
cea0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ceb0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
cec0: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
ced0: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  RR_CORRUPT;.    
cee0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
cef0: 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f  UPT;  /* bkpt-CO
cf00: 52 52 55 50 54 20 2a 2f 0a 20 20 7d 65 6c 73 65  RRUPT */.  }else
cf10: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
cf20: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
cf30: 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c      /* pager_rel
cf40: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
cf50: 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ); */.  }.  retu
cf60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
cf70: 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
cf80: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
cf90: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
cfa0: 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
cfb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
cfc0: 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a  ger_set_cachesiz
cfd0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
cfe0: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
cff0: 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b  if( mxPage>10 ){
d000: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
d010: 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  age = mxPage;.  
d020: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
d030: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a  r->mxPage = 10;.
d040: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a    }.}../*.** Adj
d050: 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
d060: 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
d070: 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
d080: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
d090: 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
d0a0: 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
d0b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
d0c0: 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
d0d0: 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
d0e0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
d0f0: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
d100: 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
d110: 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
d120: 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
d130: 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
d140: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
d150: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
d160: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
d170: 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
d180: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
d190: 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
d1a0: 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
d1b0: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
d1c0: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
d1d0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
d1e0: 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
d1f0: 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
d200: 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
d210: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d220: 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
d230: 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
d240: 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
d250: 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
d260: 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
d270: 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
d280: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
d290: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
d2b0: 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
d2c0: 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
d2d0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d2e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d2f0: 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
d300: 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
d310: 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
d320: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
d330: 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
d340: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
d350: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
d360: 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
d370: 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
d380: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
d390: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
d3a0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
d3b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
d3c0: 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
d3d0: 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
d3e0: 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
d3f0: 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
d400: 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
d410: 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
d430: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
d440: 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
d450: 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
d460: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
d470: 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
d480: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
d490: 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
d4a0: 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
d4b0: 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
d4c0: 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
d4d0: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
d4e0: 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
d4f0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ck..**.** Numeri
d500: 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
d510: 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
d520: 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
d530: 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
d540: 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
d550: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d560: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
d570: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
d580: 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76  r_set_safety_lev
d590: 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
d5a0: 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20  , int level){.  
d5b0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
d5c0: 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50    level==1 || pP
d5d0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
d5e0: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
d5f0: 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26  nc = level==3 &&
d600: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
d610: 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  le;.  if( pPager
d620: 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
d630: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
d640: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
d650: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
d660: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
d670: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
d680: 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
d690: 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
d6a0: 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
d6b0: 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
d6c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
d6d0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
d6e0: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
d6f0: 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  nly.  .*/.int sq
d700: 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
d710: 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  ount = 0;../*.**
d720: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
d730: 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  y file.  Write t
d740: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
d750: 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a  ile into zFile.*
d760: 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20 62 65  * (zFile must be
d770: 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45   at least SQLITE
d780: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62  _TEMPNAME_SIZE b
d790: 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69  ytes long.)  Wri
d7a0: 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  te.** the file d
d7b0: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
d7c0: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
d7d0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
d7e0: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
d7f0: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
d800: 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54  we fail..**.** T
d810: 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
d820: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
d830: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
d840: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  le when it is.**
d850: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
d860: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61  ic int sqlite3pa
d870: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61  ger_opentemp(cha
d880: 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65  r *zFile, OsFile
d890: 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74   *fd){.  int cnt
d8a0: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
d8b0: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
d8c0: 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
d8d0: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
d8e0: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
d8f0: 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  ly */.  do{.    
d900: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
d910: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
d920: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20  (zFile);.    rc 
d930: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
d940: 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20  xclusive(zFile, 
d950: 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65  fd, 1);.  }while
d960: 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53  ( cnt>0 && rc!=S
d970: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
d980: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
d990: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d9a0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
d9b0: 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
d9c0: 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
d9d0: 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
d9e0: 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
d9f0: 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
da00: 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
da10: 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
da20: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
da30: 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
da40: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
da50: 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e  e3pager_get() an
da60: 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f  d is only held o
da70: 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  pen until the.**
da80: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
da90: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
daa0: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
dab0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
dac0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
dad0: 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
dae0: 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
daf0: 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
db00: 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
db10: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
db20: 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
db30: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
db40: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
db50: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
db60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
db70: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
db80: 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f  :" then all info
db90: 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
dba0: 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20  in cache..** It 
dbb0: 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
dbc0: 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
dbd0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
dbe0: 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69  mplement an.** i
dbf0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
dc00: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
dc10: 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50  3pager_open(.  P
dc20: 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
dc30: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
dc40: 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
dc50: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
dc60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
dc70: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
dc80: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
dc90: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
dca0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
dcc0: 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
dcd0: 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
dce0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
dcf0: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
dd00: 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
dd10: 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
dd20: 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61   file */.){.  Pa
dd30: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63  ger *pPager;.  c
dd40: 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
dd50: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61  me = 0;.  int na
dd60: 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20  meLen;.  OsFile 
dd70: 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fd;.  int rc = S
dd80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
dd90: 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  i;.  int tempFil
dda0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d  e = 0;.  int mem
ddb0: 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
ddc0: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e  adOnly = 0;.  in
ddd0: 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
dde0: 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
ddf0: 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a  IT_JOURNAL)==0;.
de00: 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
de10: 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
de20: 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
de30: 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  0;.  char zTemp[
de40: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
de50: 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67  SIZE];..  *ppPag
de60: 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  er = 0;.  memset
de70: 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&fd, 0, sizeof(
de80: 66 64 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  fd));.  if( sqli
de90: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
dea0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
deb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
dec0: 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  }.  if( zFilenam
ded0: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
dee0: 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ] ){.#ifndef SQL
def0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
df00: 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  B.    if( strcmp
df10: 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d  (zFilename,":mem
df20: 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ory:")==0 ){.   
df30: 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
df40: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
df50: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
df60: 28 22 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ("");.      rc =
df70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
df80: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
df90: 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61   {.      zFullPa
dfa0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
dfb0: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
dfc0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
dfd0: 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61   if( zFullPathna
dfe0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  me ){.        rc
dff0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
e000: 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50  ReadWrite(zFullP
e010: 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72  athname, &fd, &r
e020: 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20  eadOnly);.      
e030: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
e040: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e050: 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
e060: 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20  zTemp, &fd);.   
e070: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65   zFilename = zTe
e080: 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74  mp;.    zFullPat
e090: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
e0a0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
e0b0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
e0c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e0d0: 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c  ){.      tempFil
e0e0: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
e0f0: 0a 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74  .  if( !zFullPat
e100: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  hname ){.    sql
e110: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
e120: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
e130: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
e140: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e150: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
e160: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
e170: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
e180: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e190: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e1a0: 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72  .  nameLen = str
e1b0: 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  len(zFullPathnam
e1c0: 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73  e);.  pPager = s
e1d0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
e1e0: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
e1f0: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
e200: 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30  .  if( pPager==0
e210: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
e220: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
e230: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
e240: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e250: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e260: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  MEM;.  }.  TRACE
e270: 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
e280: 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  , FILEHANDLEID(f
e290: 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  d), zFullPathnam
e2a0: 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
e2b0: 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
e2c0: 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
e2d0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e2e0: 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
e2f0: 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31  lename[nameLen+1
e300: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
e310: 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
e320: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65  >zDirectory[name
e330: 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79  Len+1];.  strcpy
e340: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
e350: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
e360: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  e);.  strcpy(pPa
e370: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
e380: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e390: 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e  .  for(i=nameLen
e3a0: 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d  ; i>0 && pPager-
e3b0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
e3c0: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
e3d0: 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72  if( i>0 ) pPager
e3e0: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
e3f0: 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28  ] = 0;.  strcpy(
e400: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e410: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
e420: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
e430: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e440: 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d   strcpy(&pPager-
e450: 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65  >zJournal[nameLe
e460: 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b  n], "-journal");
e470: 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
e480: 66 64 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a  fd;.#if OS_UNIX.
e490: 20 20 70 50 61 67 65 72 2d 3e 66 64 2e 70 50 61    pPager->fd.pPa
e4a0: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65  ger = pPager;.#e
e4b0: 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ndif.  pPager->j
e4c0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
e4d0: 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
e4e0: 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
e4f0: 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70  l && !memDb;.  p
e500: 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
e510: 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26  k = noReadlock &
e520: 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50  & readOnly;.  pP
e530: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
e540: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
e550: 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70  mtInUse = 0;.  p
e560: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
e570: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
e580: 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70  e = memDb-1;.  p
e590: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
e5a0: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
e5b0: 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50  _PAGE_SIZE;.  pP
e5c0: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
e5d0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
e5e0: 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  mtJSize = 0;.  p
e5f0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
e600: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78  ;.  pPager->nMax
e610: 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Page = 0;.  pPag
e620: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30  er->mxPage = 100
e630: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
e640: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
e650: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  ;.  pPager->errM
e660: 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ask = 0;.  pPage
e670: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
e680: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
e690: 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b  ->memDb = memDb;
e6a0: 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
e6b0: 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
e6c0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
e6d0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
e6e0: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
e6f0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
e700: 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
e710: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
e720: 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
e730: 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d  ?0:1);.  pPager-
e740: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
e750: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
e760: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
e770: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
e780: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
e790: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
e7a0: 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61 67  (nExtra);.  pPag
e7b0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
e7c0: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
e7d0: 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  ZE;.  pPager->pB
e7e0: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a  usyHandler = 0;.
e7f0: 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
e800: 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
e810: 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
e820: 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  );.  *ppPager = 
e830: 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
e840: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e850: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
e860: 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
e870: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
e880: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73  te3pager_set_bus
e890: 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
e8a0: 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
e8b0: 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
e8c0: 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
e8d0: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
e8e0: 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
e8f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
e900: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
e910: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
e920: 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
e930: 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
e940: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
e950: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
e960: 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
e970: 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
e980: 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
e990: 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
e9a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
e9b0: 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
e9c0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
e9d0: 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
e9e0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
e9f0: 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
ea00: 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70 61  result sqlite3pa
ea10: 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a  ger_close().  .*
ea20: 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
ea30: 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
ea40: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
ea50: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
ea60: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
ea70: 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  destructor(Pager
ea80: 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
ea90: 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e  *xDesc)(void*,in
eaa0: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
eab0: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
eac0: 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
ead0: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
eae0: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
eaf0: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
eb00: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
eb10: 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
eb20: 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
eb30: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
eb40: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
eb50: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
eb60: 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
eb70: 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
eb80: 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
eb90: 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
eba0: 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
ebb0: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
ebc0: 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
ebd0: 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
ebe0: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
ebf0: 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
ec00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ec10: 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69  3pager_set_reini
ec20: 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
ec30: 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
ec40: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  t)(void*,int)){.
ec50: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
ec60: 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
ec70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
ec80: 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75  page size.  Retu
ec90: 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e  rn the new size.
eca0: 20 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74    If the suggest
ecb0: 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a   new page.** siz
ecc0: 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61  e is inappropria
ecd0: 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65  te, then an alte
ece0: 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a  rnative page siz
ecf0: 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a  e is selected.**
ed00: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a   and returned..*
ed10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
ed20: 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28  er_set_pagesize(
ed30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
ed40: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
ed50: 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
ed60: 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
ed70: 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
ed80: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28  GE_SIZE );.  if(
ed90: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
eda0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
edb0: 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
edc0: 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ze;.  }.  return
edd0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ede0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  e;.}../*.** Read
edf0: 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
ee00: 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
ee10: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
ee20: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
ee30: 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
ee40: 74 73 20 74 6f 2e 20 20 4e 6f 20 65 72 72 6f 72  ts to.  No error
ee50: 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
ee60: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
ee70: 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c  e3pager_read_fil
ee80: 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
ee90: 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
eea0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
eeb0: 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 44  st){.  memset(pD
eec0: 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66  est, 0, N);.  if
eed0: 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20  ( MEMDB==0 ){.  
eee0: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
eef0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b  &pPager->fd, 0);
ef00: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65  .    sqlite3OsRe
ef10: 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
ef20: 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 7d 0a 7d  pDest, N);.  }.}
ef30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
ef40: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
ef50: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
ef60: 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
ef70: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
ef80: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
ef90: 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
efa0: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
efb0: 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61 73  ){.  i64 n;.  as
efc0: 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
efd0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
efe0: 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  >dbSize>=0 ){.  
eff0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
f000: 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  >dbSize;.  }.  i
f010: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
f020: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64  Size(&pPager->fd
f030: 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , &n)!=SQLITE_OK
f040: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
f050: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
f060: 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72  _ERR_DISK;.    r
f070: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
f080: 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67  f( n>0 && n<pPag
f090: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
f0a0: 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c      n = 1;.  }el
f0b0: 73 65 7b 0a 20 20 20 20 6e 20 2f 3d 20 70 50 61  se{.    n /= pPa
f0c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
f0d0: 20 7d 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20   }.  if( !MEMDB 
f0e0: 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  && n==PENDING_BY
f0f0: 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
f100: 69 7a 65 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a  ize ){.    n++;.
f110: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
f120: 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
f130: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61  NLOCK ){.    pPa
f140: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
f150: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
f160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
f170: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
f180: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
f190: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
f1a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  .../*.** Unlink 
f1b0: 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
f1c0: 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73  sh chain. Also s
f1d0: 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  et the page numb
f1e0: 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63  er to 0 to indic
f1f0: 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ate.** that the 
f200: 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74  page is not part
f210: 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61   of any hash cha
f220: 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  in. This is requ
f230: 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65  ired because the
f240: 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
f250: 5f 6d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74  _movepage() rout
f260: 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20  ine can leave a 
f270: 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
f280: 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46  pNextFree/pPrevF
f290: 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  ree list that is
f2a0: 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61   not a part of a
f2b0: 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a  ny hash-chain..*
f2c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
f2d0: 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61  linkHashChain(Pa
f2e0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
f2f0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
f300: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
f310: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
f320: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 7a 65 72  ge number is zer
f330: 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  o, then this pag
f340: 65 20 69 73 20 6e 6f 74 20 69 6e 20 61 6e 79 20  e is not in any 
f350: 68 61 73 68 20 63 68 61 69 6e 2e 20 2a 2f 0a 20  hash chain. */. 
f360: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
f370: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
f380: 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
f390: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
f3a0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
f3b0: 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  vHash;.  }.  if(
f3c0: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
f3d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f3e0: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67  Pager->aHash[pag
f3f0: 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e  er_hash(pPg->pgn
f400: 6f 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20  o)]!=pPg );.    
f410: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e  pPg->pPrevHash->
f420: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
f430: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65  >pNextHash;.  }e
f440: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d  lse{.    int h =
f450: 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d   pager_hash(pPg-
f460: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
f470: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
f480: 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20  h[h]==pPg );.   
f490: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
f4a0: 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
f4b0: 73 68 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e  sh;.  }..  pPg->
f4c0: 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
f4d0: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
f4e0: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
f4f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
f500: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
f510: 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
f520: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
f530: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
f540: 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
f550: 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
f560: 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
f570: 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
f580: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
f590: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
f5a0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
f5b0: 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72  /* Keep the pFir
f5c0: 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72  stSynced pointer
f5d0: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
f5e0: 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69   first synchroni
f5f0: 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  zed page */.  if
f600: 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
f610: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
f620: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
f630: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
f640: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
f650: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
f660: 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
f670: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
f680: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
f690: 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
f6a0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
f6b0: 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  t */.  if( pPg->
f6c0: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
f6d0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
f6e0: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
f6f0: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
f700: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
f710: 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
f720: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
f730: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
f740: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
f750: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
f760: 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  xtFree ){.    pP
f770: 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
f780: 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
f790: 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73  PrevFree;.  }els
f7a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
f7b0: 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
f7c0: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
f7d0: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
f7e0: 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70  revFree;.  }.  p
f7f0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
f800: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
f810: 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b   0;..  /* Unlink
f820: 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
f830: 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  ash table */.  u
f840: 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
f850: 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a  Pager, pPg);.}..
f860: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f870: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
f880: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f890: 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
f8a0: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
f8b0: 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65   database.  Dele
f8c0: 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20  te.** all pages 
f8d0: 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61  whose pgno is la
f8e0: 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
f8f0: 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
f900: 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
f910: 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
f920: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
f930: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
f940: 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74   zeroed..*/.stat
f950: 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72  ic void memoryTr
f960: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
f970: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
f980: 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
f990: 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
f9a0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
f9b0: 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
f9c0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
f9d0: 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
f9e0: 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
f9f0: 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
fa00: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
fa10: 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
fa20: 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
fa30: 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
fa40: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
fa50: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
fa60: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
fa70: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
fa80: 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
fa90: 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
faa0: 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
fab0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
fac0: 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
fad0: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
fae0: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
faf0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
fb00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
fb10: 6c 73 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f  lse.#define memo
fb20: 72 79 54 72 75 6e 63 61 74 65 28 70 29 0a 23 65  ryTruncate(p).#e
fb30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ndif../*.** Try 
fb40: 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
fb50: 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76   on a file.  Inv
fb60: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
fb70: 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
fb80: 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  k.** is currentl
fb90: 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
fba0: 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74    Repeat until t
fbb0: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
fbc0: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73   returns.** fals
fbd0: 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c  e or until the l
fbe0: 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
fbf0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
fc00: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
fc10: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
fc20: 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
fc30: 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
fc40: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
fc50: 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
fc60: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
fc70: 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
fc80: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
fc90: 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
fca0: 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
fcb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
fcc0: 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
fcd0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
fce0: 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
fcf0: 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
fd00: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  VE_LOCK );.  if(
fd10: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
fd20: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
fd30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fd40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
fd50: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
fd60: 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
fd70: 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
fd80: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
fd90: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
fda0: 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  & sqlite3InvokeB
fdb0: 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
fdc0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r->pBusyHandler)
fdd0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
fde0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fdf0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
fe00: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
fe10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
fe20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
fe30: 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
fe40: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
fe50: 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e  pages specified.
fe60: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
fe70: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
fe80: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
fe90: 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
fea0: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67  rc;.  sqlite3pag
feb0: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
fec0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
fed0: 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
fee0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
fef0: 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
ff00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
ff10: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
ff20: 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  >=(unsigned)pPag
ff30: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
ff40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ff50: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  OK;.  }.  if( ME
ff60: 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
ff70: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
ff80: 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
ff90: 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
ffa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ffb0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
ffc0: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
ffd0: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
ffe0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fff0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
10000 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c    /* Get an excl
10010 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
10020 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
10030 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f  e truncating. */
10040 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
10050 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
10060 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
10070 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
10080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
10090 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
100a0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
100b0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61  cate(pPager, nPa
100c0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
100d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
100e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
100f0 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65   nPage;.  }.  re
10100 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10110 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
10120 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
10130 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
10140 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
10150 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
10160 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
10170 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
10180 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
10190 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
101a0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
101b0 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
101c0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
101d0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
101e0 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
101f0 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
10200 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
10210 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
10220 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
10230 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
10240 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
10250 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
10260 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
10270 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
10280 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
10290 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  _close(Pager *pP
102a0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
102b0 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73  pPg, *pNext;.  s
102c0 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73  witch( pPager->s
102d0 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65  tate ){.    case
102e0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a   PAGER_RESERVED:
102f0 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
10300 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73  SYNCED: .    cas
10310 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  e PAGER_EXCLUSIV
10320 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  E: {.      /* We
10330 20 69 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65   ignore any IO e
10340 72 72 6f 72 73 20 74 68 61 74 20 6f 63 63 75 72  rrors that occur
10350 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
10360 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6f 70  back.      ** op
10370 65 72 61 74 69 6f 6e 2e 20 53 6f 20 64 69 73 61  eration. So disa
10380 62 6c 65 20 49 4f 20 65 72 72 6f 72 20 73 69 6d  ble IO error sim
10390 75 6c 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  ulation so that 
103a0 74 65 73 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  testing.      **
103b0 20 77 6f 72 6b 73 20 6d 6f 72 65 20 65 61 73 69   works more easi
103c0 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 23 69 66  ly..      */.#if
103d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
103e0 54 45 53 54 29 20 26 26 20 28 64 65 66 69 6e 65  TEST) && (define
103f0 64 28 4f 53 5f 55 4e 49 58 29 20 7c 7c 20 64 65  d(OS_UNIX) || de
10400 66 69 6e 65 64 28 4f 53 5f 57 49 4e 29 29 0a 20  fined(OS_WIN)). 
10410 20 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20       extern int 
10420 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10430 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 20 20 20 20  _pending;.      
10440 69 6e 74 20 69 6f 65 72 72 5f 63 6e 74 20 3d 20  int ioerr_cnt = 
10450 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10460 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 20 20 20 20  _pending;.      
10470 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10480 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 23  _pending = -1;.#
10490 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69  endif.      sqli
104a0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
104b0 6b 28 70 50 61 67 65 72 29 3b 0a 23 69 66 20 64  k(pPager);.#if d
104c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
104d0 53 54 29 20 26 26 20 28 64 65 66 69 6e 65 64 28  ST) && (defined(
104e0 4f 53 5f 55 4e 49 58 29 20 7c 7c 20 64 65 66 69  OS_UNIX) || defi
104f0 6e 65 64 28 4f 53 5f 57 49 4e 29 29 0a 20 20 20  ned(OS_WIN)).   
10500 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72     sqlite3_io_er
10510 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 69 6f  ror_pending = io
10520 65 72 72 5f 63 6e 74 3b 0a 23 65 6e 64 69 66 0a  err_cnt;.#endif.
10530 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42        if( !MEMDB
10540 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10550 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
10560 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
10570 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10580 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10590 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 70 50 61 67  >errMask || pPag
105a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
105b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
105c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
105d0 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20  e PAGER_SHARED: 
105e0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d  {.      if( !MEM
105f0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  DB ){.        sq
10600 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
10610 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
10620 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
10630 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10640 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
10650 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
10660 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ng */.      brea
10670 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
10680 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
10690 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
106a0 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44  ext){.#ifndef ND
106b0 45 42 55 47 0a 20 20 20 20 69 66 28 20 4d 45 4d  EBUG.    if( MEM
106c0 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69  DB ){.      PgHi
106d0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
106e0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
106f0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
10700 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
10710 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
10720 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
10730 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
10740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
10750 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
10760 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
10770 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
10780 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
10790 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
107a0 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20    TRACE2("CLOSE 
107b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
107c0 50 61 67 65 72 29 29 3b 0a 20 20 61 73 73 65 72  Pager));.  asser
107d0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  t( pPager->errMa
107e0 73 6b 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  sk || (pPager->j
107f0 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26  ournalOpen==0 &&
10800 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
10810 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  n==0) );.  if( p
10820 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
10830 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
10840 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
10850 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  ->jfd);.  }.  sq
10860 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
10870 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
10880 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
10890 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
108a0 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
108b0 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20  er->stfd);.  }. 
108c0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
108d0 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
108e0 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
108f0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
10900 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
10910 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
10920 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
10930 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44   **   sqlite3OsD
10940 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
10950 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d  ilename);.  ** }
10960 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 46  .  */..  sqliteF
10970 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
10980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
109a0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
109b0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
109c0 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
109d0 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  o sqlite3pager_p
109e0 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a  agenumber(void *
109f0 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
10a00 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  *p = DATA_TO_PGH
10a10 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  DR(pData);.  ret
10a20 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  urn p->pgno;.}..
10a30 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72  /*.** The page_r
10a40 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ef() function in
10a50 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66  crements the ref
10a60 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
10a70 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74   a page..** If t
10a80 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
10a90 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
10aa0 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
10ab0 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
10ac0 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
10ad0 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
10ae0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  eelist..**.** Fo
10af0 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65  r non-test syste
10b00 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69  ms, page_ref() i
10b10 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63  s a macro that c
10b20 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29  alls _page_ref()
10b30 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68  .** online of th
10b40 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
10b50 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20  t is zero.  For 
10b60 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
10b70 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61  ge_ref().** is a
10b80 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73   real function s
10b90 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65  o that we can se
10ba0 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e  t breakpoints an
10bb0 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73  d trace it..*/.s
10bc0 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
10bd0 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
10be0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
10bf0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
10c00 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
10c10 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
10c20 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
10c30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
10c40 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ==pPg->pPager->p
10c50 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
10c60 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20       PgHdr *p = 
10c70 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
10c80 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26        while( p &
10c90 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
10ca0 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
10cb0 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e  e; }.      pPg->
10cc0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
10cd0 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  nced = p;.    }.
10ce0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
10cf0 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
10d00 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
10d10 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
10d20 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
10d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
10d40 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
10d50 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
10d60 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
10d70 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
10d80 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  ){.      pPg->pN
10d90 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
10da0 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
10db0 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
10dc0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
10dd0 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
10de0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
10df0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
10e00 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
10e10 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52  pPg->nRef++;.  R
10e20 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23  EFINFO(pPg);.}.#
10e30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
10e40 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
10e50 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20   page_ref(PgHdr 
10e60 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70  *pPg){.    if( p
10e70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
10e80 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70       _page_ref(p
10e90 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
10ea0 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b        pPg->nRef+
10eb0 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f  +;.      REFINFO
10ec0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
10ed0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
10ee0 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28  page_ref(P)   ((
10ef0 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67  P)->nRef==0?_pag
10f00 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28  e_ref(P):(void)(
10f10 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64  P)->nRef++).#end
10f20 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
10f30 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
10f40 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
10f50 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70  ge.  The input p
10f60 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72  ointer is.** a r
10f70 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
10f80 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e  page data..*/.in
10f90 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
10fa0 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
10fb0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
10fc0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
10fd0 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66  ata);.  page_ref
10fe0 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
10ff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11000 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
11010 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
11020 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
11030 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
11040 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
11050 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
11060 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
11070 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
11080 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
11090 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
110a0 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
110b0 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
110c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
110d0 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
110e0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
110f0 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
11100 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
11110 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
11120 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
11130 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
11140 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
11150 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
11160 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
11170 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
11180 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
11190 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
111a0 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
111b0 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
111c0 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
111d0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
111e0 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
111f0 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
11200 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
11210 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
11220 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
11230 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
11240 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
11250 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
11260 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
11270 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
11280 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
11290 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
112a0 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
112b0 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
112c0 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
112d0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
112e0 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
112f0 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
11300 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
11310 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
11320 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
11330 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
11340 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
11350 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
11360 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
11370 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
11380 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63  ure, so sync occ
11390 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  urs..**.** This 
113a0 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
113b0 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
113c0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
113d0 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
113e0 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
113f0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
11400 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
11410 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
11420 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
11430 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
11440 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
11450 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
11460 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
11470 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
11480 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
11490 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
114a0 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
114b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
114c0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
114d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
114e0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
114f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11500 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
11510 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  ;.      /* asser
11520 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
11530 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20  nc ); // noSync 
11540 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20  might be set if 
11550 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20  synchronous.    
11560 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20    ** was turned 
11570 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72  off after the tr
11580 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
11590 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23  arted.  Ticket #
115a0 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  615 */.#ifndef N
115b0 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20  DEBUG.      {.  
115c0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
115d0 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e  re the pPager->n
115e0 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61  Rec counter we a
115f0 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65  re keeping agree
11600 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  s.        ** wit
11610 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75  h the nRec compu
11620 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  ted from the siz
11630 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
11640 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
11650 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53  /.        i64 jS
11660 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  z;.        rc = 
11670 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
11680 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
11690 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  &jSz);.        i
116a0 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
116b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73  n rc;.        as
116c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
116d0 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b  urnalOff==jSz );
116e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
116f0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
11700 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
11710 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
11720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
11730 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
11740 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
11750 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
11760 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
11770 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
11780 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
11790 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
117a0 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
117b0 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
117c0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
117d0 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
117e0 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
117f0 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20  for rollback. . 
11800 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
11810 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
11820 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
11830 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43      TRACE2("SYNC
11840 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
11850 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
11860 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  r));.          r
11870 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
11880 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  c(&pPager->jfd, 
11890 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
118a0 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
118b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
118c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
118d0 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
118e0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
118f0 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
11900 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
11910 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
11920 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
11930 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
11940 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
11950 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
11960 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
11970 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
11980 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
11990 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
119a0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32    }.      TRACE2
119b0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
119c0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
119d0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
119e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
119f0 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
11a00 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  , pPager->fullSy
11a10 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
11a20 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
11a30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
11a40 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
11a50 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
11a60 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
11a70 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
11a80 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
11a90 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
11aa0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
11ab0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
11ac0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
11ad0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
11ae0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
11af0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
11b00 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
11b10 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
11b20 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69  >pFirst;.  }..#i
11b30 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
11b40 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
11b50 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
11b60 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50  clear then the P
11b70 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20  gHdr.needSync.  
11b80 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73  ** flag must als
11b90 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61  o be clear for a
11ba0 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66  ll pages.  Verif
11bb0 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
11bc0 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72   invariant is tr
11bd0 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ue..  */.  else{
11be0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
11bf0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
11c00 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
11c10 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l){.      assert
11c20 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
11c30 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
11c40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11c50 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
11c60 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a  ager->pFirst );.
11c70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
11c80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c90 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
11ca0 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
11cb0 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
11cc0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
11cd0 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
11ce0 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
11cf0 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
11d00 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
11d10 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
11d20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
11d30 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
11d40 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
11d50 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
11d60 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
11d70 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
11d80 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
11d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
11da0 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
11db0 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
11dc0 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
11dd0 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
11de0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
11df0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
11e00 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
11e10 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
11e20 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
11e30 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
11e40 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
11e50 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
11e60 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
11e70 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
11e80 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
11e90 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
11ea0 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
11eb0 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
11ec0 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
11ed0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
11ee0 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
11ef0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
11f00 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
11f10 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
11f20 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
11f30 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
11f40 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
11f50 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
11f60 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
11f70 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
11f80 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
11f90 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
11fa0 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
11fb0 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
11fc0 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
11fd0 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
11fe0 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
11ff0 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
12000 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
12010 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
12020 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
12030 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
12040 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
12050 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
12060 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
12070 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
12080 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
12090 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
120a0 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
120b0 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
120c0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
120d0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
120e0 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
120f0 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
12100 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
12110 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
12120 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
12130 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
12140 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
12150 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
12160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12170 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
12180 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
12190 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
121a0 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
121b0 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  y );.    sqlite3
121c0 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
121d0 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
121e0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
121f0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
12200 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
12210 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
12220 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
12230 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
12240 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
12250 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
12260 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
12270 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
12280 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
12290 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
122a0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
122b0 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
122c0 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
122d0 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
122e0 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
122f0 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
12300 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12310 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
12320 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
12330 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
12340 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
12350 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
12360 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20  >pgno, 6);.     
12370 20 54 52 41 43 45 33 28 22 53 54 4f 52 45 20 25   TRACE3("STORE %
12380 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
12390 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
123a0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
123b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
123c0 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
123d0 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
123e0 41 28 70 4c 69 73 74 29 2c 20 70 50 61 67 65 72  A(pList), pPager
123f0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
12400 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
12410 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
12420 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
12430 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 45  no, 0);.      TE
12440 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
12450 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23  nWrite);.    }.#
12460 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
12470 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52    else{.      TR
12480 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
12490 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
124a0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
124b0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
124c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
124d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
124e0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74  .    pList->dirt
124f0 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
12500 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
12510 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
12520 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
12530 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
12540 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
12550 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
12560 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
12570 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12580 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64   Collect every d
12590 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61  irty page into a
125a0 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a   dirty list and.
125b0 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** return a poin
125c0 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
125d0 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41  of that list.  A
125e0 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
125f0 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69  collected even i
12600 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c  f they are still
12610 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
12620 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
12630 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
12640 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ges(Pager *pPage
12650 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20  r){.  PgHdr *p, 
12660 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20  *pList;.  pList 
12670 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61  = 0;.  for(p=pPa
12680 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
12690 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
126a0 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29    if( p->dirty )
126b0 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74  {.      p->pDirt
126c0 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  y = pList;.     
126d0 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20   pList = p;.    
126e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
126f0 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  List;.}../*.** R
12700 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
12710 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
12720 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65  rnal on the give
12730 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f  n pager..** A ho
12740 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
12750 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
12760 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  e played back..*
12770 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
12780 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
12790 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
127a0 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
127b0 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
127c0 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
127d0 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
127e0 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
127f0 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
12800 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
12810 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65  e name.  Just de
12820 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
12830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12840 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
12850 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
12860 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65  if( !pPager->use
12870 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  Journal ) return
12880 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
12890 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70  e3OsFileExists(p
128a0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
128b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
128c0 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  f( sqlite3OsChec
128d0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 26 70  kReservedLock(&p
128e0 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74  Pager->fd) ) ret
128f0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
12900 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
12910 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29  unt(pPager)==0 )
12920 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  {.    sqlite3OsD
12930 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
12940 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74  ournal);.    ret
12950 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
12960 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12970 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  }.}../*.** Acqui
12980 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  re a page..**.**
12990 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   A read lock on 
129a0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73  the disk file is
129b0 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74   obtained when t
129c0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73  he first page is
129d0 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54   acquired. .** T
129e0 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  his read lock is
129f0 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68   dropped when th
12a00 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  e last page is r
12a10 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eleased..**.** A
12a20 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20   _get works for 
12a30 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20  any page number 
12a40 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20  greater than 0. 
12a50 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
12a60 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c  .** file is smal
12a70 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
12a80 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65  uested page, the
12a90 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b  n no actual disk
12aa0 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20  .** read occurs 
12ab0 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  and the memory i
12ac0 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  mage of the page
12ad0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12ae0 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e  to.** all zeros.
12af0 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61    The extra data
12b00 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
12b10 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
12b20 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20  itialized.** to 
12b30 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20  zeros the first 
12b40 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
12b50 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
12b60 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  y..**.** The acq
12b70 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
12b80 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
12b90 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
12ba0 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
12bb0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
12bc0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
12bd0 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
12be0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
12bf0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
12c00 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
12c10 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
12c20 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75  utine and _looku
12c30 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
12c40 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
12c50 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
12c60 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
12c70 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
12c80 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
12c90 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
12ca0 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
12cb0 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
12cc0 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a  ereas _lookup().
12cd0 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
12ce0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
12cf0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
12d00 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
12d10 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
12d20 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
12d30 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
12d40 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
12d50 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
12d60 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f  y..** Since _loo
12d70 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
12d80 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
12d90 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
12da0 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
12db0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
12dc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
12dd0 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50  er_get(Pager *pP
12de0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
12df0 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b   void **ppPage){
12e00 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
12e10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
12e20 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
12e30 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
12e40 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
12e50 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
12e60 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
12e70 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
12e80 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
12e90 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
12ea0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
12eb0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
12ec0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12ed0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
12ee0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
12ef0 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
12f00 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
12f10 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
12f20 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
12f30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
12f40 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
12f50 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47  >errMask & ~(PAG
12f60 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a  ER_ERR_FULL) ){.
12f70 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
12f80 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
12f90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
12fa0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
12fb0 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
12fc0 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
12fd0 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
12fe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12ff0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
13000 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
13010 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66  !MEMDB ){.    if
13020 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
13030 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  dlock ){.      r
13040 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
13050 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
13060 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
13070 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13090 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
130a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
130b0 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
130c0 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
130d0 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
130e0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
130f0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
13100 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
13110 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
13120 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
13130 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
13140 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f      if( hasHotJo
13150 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b  urnal(pPager) ){
13160 0a 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  .       int rc;.
13170 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  .       /* Get a
13180 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
13190 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
131a0 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
131b0 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
131c0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
131d0 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
131e0 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
131f0 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
13200 6f 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  o the.       ** 
13210 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
13220 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
13230 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
13240 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
13250 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
13260 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
13270 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
13280 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
13290 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61  the.       ** da
132a0 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
132b0 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
132c0 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
132d0 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20  ll rolling it . 
132e0 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
132f0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
13300 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
13310 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
13320 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
13330 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  t requested, the
13340 0a 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  .       ** secon
13350 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
13360 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
13370 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
13380 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
13390 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f  ** obtain it's o
133a0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
133b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
133c0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a  e file..       *
133d0 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
133e0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
133f0 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
13400 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
13410 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13420 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73  OK ){.         s
13430 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
13440 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
13450 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70  OCK);.         p
13460 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
13470 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
13480 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13490 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
134a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
134b0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
134c0 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;..       /* Ope
134d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
134e0 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20  r reading only. 
134f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   Return SQLITE_B
13500 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a  USY if.       **
13510 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
13520 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
13530 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  al file. .      
13540 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68   **.       ** Th
13550 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
13560 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
13570 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66  be locked itself
13580 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a  .  The.       **
13590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
135a0 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65   never open unle
135b0 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ss the main data
135c0 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a  base file holds.
135d0 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74         ** a writ
135e0 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65  e lock, so there
135f0 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68   is never any ch
13600 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ance of two or m
13610 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72  ore.       ** pr
13620 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20  ocesses opening 
13630 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74  the journal at t
13640 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
13650 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
13660 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
13670 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65 72  nReadOnly(pPager
13680 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
13690 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
136a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
136b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
136c0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
136d0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
136e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
136f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
13700 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
13710 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13720 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
13730 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
13740 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
13750 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   1;.       pPage
13760 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
13770 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  d = 0;.       pP
13780 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13790 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61   = 0;.       pPa
137a0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
137b0 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
137c0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
137d0 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c  0;..       /* Pl
137e0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
137f0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
13800 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
13810 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a  e write.       *
13820 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
13830 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
13840 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ck..       */.  
13850 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
13860 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
13870 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
13880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13890 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
138a0 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ;.       }.    }
138b0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
138c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65  }else{.    /* Se
138d0 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e  arch for page in
138e0 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50   cache */.    pP
138f0 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
13900 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
13910 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26      if( MEMDB &&
13920 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
13930 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
13940 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
13950 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
13960 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
13970 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
13980 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
13990 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
139a0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
139b0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a  . */.    int h;.
139c0 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50      TEST_INCR(pP
139d0 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
139e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
139f0 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61  age<pPager->mxPa
13a00 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46  ge || pPager->pF
13a10 69 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42  irst==0 || MEMDB
13a20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65   ){.      /* Cre
13a30 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a  ate a new page *
13a40 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71  /.      pPg = sq
13a50 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
13a60 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
13a70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
13aa0 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
13ab0 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20  ger->nExtra.    
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44            + MEMD
13ae0 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  B*sizeof(PgHisto
13af0 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ry) );.      if(
13b00 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
13b10 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
13b20 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
13b30 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74  MEM;.        ret
13b40 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13b60 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73  memset(pPg, 0, s
13b70 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20  izeof(*pPg));.  
13b80 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
13b90 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
13ba0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
13bb0 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
13bc0 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
13bd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13be0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
13bf0 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
13c00 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
13c10 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
13c20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
13c30 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
13c40 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
13c50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
13c60 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78  age>pPager->nMax
13c70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
13c80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13c90 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65  nMaxPage==(pPage
13ca0 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20  r->nPage-1) );. 
13cb0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
13cc0 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  MaxPage++;.     
13cd0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13ce0 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61      /* Find a pa
13cf0 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
13d00 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
13d10 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
13d20 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 71 75  ot.      ** requ
13d30 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
13d40 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
13d50 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
13d60 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61  .      pPg = pPa
13d70 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
13d80 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  d;..      /* If 
13d90 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  we could not fin
13da0 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  d a page that do
13db0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
13dc0 6e 20 66 73 79 6e 63 28 29 0a 20 20 20 20 20 20  n fsync().      
13dd0 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
13de0 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
13df0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
13e00 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
13e10 20 20 20 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f       ** very slo
13e20 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
13e30 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
13e40 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
13e50 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20 20 20 2a  ometimes.      *
13e60 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
13e70 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lped..      */. 
13e80 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
13e90 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
13ea0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
13eb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
13ec0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
13ed0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
13ee0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
13ef0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
13f00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
13f10 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
13f20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
13f30 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
13f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
13f50 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
13f60 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a  e, write a new j
13f70 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
13f80 74 6f 20 74 68 65 0a 09 20 20 2a 2a 20 6a 6f 75  to the..  ** jou
13f90 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
13fa0 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
13fb0 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
13fc0 61 20 6a 6f 75 72 6e 61 6c 0a 09 20 20 2a 2a 20  a journal..  ** 
13fd0 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69  header that is i
13fe0 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72  nvolved in the r
13ff0 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73  ollback of pages
14000 20 74 68 61 74 20 68 61 76 65 0a 09 20 20 2a 2a   that have..  **
14010 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
14020 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
14030 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
14040 68 65 20 68 65 61 64 65 72 20 69 73 0a 09 20 20  he header is..  
14050 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
14060 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
14070 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
14080 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14090 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
140a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
140b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
140c0 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b  ournalOff > 0 );
140d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
140e0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
140f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
14100 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
14110 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14120 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
14130 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
14140 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
14150 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
14160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14170 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  }.        pPg = 
14180 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
14190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
141a0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
141b0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
141c0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
141d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
141e0 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
141f0 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ty..      */.   
14200 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74     if( pPg->dirt
14210 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
14220 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
14230 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nc==0 );.       
14240 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
14250 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
14260 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
14270 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
14280 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
142a0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
142b0 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
142c0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
142d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
142e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
142f0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
14300 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
14310 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
14320 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72  he page we are r
14330 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b  ecycling is mark
14340 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
14350 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20  back, then.     
14360 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
14370 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
14380 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
14390 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  abling the.     
143a0 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f   ** sqlite_dont_
143b0 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  rollback() optim
143c0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
143d0 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
143e0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
143f0 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
14400 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
14410 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
14420 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
14430 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69  back.      ** mi
14440 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ght be reloaded 
14450 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20  at a later time 
14460 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  but at that poin
14470 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d  t we won't remem
14480 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ber.      ** tha
14490 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20  t is was marked 
144a0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20  alwaysRollback. 
144b0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
144c0 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a   all pages must.
144d0 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b        ** be mark
144e0 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
144f0 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
14500 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  n out..      */.
14510 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61        if( pPg->a
14520 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
14530 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
14540 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
14550 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
14560 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68      /* Unlink th
14570 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
14580 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
14590 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
145a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
145b0 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
145c0 0a 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52  .      TEST_INCR
145d0 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 29 3b  (pPager->nOvfl);
145e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
145f0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
14600 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
14610 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
14620 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
14630 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
14640 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65    sqlite3CheckMe
14650 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e  mory(pPager->aIn
14660 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29  Journal, pgno/8)
14670 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14680 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14690 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pen );.      pPg
146a0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
146b0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
146c0 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
146d0 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
146e0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
146f0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nc = 0;.    }els
14700 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
14710 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
14720 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
14730 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
14740 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
14750 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  tmt && (int)pgno
14760 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
14770 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
14780 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  && (pPager->aInS
14790 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  tmt[pgno/8] & (1
147a0 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20  <<(pgno&7)))!=0 
147b0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  ){.      page_ad
147c0 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
147d0 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
147e0 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76        page_remov
147f0 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
14800 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
14810 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
14820 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  .    pPg->nRef =
14830 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28   1;.    REFINFO(
14840 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72  pPg);.    pPager
14850 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20  ->nRef++;.    h 
14860 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e  = pager_hash(pgn
14870 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  o);.    pPg->pNe
14880 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
14890 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70  >aHash[h];.    p
148a0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
148b0 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
148c0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
148d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
148e0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
148f0 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
14900 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
14910 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
14920 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
14930 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
14940 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
14950 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
14960 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
14970 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
14980 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
14990 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
149a0 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ask!=0 ){.      
149b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
149c0 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ef(PGHDR_TO_DATA
149d0 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63  (pPg));.      rc
149e0 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
149f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14a00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14a10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14a20 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
14a30 70 50 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e  pPager)<(int)pgn
14a40 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  o ){.      memse
14a50 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
14a60 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
14a70 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14a80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
14a90 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72   rc;.      asser
14aa0 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
14ab0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
14ac0 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
14ad0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
14ae0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
14af0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14b00 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
14b10 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
14b20 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
14b30 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14b40 20 20 20 20 54 52 41 43 45 33 28 22 46 45 54 43      TRACE3("FETC
14b50 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
14b60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
14b70 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
14b80 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
14b90 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
14ba0 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
14bb0 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   3);.      if( r
14bc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14bd0 20 20 20 20 20 20 20 20 69 36 34 20 66 69 6c 65          i64 file
14be0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
14bf0 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  ( sqlite3OsFileS
14c00 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ize(&pPager->fd,
14c10 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49  &fileSize)!=SQLI
14c20 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
14c30 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65       || fileSize
14c40 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72 2d 3e 70  >=pgno*pPager->p
14c50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
14c60 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
14c70 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
14c80 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
14c90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
14ca0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14cb0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
14cc0 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
14cd0 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
14ce0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14cf0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
14d00 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f  e{.        TEST_
14d10 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
14d20 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ad);.      }.   
14d30 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
14d40 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
14d50 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
14d60 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
14d70 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
14d80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
14d90 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
14da0 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
14db0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53  ache. */.    TES
14dc0 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
14dd0 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72  Hit);.    page_r
14de0 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
14df0 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54  ppPage = PGHDR_T
14e00 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72  O_DATA(pPg);.  r
14e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
14e30 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
14e40 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
14e50 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
14e60 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
14e70 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
14e80 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
14e90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
14ea0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
14eb0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
14ec0 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
14ed0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
14ee0 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68  pager_get().  Th
14ef0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
14f00 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
14f10 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
14f20 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74  pager_get() is t
14f30 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
14f40 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
14f50 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
14f60 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
14f70 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
14f80 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
14f90 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
14fa0 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
14fb0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
14fc0 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
14fd0 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
14fe0 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
14ff0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
15000 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
15010 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15020 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
15030 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
15040 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
15050 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
15060 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
15070 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
15080 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
15090 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
150a0 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61  ;.  }.  pPg = pa
150b0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
150c0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
150d0 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pPg==0 ) return 
150e0 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  0;.  page_ref(pP
150f0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48  g);.  return PGH
15100 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
15110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
15120 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
15130 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
15140 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
15150 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
15160 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
15170 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
15180 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
15190 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
151a0 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
151b0 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
151c0 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
151d0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
151e0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
151f0 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
15200 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15210 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64  pager_unref(void
15220 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
15230 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65  r *pPg;..  /* De
15240 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
15250 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
15260 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20  this page.  */. 
15270 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50   pPg = DATA_TO_P
15280 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61  GHDR(pData);.  a
15290 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
152a0 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  >0 );.  pPg->nRe
152b0 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f--;.  REFINFO(p
152c0 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  Pg);..  CHECK_PA
152d0 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  GE(pPg);..  /* W
152e0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
152f0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
15300 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
15310 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
15320 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
15330 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
15340 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
15350 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
15360 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
15370 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61  *pPager;.    pPa
15380 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
15390 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
153a0 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70  tFree = 0;.    p
153b0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
153c0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20  pPager->pLast;. 
153d0 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
153e0 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
153f0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
15400 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
15410 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
15420 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c  e = pPg;.    }el
15430 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
15440 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a  ->pFirst = pPg;.
15450 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
15460 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26  g->needSync==0 &
15470 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  & pPager->pFirst
15480 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Synced==0 ){.   
15490 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
154a0 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20  tSynced = pPg;. 
154b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
154c0 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
154d0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
154e0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
154f0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
15500 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
15510 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c  .    /* When all
15520 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65   pages reach the
15530 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20   freelist, drop 
15540 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72  the read lock fr
15550 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  om.    ** the da
15560 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
15570 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
15580 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65  nRef--;.    asse
15590 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
155a0 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
155b0 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
155c0 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  & !MEMDB ){.    
155d0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
155e0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
155f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15600 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
15610 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
15620 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
15630 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
15640 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
15650 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
15660 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
15670 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
15680 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
15690 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
156a0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
156b0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
156c0 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
156d0 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
156e0 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
156f0 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
15700 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
15710 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
15720 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
15730 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
15740 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
15750 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  ( !MEMDB );.  as
15760 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
15770 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
15780 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
15790 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
157a0 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Open==0 );.  ass
157b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
157c0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
157d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
157e0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
157f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
15800 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
15810 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
15820 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  rnal = sqliteMal
15830 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
15840 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
15850 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
15860 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
15870 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15880 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  M;.    goto fail
15890 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
158a0 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  al;.  }.  rc = s
158b0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
158c0 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a  usive(pPager->zJ
158d0 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
158e0 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d  >jfd,pPager->tem
158f0 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72  pFile);.  pPager
15900 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
15910 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
15920 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
15930 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
15940 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
15950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15960 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
15970 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
15980 0a 20 20 53 45 54 5f 46 55 4c 4c 53 59 4e 43 28  .  SET_FULLSYNC(
15990 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
159a0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a  ger->fullSync);.
159b0 20 20 53 45 54 5f 46 55 4c 4c 53 59 4e 43 28 70    SET_FULLSYNC(p
159c0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
159d0 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  r->fullSync);.  
159e0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72  sqlite3OsOpenDir
159f0 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a  ectory(pPager->z
15a00 44 69 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67  Directory, &pPag
15a10 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67  er->jfd);.  pPag
15a20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
15a30 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
15a40 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
15a50 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
15a60 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
15a70 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
15a80 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
15a90 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
15aa0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
15ab0 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
15ac0 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
15ad0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 67 6f 74  pPager);.    got
15ae0 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
15af0 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
15b00 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
15b10 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
15b20 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  ize;..  rc = wri
15b30 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
15b40 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  ger);..  if( pPa
15b50 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
15b60 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
15b70 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
15b80 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
15b90 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  _begin(pPager);.
15ba0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
15bb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
15bc0 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
15bd0 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
15be0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15bf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
15c00 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
15c10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15c20 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
15c30 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
15c40 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
15c50 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29  ger->aInJournal)
15c60 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
15c70 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 73 71  ournal = 0;.  sq
15c80 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
15c90 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
15ca0 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
15cb0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
15cc0 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  OCK;.  return rc
15cd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
15ce0 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
15cf0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
15d00 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
15d10 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
15d20 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
15d30 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
15d40 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
15d50 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20  3pager_commit() 
15d60 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
15d70 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
15d80 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  rollback() is ca
15d90 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
15da0 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
15db0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
15dc0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
15dd0 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61  er_unref() is ca
15de0 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79  lled to on every
15df0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
15e00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
15e10 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  st parameter to 
15e20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15e30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79  a pointer to any
15e40 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68   open page of th
15e50 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
15e60 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61  le.  Nothing cha
15e70 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70  nges about the p
15e80 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64  age - it is used
15e90 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63   merely to.** ac
15ea0 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20  quire a pointer 
15eb0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
15ec0 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72  ucture and as pr
15ed0 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69  oof that there i
15ee0 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72  s.** already a r
15ef0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
15f00 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
15f10 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  The second param
15f20 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68  eter indicates h
15f30 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e  ow much space in
15f40 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76   bytes to reserv
15f50 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65  e for a.** maste
15f60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e  r journal file-n
15f70 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ame at the start
15f80 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
15f90 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74  when it is creat
15fa0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72  ed..**.** A jour
15fb0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
15fc0 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ed if this is no
15fd0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  t a temporary fi
15fe0 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61  le.  For tempora
15ff0 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65  ry.** files, the
16000 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20   opening of the 
16010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
16020 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
16030 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63  here is an.** ac
16040 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69  tual need to wri
16050 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
16060 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
16070 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
16080 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72  ady reserved for
16090 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72   writing, this r
160a0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
160b0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c  p..**.** If exFl
160c0 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61  ag is true, go a
160d0 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20  head and get an 
160e0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
160f0 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d  n the file.** im
16100 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61  mediately instea
16110 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74  d of waiting unt
16120 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75  il we try to flu
16130 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
16140 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20  he.** exFlag is 
16150 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61  ignored if a tra
16160 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
16170 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69  ady active..*/.i
16180 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
16190 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
161a0 61 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a  a, int exFlag){.
161b0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
161c0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
161d0 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
161e0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
161f0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
16200 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
16210 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
16220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
16230 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
16240 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
16250 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
16260 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
16270 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16280 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
16290 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
162a0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
162b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
162c0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
162d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
162e0 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
162f0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
16300 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
16310 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
16320 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
16330 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
16340 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16350 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
16360 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
16370 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
16380 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20       if( exFlag 
16390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
163a0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
163b0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
163c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
163d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
163e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
163f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16400 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16410 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
16420 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
16430 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32   0;.      TRACE2
16440 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
16450 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
16460 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ger));.      if(
16470 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
16480 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e  nal && !pPager->
16490 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
164a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
164b0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
164c0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
164d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
164e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
164f0 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
16500 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
16510 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
16520 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
16530 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
16540 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
16550 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
16560 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
16570 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
16580 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
16590 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
165a0 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
165b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
165c0 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
165d0 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
165e0 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
165f0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
16600 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
16610 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
16620 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
16630 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
16640 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
16650 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
16660 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
16670 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
16680 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
16690 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
166a0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
166b0 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
166c0 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
166d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
166e0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
166f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
16700 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
16710 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
16720 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
16730 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
16740 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
16750 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
16760 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
16770 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
16780 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
16790 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
167a0 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
167b0 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
167c0 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
167d0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61  all to sqlite3pa
167e0 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20  ger_commit() or 
167f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
16800 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65  lback() to.** re
16810 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  set..*/.int sqli
16820 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 76  te3pager_write(v
16830 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
16840 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
16850 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
16860 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
16870 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
16880 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16890 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
168a0 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
168b0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
168c0 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20  >errMask ){ .   
168d0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
168e0 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
168f0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
16900 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
16910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
16920 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
16930 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
16940 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
16950 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
16960 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
16970 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
16980 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
16990 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
169a0 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
169b0 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
169c0 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
169d0 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  way..  */.  pPg-
169e0 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69 66  >dirty = 1;.  if
169f0 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
16a00 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74   && (pPg->inStmt
16a10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   || pPager->stmt
16a20 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20  InUse==0) ){.   
16a30 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
16a40 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  che = 1;.  }else
16a50 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  {..    /* If we 
16a60 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
16a70 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
16a80 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
16a90 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  .    ** written 
16aa0 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
16ab0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  on journal or th
16ac0 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e ckeckpoint jou
16ad0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62  rnal.    ** or b
16ae0 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oth..    **.    
16af0 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
16b00 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
16b10 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
16b20 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
16b30 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69    ** create it i
16b40 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  f it does not.. 
16b50 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
16b60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
16b70 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
16b80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16b90 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61  3pager_begin(pDa
16ba0 74 61 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ta, 0);.    if( 
16bb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16bc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
16bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
16be0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
16bf0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
16c00 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  D );.    if( !pP
16c10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16c20 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  n && pPager->use
16c30 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
16c40 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
16c50 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
16c60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16c70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
16c80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16c90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16ca0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
16cb0 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  !pPager->useJour
16cc0 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
16cd0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
16ce0 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  1;.  .    /* The
16cf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
16d00 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
16d10 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
16d20 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
16d30 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
16d40 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
16d50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
16d60 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
16d70 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
16d80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16d90 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
16da0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
16db0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
16dc0 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
16dd0 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75  al && (pPager->u
16de0 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d  seJournal || MEM
16df0 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  DB) ){.      if(
16e00 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
16e10 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
16e20 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  bSize ){.       
16e30 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20   int szPg;.     
16e40 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20     u32 saved;.  
16e50 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
16e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
16e70 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
16e80 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
16e90 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
16ea0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f        TRACE3("JO
16eb0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
16ec0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
16ed0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
16ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
16ef0 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
16f00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
16f10 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
16f20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
16f30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16f40 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  e );.          i
16f50 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
16f60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
16f70 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
16f80 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
16f90 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
16fa0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16fc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16fd0 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
16fe0 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
16ff0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
17000 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
17010 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
17020 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70  _cksum(pPager, p
17030 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29  Pg->pgno, pData)
17040 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ;.          save
17050 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44 52  d = *(u32*)PGHDR
17060 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
17070 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17080 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63 6b    store32bits(ck
17090 73 75 6d 2c 20 70 50 67 2c 20 70 50 61 67 65 72  sum, pPg, pPager
170a0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
170b0 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50         szPg = pP
170c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
170d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  ;.          stor
170e0 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e  e32bits(pPg->pgn
170f0 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20  o, pPg, -4);.   
17100 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17110 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
17120 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72  er->jfd, &((char
17130 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a  *)pData)[-4], sz
17140 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Pg);.          p
17150 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
17160 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20  f += szPg;.     
17170 20 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f 55       TRACE4("JOU
17180 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
17190 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171b0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
171c0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
171d0 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
171e0 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50          CODEC(pP
171f0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
17200 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
17210 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48        *(u32*)PGH
17220 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
17230 20 70 50 61 67 65 72 29 20 3d 20 73 61 76 65 64   pPager) = saved
17240 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17260 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
17270 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
17280 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
17290 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
172a0 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
172b0 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  _ERR_FULL;.     
172c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
172d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
172e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
172f0 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
17300 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17310 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
17320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
17330 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
17340 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
17350 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
17360 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  ;.          pPg-
17370 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
17380 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
17390 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
173a0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
173b0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
173c0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
173d0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
173e0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
173f0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61            page_a
17400 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
17410 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
17420 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17440 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
17450 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
17460 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
17470 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
17480 20 20 20 20 20 54 52 41 43 45 34 28 22 41 50 50       TRACE4("APP
17490 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
174a0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
174c0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
174d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
174e0 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
174f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
17500 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
17510 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
17520 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
17530 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69    }.      pPg->i
17540 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
17550 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
17560 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
17570 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
17580 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
17590 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
175a0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
175b0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
175c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
175d0 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
175e0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
175f0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
17600 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
17610 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
17620 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
17630 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
17640 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
17650 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
17660 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
17670 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
17680 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
17690 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
176a0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
176b0 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
176c0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
176d0 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
176e0 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
176f0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
17700 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
17710 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
17720 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
17730 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
17740 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
17750 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
17760 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t->pStmt==0 );. 
17770 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
17780 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
17790 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
177a0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
177b0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
177c0 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
177d0 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
177e0 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Stmt, PGHDR_TO_D
177f0 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
17800 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
17820 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
17830 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
17840 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
17850 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
17860 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17870 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
17880 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
17890 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 43 4f   -4);.        CO
178a0 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
178b0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
178c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
178d0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
178e0 50 61 67 65 72 2d 3e 73 74 66 64 2c 28 28 63 68  Pager->stfd,((ch
178f0 61 72 2a 29 70 44 61 74 61 29 2d 34 2c 20 70 50  ar*)pData)-4, pP
17900 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
17910 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
17920 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
17930 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
17940 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
17950 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
17960 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
17970 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
17980 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  no, 0);.        
17990 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
179a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
179b0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
179c0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
179d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
179e0 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
179f0 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  _ERR_FULL;.     
17a00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17a20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
17a30 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
17a40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
17a50 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
17a60 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
17a70 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
17a80 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
17a90 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o&7);.      }.  
17aa0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
17ab0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
17ac0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
17ad0 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
17ae0 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
17af0 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
17b00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
17b10 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
17b20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
17b30 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
17b40 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
17b50 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
17b60 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
17b70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17b80 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17b90 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
17ba0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17bb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17bc0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
17bd0 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
17be0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
17bf0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
17c00 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ** to sqlite3pag
17c10 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20  er_write().  In 
17c20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
17c30 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
17c40 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
17c50 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
17c60 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e   the page..*/.in
17c70 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  t sqlite3pager_i
17c80 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20  swriteable(void 
17c90 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
17ca0 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
17cb0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
17cc0 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
17cd0 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  y;.}..#ifndef SQ
17ce0 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
17cf0 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
17d00 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
17d10 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
17d20 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
17d30 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
17d40 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
17d50 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  t sqlite3pager_o
17d60 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
17d70 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
17d80 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
17d90 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a  .  void *pPage;.
17da0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
17db0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
17dc0 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
17dd0 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
17de0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17df0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17e00 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
17e10 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
17e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17e30 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
17e40 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
17e50 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
17e60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
17e70 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
17e80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17e90 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17ea0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
17eb0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
17ec0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
17ed0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
17ee0 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
17ef0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
17f00 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63   page "pgno" bac
17f10 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
17f20 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
17f30 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
17f40 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
17f50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
17f60 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
17f70 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
17f80 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
17f90 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
17fa0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
17fb0 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
17fc0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
17fd0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
17fe0 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
17ff0 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
18000 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
18010 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
18020 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
18030 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
18040 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
18050 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
18060 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
18070 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
18080 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
18090 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
180a0 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
180b0 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
180c0 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
180d0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
180e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
180f0 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
18100 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
18110 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
18120 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
18130 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
18140 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
18150 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
18160 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
18170 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
18180 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
18190 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
181a0 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
181b0 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
181c0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
181d0 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
181e0 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
181f0 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
18200 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
18210 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
18220 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
18230 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
18240 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
18250 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
18260 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
18270 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
18280 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
18290 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
182a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
182b0 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
182c0 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
182d0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
182e0 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
182f0 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f  ause the page co
18300 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63  ntains.** critic
18310 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
18320 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
18330 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64  e it gets rolled
18340 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a   back in spite.*
18350 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f  * of the dont_ro
18360 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
18370 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
18380 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50  ger_dont_write(P
18390 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
183a0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
183b0 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d  r *pPg;..  if( M
183c0 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a  EMDB ) return;..
183d0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
183e0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
183f0 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79  o);.  pPg->alway
18400 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
18410 20 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d   if( pPg && pPg-
18420 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66  >dirty ){.    if
18430 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
18440 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
18450 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
18460 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
18470 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
18480 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
18490 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
184a0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
184b0 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
184c0 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
184d0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
184e0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
184f0 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
18500 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
18510 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
18520 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18530 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
18540 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
18550 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
18560 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
18570 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
18580 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
18590 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
185a0 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
185b0 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
185c0 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
185d0 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
185e0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
185f0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
18600 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
18610 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
18620 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
18630 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
18640 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
18650 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
18660 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
18670 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
18680 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
18690 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
186a0 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50  f %d\n", pgno, P
186b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
186c0 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
186d0 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
186e0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
186f0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
18700 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
18710 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
18720 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
18730 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
18740 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
18750 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
18760 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
18770 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
18780 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
18790 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
187a0 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
187b0 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
187c0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
187d0 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
187e0 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
187f0 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
18800 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
18810 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urnal..*/.void s
18820 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
18830 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _rollback(void *
18840 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
18850 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
18860 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
18870 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
18880 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69  Pg->pPager;..  i
18890 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
188a0 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  !=PAGER_EXCLUSIV
188b0 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  E || pPager->jou
188c0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
188d0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
188e0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
188f0 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
18900 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d  sRollback || MEM
18910 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
18920 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
18930 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
18940 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
18950 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
18960 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18970 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
18980 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
18990 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
189a0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
189b0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
189c0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
189d0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
189e0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
189f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
18a00 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
18a10 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
18a20 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
18a30 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
18a40 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
18a50 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e  .    TRACE3("DON
18a60 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
18a70 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
18a80 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
18a90 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
18aa0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
18ab0 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
18ac0 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
18ad0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
18ae0 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
18af0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
18b00 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
18b10 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
18b20 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
18b30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18b40 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
18b50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
18b60 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
18b70 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
18b80 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
18b90 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
18ba0 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
18bb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18bc0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
18bd0 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
18be0 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
18bf0 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
18c00 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
18c10 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
18c20 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  teFree(pHist->pO
18c30 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  rig);.  sqliteFr
18c40 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
18c50 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
18c60 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
18c70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73  Stmt = 0;.}.#els
18c80 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48  e.#define clearH
18c90 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66  istory(x).#endif
18ca0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
18cb0 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
18cc0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
18cd0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
18ce0 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
18cf0 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
18d00 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
18d10 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
18d20 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
18d30 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
18d40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
18d50 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
18d60 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
18d70 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
18d80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
18d90 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  er_commit(Pager 
18da0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
18db0 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
18dc0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
18dd0 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f  >errMask==PAGER_
18de0 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
18df0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
18e00 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
18e10 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
18e20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18e30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
18e40 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ULL;.    }.    r
18e50 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
18e60 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
18e70 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
18e80 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
18e90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
18ea0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
18eb0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
18ec0 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
18ed0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18ee0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
18ef0 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54    TRACE2("COMMIT
18f00 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18f10 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
18f20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67  MEMDB ){.    pPg
18f30 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
18f40 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
18f50 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ger);.    while(
18f60 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c   pPg ){.      cl
18f70 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52  earHistory(PGHDR
18f80 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
18f90 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50  ager));.      pP
18fa0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
18fb0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
18fc0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
18fd0 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
18fe0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
18ff0 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
19000 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
19010 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
19020 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  y;.    }.#ifndef
19030 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28   NDEBUG.    for(
19040 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
19050 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
19060 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
19070 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
19080 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
19090 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
190a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
190b0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
190c0 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
190d0 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
190e0 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
190f0 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
19100 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
19110 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
19120 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
19130 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
19140 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
19150 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19160 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
19170 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
19180 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65  ){.    /* Exit e
19190 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f  arly (without do
191a0 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e  ing the time-con
191b0 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  suming sqlite3Os
191c0 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20  Sync() calls).  
191d0 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61    ** if there ha
191e0 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
191f0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
19200 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
19210 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19220 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
19230 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
19240 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
19250 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
19260 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
19270 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
19280 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19290 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
192a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
192b0 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c  ger_sync(pPager,
192c0 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
192d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
192e0 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61     goto commit_a
192f0 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  bort;.  }.  rc =
19300 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
19310 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ck(pPager);.  pP
19320 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
19330 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
19340 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
19350 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
19360 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68   wrong during th
19370 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
19380 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62  ..  */.commit_ab
19390 6f 72 74 3a 0a 20 20 73 71 6c 69 74 65 33 70 61  ort:.  sqlite3pa
193a0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
193b0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
193c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
193d0 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
193e0 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
193f0 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
19400 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
19410 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  .** All in-memor
19420 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65  y cache pages re
19430 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72  vert to their or
19440 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74  iginal data cont
19450 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75  ents..** The jou
19460 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e  rnal is deleted.
19470 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19480 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ine cannot fail 
19490 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
194a0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
194b0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
194c0 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e  e correct lockin
194d0 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49  g protocol (SQLI
194e0 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20  TE_PROTOCOL) or 
194f0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
19500 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20  r.** process is 
19510 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e  writing trash in
19520 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
19530 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52  ile (SQLITE_CORR
19540 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73  UPT) or.** unles
19550 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63  s a prior malloc
19560 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54  () failed (SQLIT
19570 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f  E_NOMEM).  Appro
19580 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20  priate error.** 
19590 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e  codes are return
195a0 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  ed for all these
195b0 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68   occasions.  Oth
195c0 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54  erwise,.** SQLIT
195d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
195e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
195f0 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50  pager_rollback(P
19600 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19610 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45   int rc;.  TRACE
19620 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
19630 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
19640 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
19650 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
19660 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67  ;.    for(p=pPag
19670 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
19680 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
19690 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
196a0 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
196b0 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c  t( !p->alwaysRol
196c0 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  lback );.      i
196d0 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a  f( !p->dirty ){.
196e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
196f0 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
19700 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
19710 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20  pPager))->pOrig 
19720 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
19730 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
19740 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
19750 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74  p, pPager))->pSt
19760 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  mt );.        co
19770 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
19780 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
19790 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
197a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
197b0 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
197c0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
197d0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
197e0 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
197f0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
19800 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ze);.        TRA
19810 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE3("ROLLBACK-PA
19820 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  GE %d of %d\n", 
19830 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
19840 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
19850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19860 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
19870 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
19880 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
19890 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
198a0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61      }.      clea
198b0 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
198c0 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20  .      p->dirty 
198d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
198e0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
198f0 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30     p->inStmt = 0
19900 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76  ;.      p->pPrev
19910 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53  Stmt = p->pNextS
19920 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  tmt = 0;..      
19930 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
19940 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
19950 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
19960 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
19970 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  (p), pPager->pag
19980 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
19990 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20        .    }.   
199a0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
199b0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
199c0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
199d0 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20  >origDbSize;.   
199e0 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
199f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
19a00 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
19a10 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
19a20 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
19a30 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
19a40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19a50 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
19a60 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70  dirtyCache || !p
19a70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
19a80 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  en ){.    rc = p
19a90 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
19aa0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
19ab0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
19ac0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
19ad0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
19ae0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
19af0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  && pPager->errMa
19b00 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk!=PAGER_ERR_FU
19b10 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
19b20 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
19b30 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
19b40 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
19b50 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
19b60 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
19b70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
19b80 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
19b90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
19ba0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
19bb0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
19bc0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c    rc = pager_rel
19bd0 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
19be0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
19bf0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
19c00 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
19c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19c20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
19c30 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
19c40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
19c50 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
19c60 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
19c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c80 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
19c90 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f  UPT;  /* bkpt-CO
19ca0 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 70 50 61  RRUPT */.    pPa
19cb0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
19cc0 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
19cd0 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  T;.  }.  pPager-
19ce0 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
19cf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19d00 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
19d10 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
19d20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
19d30 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
19d40 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
19d50 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
19d60 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
19d70 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
19d80 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e  e3pager_isreadon
19d90 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
19da0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
19db0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
19dc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19dd0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
19de0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
19df0 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
19e00 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t *sqlite3pager_
19e10 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  stats(Pager *pPa
19e20 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
19e30 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
19e40 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
19e50 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
19e60 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
19e70 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
19e80 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
19e90 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
19ea0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
19eb0 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
19ec0 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 23 69 66  er->errMask;.#if
19ed0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
19ee0 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
19ef0 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
19f00 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
19f10 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[8] = pPager->
19f20 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20  nOvfl;.  a[9] = 
19f30 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
19f40 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
19f50 3e 6e 57 72 69 74 65 3b 0a 23 65 6e 64 69 66 0a  >nWrite;.#endif.
19f60 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f    return a;.}../
19f70 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
19f80 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
19f90 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
19fa0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
19fb0 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
19fc0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
19fd0 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
19fe0 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
19ff0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1a000 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
1a010 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
1a020 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
1a030 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
1a040 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
1a050 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
1a060 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
1a070 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1a080 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  mt_begin(Pager *
1a090 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1a0a0 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  c;.  char zTemp[
1a0b0 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
1a0c0 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28  SIZE];.  assert(
1a0d0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
1a0e0 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
1a0f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
1a100 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22  =0 );.  TRACE2("
1a110 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
1a120 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1a130 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1a140 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
1a150 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
1a160 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
1a170 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1a180 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
1a190 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1a1a0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
1a1b0 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
1a1c0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1a1d0 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
1a1e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a1f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1a200 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1a210 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  en );.  pPager->
1a220 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  aInStmt = sqlite
1a230 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
1a240 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
1a250 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
1a260 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
1a270 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70  sqlite3OsLock(&p
1a280 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
1a290 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74  D_LOCK);.    ret
1a2a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1a2b0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
1a2c0 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69  EBUG.  rc = sqli
1a2d0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
1a2e0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
1a2f0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
1a300 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
1a310 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
1a320 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ed;.  assert( pP
1a330 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
1a340 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  == pPager->journ
1a350 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a  alOff );.#endif.
1a360 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
1a370 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ize = pPager->jo
1a380 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
1a390 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
1a3a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1a3b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
1a3c0 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
1a3d0 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70  r->stmtCksum = p
1a3e0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
1a3f0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
1a400 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
1a410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1a420 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
1a430 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64  p, &pPager->stfd
1a440 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1a450 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
1a460 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67  failed;.    pPag
1a470 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
1a480 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1a490 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
1a4a0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1a4b0 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
1a4c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
1a4d0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
1a4e0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
1a4f0 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  aInStmt ){.    s
1a500 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
1a510 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->aInStmt);.    
1a520 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1a530 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1a540 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1a550 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
1a560 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1a570 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
1a580 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
1a590 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
1a5a0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1a5b0 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
1a5c0 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32  Next;.    TRACE2
1a5d0 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
1a5e0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1a5f0 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
1a600 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
1a610 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
1a620 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
1a630 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1a640 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67  OsTruncate(&pPag
1a650 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f  er->stfd, 0); */
1a660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
1a670 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  e( pPager->aInSt
1a680 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  mt );.      pPag
1a690 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
1a6a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
1a6b0 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
1a6c0 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
1a6d0 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  ){.      pNext =
1a6e0 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
1a6f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a700 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20  Pg->inStmt );.  
1a710 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
1a720 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1a730 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
1a740 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
1a750 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
1a760 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
1a770 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1a780 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1a790 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1a7a0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
1a7b0 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
1a7c0 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1a7d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1a7e0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
1a7f0 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
1a800 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1a810 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
1a820 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
1a830 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
1a840 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
1a850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a860 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
1a870 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
1a880 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1a890 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c  3pager_stmt_roll
1a8a0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1a8b0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1a8c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1a8d0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52  tInUse ){.    TR
1a8e0 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
1a8f0 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
1a900 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1a910 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1a920 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1a930 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
1a940 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
1a950 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
1a960 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50  Stmt){.        P
1a970 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1a980 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1a990 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1a9a0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
1a9b0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
1a9c0 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
1a9d0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1a9e0 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61  Hist->pStmt, pPa
1a9f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1aa00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1aa10 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
1aa20 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
1aa30 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
1aa40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1aa50 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1aa60 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1aa70 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
1aa80 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
1aa90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
1aaa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1aab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aac0 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f  rc = pager_stmt_
1aad0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
1aae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1aaf0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
1ab00 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
1ab10 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1ab20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ab30 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1ab40 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
1ab50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ab60 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
1ab70 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
1ab80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1ab90 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1aba0 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65  qlite3pager_file
1abb0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
1abc0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1abd0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
1abe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1abf0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
1ac00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1ac10 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
1ac20 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  ar *sqlite3pager
1ac30 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a  _dirname(Pager *
1ac40 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1ac50 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  n pPager->zDirec
1ac60 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tory;.}../*.** R
1ac70 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
1ac80 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
1ac90 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
1aca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1acb0 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c  te3pager_journal
1acc0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
1acd0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1ace0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
1acf0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ad00 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
1ad10 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
1ad20 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
1ad30 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
1ad40 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
1ad50 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
1ad60 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
1ad70 6c 69 74 65 33 70 61 67 65 72 5f 6e 6f 73 79 6e  lite3pager_nosyn
1ad80 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
1ad90 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1ada0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a  r->noSync;.}../*
1adb0 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
1adc0 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
1add0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ade0 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28  pager_set_codec(
1adf0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1ae00 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  ,.  void (*xCode
1ae10 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
1ae20 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
1ae30 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
1ae40 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
1ae50 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
1ae60 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
1ae70 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a  pCodecArg;.}../*
1ae80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ae90 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
1aea0 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61  crement the data
1aeb0 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
1aec0 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f  -counter,.** sto
1aed0 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f  red at byte 24 o
1aee0 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
1aef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1af00 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1af10 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
1af20 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64 20  pPager){.  void 
1af30 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72 20  *pPage;.  PgHdr 
1af40 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
1af50 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
1af60 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f   int rc;..  /* O
1af70 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
1af80 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
1af90 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ng. */.  rc = sq
1afa0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1afb0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65  Pager, 1, &pPage
1afc0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1afd0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1afe0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
1aff0 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
1b000 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1b010 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b020 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61  rn rc;..  /* Rea
1b030 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
1b040 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e 20  lue at byte 24. 
1b050 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44 41  */.  pPgHdr = DA
1b060 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61 67  TA_TO_PGHDR(pPag
1b070 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75  e);.  change_cou
1b080 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65 33  nter = retrieve3
1b090 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32 34  2bits(pPgHdr, 24
1b0a0 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  );..  /* Increme
1b0b0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
1b0c0 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
1b0d0 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
1b0e0 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65   24. */.  change
1b0f0 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73 74  _counter++;.  st
1b100 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e 67 65  ore32bits(change
1b110 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48 64 72  _counter, pPgHdr
1b120 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  , 24);..  /* Rel
1b130 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
1b140 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71  ference. */.  sq
1b150 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1b160 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
1b170 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b180 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
1b190 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
1b1a0 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
1b1b0 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
1b1c0 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
1b1d0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
1b1e0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
1b1f0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1b200 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
1b210 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
1b220 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
1b230 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
1b240 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
1b250 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
1b260 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
1b270 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
1b280 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
1b290 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
1b2a0 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
1b2b0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20  rnal is synced, 
1b2c0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1b2d0 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68  written.** to th
1b2e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b2f0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1b300 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68   file synced. Th
1b310 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
1b320 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20  t.** remains to 
1b330 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
1b340 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c  action is to del
1b350 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
1b360 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74  file (or.** mast
1b370 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b380 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
1b390 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
1b3a0 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
1b3b0 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
1b3c0 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
1b3d0 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
1b3e0 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
1b3f0 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63 61  3pager_sync() ca
1b400 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ll..**.** If par
1b410 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73  ameter nTrunc is
1b420 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
1b430 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
1b440 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a  s truncated to.*
1b450 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28  * nTrunc pages (
1b460 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  this is used by 
1b470 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1b480 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73  bases)..*/.int s
1b490 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
1b4a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1b4b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
1b4c0 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63  ter, Pgno nTrunc
1b4d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1b4e0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52 41 43  LITE_OK;..  TRAC
1b4f0 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E4("DATABASE SYN
1b500 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
1b510 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c  er=%s nTrunc=%d\
1b520 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
1b530 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
1b540 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  aster, nTrunc);.
1b550 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1b560 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62   an in-memory db
1b570 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61  , or no pages ha
1b580 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1b590 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a  to, or this.  **
1b5a0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
1b5b0 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
1b5c0 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
1b5d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1b5e0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1b5f0 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d  R_SYNCED && !MEM
1b600 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69  DB && pPager->di
1b610 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20  rtyCache ){.    
1b620 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
1b630 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b640 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a  journalOpen );..
1b650 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74      /* If a mast
1b660 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b670 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79  name has already
1b680 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1b690 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
1b6a0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  nal file, then n
1b6b0 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  o sync is requir
1b6c0 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ed. This happens
1b6d0 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20   when it is.    
1b6e0 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e  ** written, then
1b6f0 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69   the process fai
1b700 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ls to upgrade fr
1b710 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f  om a RESERVED to
1b720 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
1b730 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e  SIVE lock. The n
1b740 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f  ext time the pro
1b750 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f  cess tries to co
1b760 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  mmit the.    ** 
1b770 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20  transaction the 
1b780 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61  m-j name will ha
1b790 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1b7a0 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
1b7b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1b7c0 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20  >setMaster ){.  
1b7d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
1b7e0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1b7f0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
1b800 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b810 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1b820 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  xit;.#ifndef SQL
1b830 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1b840 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54  UUM.      if( nT
1b850 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
1b860 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72     /* If this tr
1b870 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61  ansaction has ma
1b880 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
1b890 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c  smaller, then al
1b8a0 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20 20  l pages.        
1b8b0 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
1b8c0 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
1b8d0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
1b8e0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
1b8f0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1b900 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
1b910 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a          Pgno i;.
1b920 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 50          void *pP
1b930 61 67 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  age;.        for
1b940 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c  ( i=nTrunc+1; i<
1b950 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1b960 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
1b970 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67        if( !(pPag
1b980 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69  er->aInJournal[i
1b990 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29  /8] & (1<<(i&7))
1b9a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1b9b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1b9c0 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 69  er_get(pPager, i
1b9d0 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
1b9e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b9f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1ba00 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
1ba10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ba20 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
1ba30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1ba40 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
1ba50 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
1ba60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1ba70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1ba80 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1ba90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1baa0 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e    } .      }.#en
1bab0 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77  dif.      rc = w
1bac0 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
1bad0 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
1bae0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1baf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1bb00 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1bb10 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
1bb20 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1bb30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1bb40 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1bb50 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23  c_exit;.    }..#
1bb60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bb70 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1bb80 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
1bb90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1bba0 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63  lite3pager_trunc
1bbb0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
1bbc0 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
1bbd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1bbe0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1bbf0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1bc00 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
1bc10 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
1bc20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1bc30 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
1bc40 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1bc50 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
1bc60 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1bc70 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
1bc80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1bc90 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1bca0 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20  sync_exit;..    
1bcb0 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
1bcc0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1bcd0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
1bce0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
1bcf0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1bd00 63 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  c(&pPager->fd, 0
1bd10 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
1bd20 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1bd30 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a  GER_SYNCED;.  }.
1bd40 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65  .sync_exit:.  re
1bd50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1bd60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bd70 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
1bd80 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 69   Move the page i
1bd90 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 61  dentified by pDa
1bda0 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  ta to location p
1bdb0 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
1bdc0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75   .**.** There mu
1bdd0 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
1bde0 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72 65  ces to the curre
1bdf0 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66  nt page pgno. If
1be00 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a   current page.**
1be10 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
1be20 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  eady in the roll
1be30 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
1be40 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
1be50 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74  there by.** by t
1be60 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65  his routine. The
1be70 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f   same applies to
1be80 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61 20   the page pData 
1be90 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74  refers to on ent
1bea0 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ry to.** this ro
1beb0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
1bec0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
1bed0 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  age refered to b
1bee0 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76  y pData remain v
1bef0 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
1bf00 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
1bf10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1bf20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e  page pData (i.e.
1bf30 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
1bf40 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
1bf50 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
1bf60 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
1bf70 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
1bf80 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1bf90 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
1bfa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1bfb0 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
1bfc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1bfd0 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
1bfe0 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
1bff0 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
1c000 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
1c010 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
1c020 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
1c030 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
1c040 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
1c050 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
1c060 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
1c070 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
1c080 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
1c090 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tive)..*/.int sq
1c0a0 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70  lite3pager_movep
1c0b0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
1c0c0 72 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  r, void *pData, 
1c0d0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1c0e0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
1c0f0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
1c100 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
1c110 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67  ; .  int h;.  Pg
1c120 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  no needSyncPgno 
1c130 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1c140 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
1c150 20 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25    TRACE5("MOVE %
1c160 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
1c170 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
1c180 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
1c190 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c1a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
1c1b0 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b  needSync, pgno);
1c1c0 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  ..  if( pPg->nee
1c1d0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65  dSync ){.    nee
1c1e0 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
1c1f0 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
1c200 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1c210 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
1c220 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20   pPg->dirty );. 
1c230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c240 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
1c250 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
1c260 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
1c270 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e  sh-chain */.  un
1c280 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
1c290 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f  ager, pPg);..  /
1c2a0 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63  * If the cache c
1c2b0 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77  ontains a page w
1c2c0 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ith page-number 
1c2d0 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a  pgno, remove it.
1c2e0 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68    ** from it's h
1c2f0 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
1c300 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
1c310 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
1c320 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
1c330 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
1c340 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
1c350 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
1c360 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
1c370 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
1c380 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
1c390 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
1c3a0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1c3b0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
1c3c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c3d0 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
1c3e0 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
1c3f0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
1c400 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 4f  PgOld);.    pPgO
1c410 6c 64 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  ld->dirty = 0;. 
1c420 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e     if( pPgOld->n
1c430 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
1c440 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
1c450 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  >inJournal );.  
1c460 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1c470 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  al = 1;.      pP
1c480 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  g->needSync = 1;
1c490 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c4a0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1c4b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1c4c0 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  /* Change the pa
1c4d0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50  ge number for pP
1c4e0 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  g and insert it 
1c4f0 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73  into the new has
1c500 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 70 50  h-chain. */.  pP
1c510 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
1c520 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68    h = pager_hash
1c530 28 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50  (pgno);.  if( pP
1c540 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29  ager->aHash[h] )
1c550 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1c560 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1c570 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
1c580 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
1c590 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
1c5a0 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
1c5b0 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
1c5c0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
1c5d0 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
1c5e0 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  h] = pPg;.  pPg-
1c5f0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
1c600 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20  .  pPg->dirty = 
1c610 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  1;.  pPager->dir
1c620 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20  tyCache = 1;..  
1c630 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
1c640 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
1c650 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
1c660 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
1c670 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
1c680 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
1c690 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
1c6a0 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
1c6b0 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
1c6c0 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
1c6d0 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
1c6e0 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
1c6f0 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
1c700 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
1c710 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
1c720 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e  * Pager.aInJourn
1c730 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20  al bit has been 
1c740 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
1c750 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
1c760 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a  y loading.    **
1c770 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
1c780 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
1c790 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
1c7a0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
1c7b0 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
1c7c0 2a 20 54 68 65 20 73 71 6c 69 74 65 33 70 61 67  * The sqlite3pag
1c7d0 65 72 5f 67 65 74 28 29 20 63 61 6c 6c 20 6d 61  er_get() call ma
1c7e0 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
1c7f0 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
1c800 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
1c810 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
1c820 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
1c830 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
1c840 69 6e 74 20 72 63 3b 0a 20 20 20 20 76 6f 69 64  int rc;.    void
1c850 20 2a 70 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20   *pNeedSync;.   
1c860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c870 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
1c880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1c890 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 6e  er_get(pPager, n
1c8a0 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e  eedSyncPgno, &pN
1c8b0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 69 66  eedSync);.    if
1c8c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c8d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1c8e0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1c8f0 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f  c = 1;.    DATA_
1c900 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1c910 6e 63 29 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  nc)->needSync = 
1c920 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50  1;.    DATA_TO_P
1c930 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d  GHDR(pNeedSync)-
1c940 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1c950 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44      DATA_TO_PGHD
1c960 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 64 69  R(pNeedSync)->di
1c970 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  rty = 1;.    sql
1c980 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
1c990 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a  pNeedSync);.  }.
1c9a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c9b0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
1c9c0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1c9d0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1c9e0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1c9f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1ca00 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1ca10 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b  of the file lock
1ca20 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
1ca30 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74  ager..** The ret
1ca40 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65  urn value is one
1ca50 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41   of NO_LOCK, SHA
1ca60 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
1ca70 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44  ED_LOCK,.** PEND
1ca80 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43  ING_LOCK, or EXC
1ca90 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a  LUSIVE_LOCK..*/.
1caa0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1cab0 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72  _lockstate(Pager
1cac0 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65   *pPager){.#ifde
1cad0 66 20 4f 53 5f 54 45 53 54 0a 20 20 72 65 74 75  f OS_TEST.  retu
1cae0 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 66  rn pPager->fd->f
1caf0 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6c 73  d.locktype;.#els
1cb00 65 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  e.  return pPage
1cb10 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a  r->fd.locktype;.
1cb20 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a  #endif.}.#endif.
1cb30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1cb40 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
1cb50 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
1cb60 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
1cb70 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
1cb80 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
1cb90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
1cba0 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67  dump(Pager *pPag
1cbb0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
1cbc0 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  g;.  for(pPg=pPa
1cbd0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
1cbe0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
1cbf0 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  l){.    if( pPg-
1cc00 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69  >nRef<=0 ) conti
1cc10 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nue;.    sqlite3
1cc20 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47  DebugPrintf("PAG
1cc30 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52  E %3d addr=%p nR
1cc40 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ef=%d\n", .     
1cc50 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48    pPg->pgno, PGH
1cc60 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1cc70 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d   pPg->nRef);.  }
1cc80 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69  .}.#endif..#endi
1cc90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1cca0 5f 44 49 53 4b 49 4f 20 2a 2f 0a                 _DISKIO */.