/ Hex Artifact Content
Login

Artifact a48f537db37de0433fd1b527e64d08c1a5bcce19:


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 30  : pager.c,v 1.20
0350: 32 20 32 30 30 35 2f 30 34 2f 32 38 20 31 37 3a  2 2005/04/28 17:
0360: 31 38 3a 34 38 20 64 72 68 20 45 78 70 20 24 0a  18:48 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 73 41 6c 69 67 6e   pPager->psAlign
1d60: 65 64 20 62 79 74 65 73 20 6f 66 20 70 61 67 65  ed bytes of page
1d70: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69   data follow thi
1d80: 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a  s header */.  /*
1d90: 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
1da0: 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74  tes of local dat
1db0: 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67  a follow the pag
1dc0: 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e data */.};../*
1dd0: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65  .** For an in-me
1de0: 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61  mory only databa
1df0: 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69  se, some extra i
1e00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  nformation is re
1e10: 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20  corded about.** 
1e20: 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61  each page so tha
1e30: 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65  t changes can be
1e40: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28   rolled back.  (
1e50: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  Journal files ar
1e60: 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f  e not.** used fo
1e70: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
1e80: 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c  bases.)  The fol
1e90: 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  lowing informati
1ea0: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  on is added to.*
1eb0: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  * the end of eve
1ec0: 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66  ry EXTRA block f
1ed0: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1ee0: 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  abases..**.** Th
1ef0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  is information c
1f00: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61  ould have been a
1f10: 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f  dded directly to
1f20: 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63   the PgHdr struc
1f30: 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65  ture..** But the
1f40: 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20  n it would take 
1f50: 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79  up an extra 8 by
1f60: 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f  tes of storage o
1f70: 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a  n every PgHdr.**
1f80: 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62   even for disk-b
1f90: 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20  ased databases. 
1fa0: 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75   Splitting it ou
1fb0: 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e  t saves 8 bytes.
1fc0: 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c    This.** is onl
1fd0: 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30  y a savings of 0
1fe0: 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65  .8% but those pe
1ff0: 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70  rcentages add up
2000: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2010: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67  uct PgHistory Pg
2020: 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20  History;.struct 
2030: 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38  PgHistory {.  u8
2040: 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20   *pOrig;     /* 
2050: 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65  Original page te
2060: 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20  xt.  Restore to 
2070: 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72  this on a full r
2080: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20  ollback */.  u8 
2090: 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54  *pStmt;     /* T
20a0: 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74  ext as it was at
20b0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
20c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
20d0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f  atement */.};../
20e0: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
20f0: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
2100: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
2110: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
2120: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
2130: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
2140: 45 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  EC(P,D,N,X) if( 
2150: 50 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d 3e  P->xCodec ){ P->
2160: 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63  xCodec(P->pCodec
2170: 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65  Arg,D,N,X); }.#e
2180: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  lse.# define COD
2190: 45 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64  EC(P,D,N,X).#end
21a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
21b0: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
21c0: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
21d0: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
21e0: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
21f0: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
2200: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
2210: 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b    ((void*)(&(P)[
2220: 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54  1])).#define DAT
2230: 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28  A_TO_PGHDR(D)  (
2240: 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d  &((PgHdr*)(D))[-
2250: 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44  1]).#define PGHD
2260: 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20  R_TO_EXTRA(G,P) 
2270: 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a  ((void*)&((char*
2280: 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d  )(&(G)[1]))[(P)-
2290: 3e 70 73 41 6c 69 67 6e 65 64 5d 29 0a 23 64 65  >psAligned]).#de
22a0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
22b0: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
22c0: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
22d0: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
22e0: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
22f0: 3e 70 73 41 6c 69 67 6e 65 64 2b 28 50 47 52 29  >psAligned+(PGR)
2300: 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a  ->nExtra])../*.*
2310: 2a 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b  * How big to mak
2320: 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
2330: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69   used for locati
2340: 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ng in-memory pag
2350: 65 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75  es.** by page nu
2360: 6d 62 65 72 2e 20 54 68 69 73 20 6d 61 63 72 6f  mber. This macro
2370: 20 6c 6f 6f 6b 73 20 61 20 6c 69 74 74 6c 65 20   looks a little 
2380: 73 69 6c 6c 79 2c 20 62 75 74 20 69 73 20 65 76  silly, but is ev
2390: 61 6c 75 61 74 65 64 0a 2a 2a 20 61 74 20 63 6f  aluated.** at co
23a0: 6d 70 69 6c 65 2d 74 69 6d 65 2c 20 6e 6f 74 20  mpile-time, not 
23b0: 72 75 6e 2d 74 69 6d 65 20 28 61 74 20 6c 65 61  run-time (at lea
23c0: 73 74 20 66 6f 72 20 67 63 63 20 74 68 69 73 20  st for gcc this 
23d0: 69 73 20 74 72 75 65 29 2e 0a 2a 2f 0a 23 64 65  is true)..*/.#de
23e0: 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 28  fine N_PG_HASH (
23f0: 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 31  \.  (MAX_PAGES>1
2400: 30 32 34 29 3f 32 30 34 38 3a 20 5c 0a 20 20 28  024)?2048: \.  (
2410: 4d 41 58 5f 50 41 47 45 53 3e 35 31 32 29 3f 31  MAX_PAGES>512)?1
2420: 30 32 34 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41  024: \.  (MAX_PA
2430: 47 45 53 3e 32 35 36 29 3f 35 31 32 3a 20 5c 0a  GES>256)?512: \.
2440: 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 32 38    (MAX_PAGES>128
2450: 29 3f 32 35 36 3a 20 5c 0a 20 20 28 4d 41 58 5f  )?256: \.  (MAX_
2460: 50 41 47 45 53 3e 36 34 29 3f 31 32 38 3a 36 34  PAGES>64)?128:64
2470: 20 5c 0a 29 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68   \.)../*.** Hash
2480: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a   a page number.*
2490: 2f 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  /.#define pager_
24a0: 68 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26  hash(PN)  ((PN)&
24b0: 28 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a  (N_PG_HASH-1))..
24c0: 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67  /*.** A open pag
24d0: 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e  e cache is an in
24e0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
24f0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2500: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  e..*/.struct Pag
2510: 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  er {.  char *zFi
2520: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2530: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2540: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2550: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
2560: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2570: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2580: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
2590: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
25a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
25b0: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
25c0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
25d0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
25e0: 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20  OsFile fd, jfd; 
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2600: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2610: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
2620: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
2630: 46 69 6c 65 20 73 74 66 64 3b 20 20 20 20 20 20  File stfd;      
2640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
2650: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
2660: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
2670: 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e  ubjournal*/.  in
2680: 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  t dbSize;       
2690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26a0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
26b0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
26c0: 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20  t origDbSize;   
26d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
26e0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
26f0: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f  urrent change */
2700: 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b  .  int stmtSize;
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2720: 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61  * Size of databa
2730: 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74  se (in pages) at
2740: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
2750: 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65  .  i64 stmtJSize
2760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2770: 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
2780: 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  l at stmt_begin(
2790: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  ) */.  int nRec;
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27c0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
27d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
27e0: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2800: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
2810: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
2820: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
2830: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2850: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
2860: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
2870: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
2880: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
2890: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
28a0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
28b0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
28c0: 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  age */.  void (*
28d0: 78 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69  xDestructor)(voi
28e0: 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  d*,int); /* Call
28f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
2900: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
2910: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
2920: 69 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e  initer)(void*,in
2930: 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68  t);   /* Call th
2940: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
2950: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
2960: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
2970: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2980: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2990: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
29a0: 0a 20 20 69 6e 74 20 70 73 41 6c 69 67 6e 65 64  .  int psAligned
29b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29c0: 2a 20 70 61 67 65 53 69 7a 65 20 72 6f 75 6e 64  * pageSize round
29d0: 65 64 20 75 70 20 74 6f 20 61 20 6d 75 6c 74 69  ed up to a multi
29e0: 70 6c 65 20 6f 66 20 38 20 2a 2f 0a 20 20 69 6e  ple of 8 */.  in
29f0: 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
2a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
2a10: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  al number of in-
2a20: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a  memory pages */.
2a30: 20 20 69 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20    int nMaxPage; 
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a50: 20 48 69 67 68 20 77 61 74 65 72 20 6d 61 72 6b   High water mark
2a60: 20 6f 66 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69   of nPage */.  i
2a70: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
2a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a90: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
2aa0: 79 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48  y pages with PgH
2ab0: 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69  dr.nRef>0 */.  i
2ac0: 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20  nt mxPage;      
2ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2ae0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
2af0: 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e  pages to hold in
2b00: 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20   cache */.  int 
2b10: 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76  nHit, nMiss, nOv
2b20: 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63 68 65  fl;     /* Cache
2b30: 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20   hits, missing, 
2b40: 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77  and LRU overflow
2b50: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  s */.  int nRead
2b60: 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20  ,nWrite;        
2b70: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
2b80: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
2b90: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  n */.  void (*xC
2ba0: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
2bb0: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
2bc0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
2bd0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
2be0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
2bf0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g;            /*
2c00: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
2c10: 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20  to xCodec() */. 
2c20: 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b   u8 journalOpen;
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c40: 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
2c50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2c60: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75   is valid */.  u
2c70: 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  8 journalStarted
2c80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
2c90: 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20  ue if header of 
2ca0: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
2cb0: 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75  d */.  u8 useJou
2cc0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
2cd0: 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c     /* Use a roll
2ce0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20  back journal on 
2cf0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75  this file */.  u
2d00: 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20  8 noReadlock;   
2d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2d20: 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f   not bother to o
2d30: 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20  btain readlocks 
2d40: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e  */.  u8 stmtOpen
2d50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d60: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2d70: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
2d80: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a  rnal is open */.
2d90: 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20    u8 stmtInUse; 
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2db0: 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20   True we are in 
2dc0: 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
2dd0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
2de0: 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b  u8 stmtAutoopen;
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e00: 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c  pen stmt journal
2e10: 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e   when main journ
2e20: 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20  al is opened*/. 
2e30: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e50: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
2e60: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
2e70: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
2e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e90: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
2ea0: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
2eb0: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
2ec0: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20   */.  u8 state; 
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43    /* PAGER_UNLOC
2ef0: 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53  K, _SHARED, _RES
2f00: 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20  ERVED, etc. */. 
2f10: 20 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20 20   u8 errMask;    
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f30: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
2f40: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
2f50: 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b  /.  u8 tempFile;
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f70: 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  /* zFilename is 
2f80: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2f90: 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c   */.  u8 readOnl
2fa0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
2fb0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
2fc0: 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
2fd0: 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  se */.  u8 needS
2fe0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2ff0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
3000: 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65  n fsync() is nee
3010: 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  ded on the journ
3020: 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79  al */.  u8 dirty
3030: 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20  Cache;          
3040: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
3050: 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76 65  ached pages have
3060: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38   changed */.  u8
3070: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b   alwaysRollback;
3080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
3090: 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61  able dont_rollba
30a0: 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67  ck() for all pag
30b0: 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62  es */.  u8 memDb
30c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
30e0: 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20  nhibit all file 
30f0: 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  I/O */.  u8 *aIn
3100: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
3110: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
3120: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3130: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3140: 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53  le */.  u8 *aInS
3150: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
3160: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
3170: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
3180: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
3190: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31b0: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
31c0: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
31d0: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
31e0: 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70    BusyHandler *p
31f0: 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a  BusyHandler;  /*
3200: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
3210: 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a  te.busyHandler *
3220: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
3230: 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20  t, *pLast;      
3240: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
3250: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
3260: 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20   *pFirstSynced; 
3270: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3280: 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50  free page with P
3290: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30  gHdr.needSync==0
32a0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
32b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
32c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
32d0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
32e0: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
32f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
3300: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3310: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
3320: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
3330: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
3340: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
3350: 20 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20   byte offset in 
3360: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3370: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3380: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
3390: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
33a0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
33b0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
33c0: 20 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b   i64 stmtHdrOff;
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33e0: 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  First journal he
33f0: 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 68 69  ader written thi
3400: 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
3410: 20 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20   i64 stmtCksum; 
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3430: 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73  cksumInit when s
3440: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
3450: 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65  rted */.  int se
3460: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
3470: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
3480: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
3490: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
34a0: 20 20 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e    PgHdr *aHash[N
34b0: 5f 50 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a  _PG_HASH];    /*
34c0: 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d   Hash table to m
34d0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ap page number t
34e0: 6f 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f  o PgHdr */.};../
34f0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62  *.** These are b
3500: 69 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  its that can be 
3510: 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72  set in Pager.err
3520: 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  Mask..*/.#define
3530: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
3540: 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77      0x01  /* a w
3550: 72 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f  rite() failed */
3560: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
3570: 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32  RR_MEM      0x02
3580: 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61    /* malloc() fa
3590: 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  iled */.#define 
35a0: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20  PAGER_ERR_LOCK  
35b0: 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f     0x04  /* erro
35c0: 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  r in the locking
35d0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65   protocol */.#de
35e0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43  fine PAGER_ERR_C
35f0: 4f 52 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a  ORRUPT  0x08  /*
3600: 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75   database or jou
3610: 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
3620: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3630: 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78  _ERR_DISK     0x
3640: 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64  10  /* general d
3650: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20  isk I/O error - 
3660: 62 61 64 20 68 61 72 64 20 64 72 69 76 65 3f 20  bad hard drive? 
3670: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  */../*.** Journa
3680: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
3690: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
36a0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
36b0: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
36c0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
36d0: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
36e0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
36f0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
3700: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
3710: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
3720: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3730: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
3740: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
3750: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
3760: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
3770: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
3780: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
3790: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
37a0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
37b0: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
37c0: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
37d0: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
37e0: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
37f0: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
3800: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
3810: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
3820: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
3830: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
3840: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
3850: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
3860: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
3870: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
3880: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
3890: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
38a0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
38b0: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
38c0: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
38d0: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
38e0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
38f0: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
3900: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
3910: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
3920: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
3930: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
3940: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
3950: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
3960: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
3970: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
3980: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
3990: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
39a0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
39b0: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
39c0: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
39d0: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
39e0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
39f0: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
3a00: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
3a10: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
3a20: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
3a30: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
3a40: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
3a50: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
3a60: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
3a70: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
3a80: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
3a90: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
3aa0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
3ab0: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
3ac0: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
3ad0: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
3ae0: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
3af0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
3b00: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
3b10: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
3b20: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
3b30: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
3b40: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
3b50: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
3b60: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
3b70: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
3b80: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
3b90: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3ba0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
3bb0: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
3bc0: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
3bd0: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
3be0: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
3bf0: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
3c00: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
3c10: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
3c20: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
3c30: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
3c40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
3c50: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
3c60: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
3c70: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
3c80: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
3c90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
3ca0: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
3cb0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
3cc0: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
3cd0: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
3ce0: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
3cf0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
3d00: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
3d10: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
3d20: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
3d30: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
3d40: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
3d50: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
3d60: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3d70: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
3d80: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
3d90: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
3da0: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
3db0: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
3dc0: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
3dd0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
3de0: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
3df0: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
3e00: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
3e10: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
3e20: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
3e30: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
3e40: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
3e50: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
3e60: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
3e70: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
3e80: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
3e90: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
3ea0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
3eb0: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
3ec0: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
3ed0: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
3ee0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
3ef0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
3f00: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20  default size of 
3f10: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a 2f  a disk sector.*/
3f20: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
3f30: 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a 0a  ECTOR_SIZE 512..
3f40: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
3f50: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
3f60: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
3f70: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
3f80: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
3f90: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
3fa0: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
3fb0: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
3fc0: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
3fd0: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
3fe0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
3ff0: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
4000: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
4010: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
4020: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
4030: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
4040: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
4050: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
4060: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
4070: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
4080: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
4090: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
40a0: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
40b0: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
40c0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
40d0: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
40e0: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
40f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
4100: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
4110: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
4120: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
4130: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4140: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
4150: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
4160: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
4170: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
4180: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45  7483647../*.** E
4190: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
41a0: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
41b0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
41c0: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
41d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
41e0: 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f  t pager3_refinfo
41f0: 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73  _enable = 0;.  s
4200: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
4210: 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a  _refinfo(PgHdr *
4220: 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  p){.    static i
4230: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
4240: 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69  if( !pager3_refi
4250: 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74  nfo_enable ) ret
4260: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
4270: 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
4280: 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64      "REFCNT: %4d
4290: 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
42a0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
42b0: 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
42c0: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20  TA(p), p->nRef. 
42d0: 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b     );.    cnt++;
42e0: 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20     /* Something 
42f0: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
4300: 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20  int on */.  }.# 
4310: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
4320: 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  )  pager_refinfo
4330: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
4340: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65  ne REFINFO(X).#e
4350: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
4360: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4370: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
4380: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4390: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
43a0: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
43b0: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
43c0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
43d0: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
43e0: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
43f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4400: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4410: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
4420: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
4430: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4440: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
4450: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
4460: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20  OsFile *fd, u32 
4470: 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20 72 65  *pRes){.  u32 re
4480: 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  s;.  int rc;.  r
4490: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
44a0: 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69 7a 65  d(fd, &res, size
44b0: 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66 28 20  of(res));.  if( 
44c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
44d0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
44e0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d 65  ar ac[4];.    me
44f0: 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c 20 34  mcpy(ac, &res, 4
4500: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28 61 63  );.    res = (ac
4510: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
4520: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
4530: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d  <8) | ac[3];.  }
4540: 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73 3b 0a  .  *pRes = res;.
4550: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4560: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
4570: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
4580: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
4590: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
45a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
45b0: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
45c0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
45d0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
45e0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
45f0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
4600: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
4610: 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e 65   val){.  unsigne
4620: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
4630: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
4640: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
4650: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
4660: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
4670: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
4680: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
4690: 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   0xff;.  return 
46a0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
46b0: 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a  d, ac, 4);.}../*
46c0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 33 32  .** Write the 32
46d0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 27 76 61  -bit integer 'va
46e0: 6c 27 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  l' into the page
46f0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
4700: 61 67 65 20 68 65 61 64 65 72 0a 2a 2a 20 27 70  age header.** 'p
4710: 27 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66  ' at offset 'off
4720: 73 65 74 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  set'..*/.static 
4730: 76 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74 73  void store32bits
4740: 28 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20  (u32 val, PgHdr 
4750: 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b  *p, int offset){
4760: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4770: 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28   *ac;.  ac = &((
4780: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50  unsigned char*)P
4790: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29  GHDR_TO_DATA(p))
47a0: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61 63 5b 30  [offset];.  ac[0
47b0: 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20  ] = (val>>24) & 
47c0: 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20  0xff;.  ac[1] = 
47d0: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
47e0: 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c  ;.  ac[2] = (val
47f0: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >>8) & 0xff;.  a
4800: 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66  c[3] = val & 0xf
4810: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  f;.}../*.** Read
4820: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4830: 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66  r at offset 'off
4840: 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61  set' from the pa
4850: 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
4860: 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72 20  .** page header 
4870: 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  'p'..*/.static u
4880: 33 32 20 72 65 74 72 69 65 76 65 33 32 62 69 74  32 retrieve32bit
4890: 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20  s(PgHdr *p, int 
48a0: 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67  offset){.  unsig
48b0: 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20  ned char *ac;.  
48c0: 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64  ac = &((unsigned
48d0: 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f   char*)PGHDR_TO_
48e0: 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d  DATA(p))[offset]
48f0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b 30  ;.  return (ac[0
4900: 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c  ]<<24) | (ac[1]<
4910: 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38  <16) | (ac[2]<<8
4920: 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f  ) | ac[3];.}.../
4930: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
4940: 20 62 69 74 73 20 69 6e 20 74 68 65 20 70 50 61   bits in the pPa
4950: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74  ger->errMask int
4960: 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65 0a  o an approprate.
4970: 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a  ** return code..
4980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4990: 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67 65  ger_errcode(Page
49a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
49b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
49c0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
49d0: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
49e0: 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63  ERR_LOCK )    rc
49f0: 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43   = SQLITE_PROTOC
4a00: 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OL;.  if( pPager
4a10: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4a20: 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20 20 20  R_ERR_DISK )    
4a30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
4a40: 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  R;.  if( pPager-
4a50: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
4a60: 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20 20 72  _ERR_FULL )    r
4a70: 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
4a80: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
4a90: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
4aa0: 52 52 5f 4d 45 4d 20 29 20 20 20 20 20 72 63 20  RR_MEM )     rc 
4ab0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
4ac0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
4ad0: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
4ae0: 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63 20 3d  R_CORRUPT ) rc =
4af0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
4b00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4b10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
4b20: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
4b30: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
4b40: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
4b50: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
4b60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
4b70: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
4b80: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
4b90: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
4ba0: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
4bb0: 64 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20  d char *pData = 
4bc0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4bd0: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4be0: 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Page);.  for(i=0
4bf0: 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65  ; i<pPage->pPage
4c00: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b  r->pageSize; i++
4c10: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
4c20: 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b  ash+i)^pData[i];
4c30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
4c40: 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  sh;.}../*.** The
4c50: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
4c60: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
4c70: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
4c80: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
4c90: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
4ca0: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
4cb0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
4cc0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
4cd0: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
4ce0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
4cf0: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
4d00: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
4d10: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
4d20: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
4d30: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
4d40: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
4d50: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
4d60: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
4d70: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
4d80: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
4d90: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
4da0: 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50  ->pageHash || pP
4db0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c  ager->errMask ||
4dc0: 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64   MEMDB || pPg->d
4dd0: 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70  irty || .      p
4de0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
4df0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
4e00: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
4e10: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
4e20: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
4e30: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
4e40: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
4e50: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
4e60: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
4e70: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73  open..** The mas
4e80: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
4e90: 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72   name is read fr
4ea0: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
4eb0: 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77  e file and .** w
4ec0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f  ritten into memo
4ed0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
4ee0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
4ef0: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a   *pzMaster is.**
4f00: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74   set to point at
4f10: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20   the memory and 
4f20: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
4f30: 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
4f40: 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65  ust.** sqliteFre
4f50: 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a  e() *pzMaster..*
4f60: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
4f70: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
4f80: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ame is present *
4f90: 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20  pzMaster is set 
4fa0: 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  to 0 and.** SQLI
4fb0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
4fc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
4fd0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
4fe0: 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  OsFile *pJrnl, c
4ff0: 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b  har **pzMaster){
5000: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
5010: 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b   len;.  i64 szJ;
5020: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
5030: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
5040: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
5050: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
5060: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
5070: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a  header */..  *pz
5080: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
5090: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
50a0: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
50b0: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
50c0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31  LITE_OK || szJ<1
50d0: 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  6 ) return rc;..
50e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
50f0: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
5100: 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  16);.  if( rc!=S
5110: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5120: 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72  n rc;. .  rc = r
5130: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
5140: 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63   &len);.  if( rc
5150: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5160: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
5170: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
5180: 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  l, &cksum);.  if
5190: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
51a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
51b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
51c0: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
51d0: 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 8);.  if( rc!=
51e0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d  SQLITE_OK || mem
51f0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
5200: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20  rnalMagic, 8) ) 
5210: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5220: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
5230: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c  (pJrnl, szJ-16-l
5240: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5250: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5260: 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74  n rc;..  *pzMast
5270: 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  er = (char *)sql
5280: 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29  iteMalloc(len+1)
5290: 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74  ;.  if( !*pzMast
52a0: 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  er ){.    return
52b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
52c0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
52d0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a  3OsRead(pJrnl, *
52e0: 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a  pzMaster, len);.
52f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5300: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5310: 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29  eFree(*pzMaster)
5320: 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20  ;.    *pzMaster 
5330: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
5340: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
5350: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
5360: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
5370: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5380: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
5390: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
53a0: 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61   cksum -= (*pzMa
53b0: 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ster)[i];.  }.  
53c0: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
53d0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
53e0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
53f0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
5400: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
5410: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
5420: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
5430: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5440: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
5450: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
5460: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
5470: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
5480: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
5490: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
54a0: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
54b0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
54c0: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
54d0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
54e0: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
54f0: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
5500: 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d  }else{.    (*pzM
5510: 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c  aster)[len] = '\
5520: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5530: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5540: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5550: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5560: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5570: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
5580: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
5590: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
55a0: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
55b0: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
55c0: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
55d0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
55e0: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
55f0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
5600: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5610: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5620: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5630: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5640: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5670: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5680: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
5690: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
56a0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
56b0: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
56c0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
56d0: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
56f0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
5700: 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  nt seekJournalHd
5710: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
5720: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
5730: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
5740: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5750: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
5760: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
5770: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
5780: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
5790: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
57a0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
57b0: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
57c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
57d0: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
57e0: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
57f0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
5800: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
5810: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
5820: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5830: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  Off = offset;.  
5840: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
5850: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
5860: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
5870: 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  alOff);.}../*.**
5880: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
5890: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
58a0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
58b0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
58c0: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
58d0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
58e0: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
58f0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
5900: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
5910: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
5920: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
5930: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
5940: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
5950: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
5960: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
5970: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
5980: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
5990: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
59a0: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
59b0: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
59c0: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
59d0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
59e0: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
59f0: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
5a00: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
5a10: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
5a20: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
5a30: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
5a40: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
5a50: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
5a60: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
5a70: 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  l..** .** Follow
5a80: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
5a90: 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65  DR_SZ - 24) byte
5aa0: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
5ab0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5ac0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
5ad0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
5ae0: 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 65 65  ..  int rc = see
5af0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
5b00: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  er);.  if( rc ) 
5b10: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
5b20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
5b30: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
5b40: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 70 50 61  alOff;.  if( pPa
5b50: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
5b60: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
5b70: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
5b80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
5b90: 72 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  r;.  }.  pPager-
5ba0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
5bb0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5bc0: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58  ager);..  /* FIX
5bd0: 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   ME: .  **.  ** 
5be0: 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70  Possibly for a p
5bf0: 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  ager not in no-s
5c00: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
5c10: 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75  urnal magic shou
5c20: 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77  ld not.  ** be w
5c30: 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65  ritten until nRe
5c40: 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61  c is filled in a
5c50: 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73  s part of next s
5c60: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20  yncJournal(). . 
5c70: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
5c80: 79 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c  y maybe the whol
5c90: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
5ca0: 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79   should be delay
5cb0: 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20  ed until that.  
5cc0: 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20  ** point. Think 
5cd0: 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f  about this..  */
5ce0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5cf0: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
5d00: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
5d10: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
5d20: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 69  nalMagic));..  i
5d30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5d40: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e   ){.    /* The n
5d50: 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46  Rec Field. 0xFFF
5d60: 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e  FFFFF for no-syn
5d70: 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20  c journals. */. 
5d80: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
5d90: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
5da0: 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  , pPager->noSync
5db0: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
5dc0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
5dd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5de0: 20 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d     /* The random
5df0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
5e00: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20 20  ialiser */ .    
5e10: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
5e20: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
5e30: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
5e40: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
5e50: 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  ;.    rc = write
5e60: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
5e70: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  jfd, pPager->cks
5e80: 75 6d 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69  umInit);.  }.  i
5e90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5ea0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69   ){.    /* The i
5eb0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
5ec0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  size */.    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 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
5f00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5f10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
5f20: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
5f30: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
5f40: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 63  rocess */.    rc
5f50: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
5f60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
5f70: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
5f80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
5f90: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
5fa0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
5fb0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
5fc0: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
5fd0: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
5fe0: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
5ff0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
6000: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
6010: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
6020: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
6030: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
6040: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
6050: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a  >journalOff-1);.
6060: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6070: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
6080: 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29  >jfd, "\000", 1)
6090: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
60a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
60b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
60c0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
60d0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
60e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
60f0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
6100: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
6110: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
6120: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6130: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
6140: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
6150: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
6160: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6170: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6180: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6190: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
61a0: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
61b0: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
61c0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
61d0: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
61e0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
61f0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
6200: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
6210: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
6220: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
6230: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
6240: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
6250: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6260: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6270: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6280: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6290: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
62a0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
62b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
62c0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
62d0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
62e0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
62f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6300: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
6310: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
6320: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
6330: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
6340: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
6350: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
6360: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6370: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6380: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6390: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
63a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
63b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
63c0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
63d0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
63e0: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
63f0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
6400: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
6410: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
6420: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
6430: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
6440: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
6450: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
6460: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
6470: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6480: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6490: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
64a0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
64b0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
64c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
64d0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
64e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
64f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6500: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6510: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a 66  Read(&pPager->jf
6520: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
6530: 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66  f(aMagic));.  if
6540: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6550: 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  ;..  if( memcmp(
6560: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
6570: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
6580: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
6590: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
65a0: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ONE;.  }..  rc =
65b0: 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61   read32bits(&pPa
65c0: 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29  ger->jfd, pNRec)
65d0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
65e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
65f0: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
6600: 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
6610: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6620: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6630: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
6640: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
6650: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
6660: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6670: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
6680: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
6690: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
66a0: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
66b0: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
66c0: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
66d0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
66e0: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
66f0: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
6700: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
6710: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
6720: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
6730: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
6740: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
6750: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
6760: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
6770: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
6780: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
6790: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
67a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
67b0: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
67c0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
67d0: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
67e0: 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e  (u32 *)&pPager->
67f0: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
6800: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6810: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
6820: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
6830: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6840: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
6850: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
6860: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
6870: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65  ournalOff);.  re
6880: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
6890: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
68a0: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
68b0: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
68c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
68d0: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
68e0: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
68f0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
6900: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6910: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
6920: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
6930: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
6940: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
6950: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
6960: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
6970: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
6980: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
6990: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
69a0: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
69b0: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
69c0: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
69d0: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
69e0: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
69f0: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
6a00: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
6a10: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
6a20: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
6a30: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
6a40: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
6a50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6a60: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
6a70: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
6a80: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
6a90: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
6aa0: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
6ab0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
6ac0: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
6ad0: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
6ae0: 6c 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  l name..*/.stati
6af0: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
6b00: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
6b10: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
6b20: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
6b30: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
6b40: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
6b50: 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 0a  u32 cksum = 0; .
6b60: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
6b70: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
6b80: 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c  ster) return SQL
6b90: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
6ba0: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
6bb0: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
6bc0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72  (zMaster);.  for
6bd0: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
6be0: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
6bf0: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
6c00: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
6c10: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
6c20: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
6c30: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
6c40: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
6c50: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6c60: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
6c70: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
6c80: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
6c90: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
6ca0: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
6cb0: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
6cc0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
6cd0: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
6ce0: 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72     rc = seekJour
6cf0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
6d00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6d10: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
6d20: 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
6d30: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
6d40: 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d  len+20);..  rc =
6d50: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
6d60: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
6d70: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
6d80: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6d90: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
6da0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
6db0: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
6dc0: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
6dd0: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
6de0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6df0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6e00: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
6e10: 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65 6e 29 3b  ager->jfd, len);
6e20: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6e30: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
6e40: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
6e50: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6e60: 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66  fd, cksum);.  if
6e70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6e80: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6e90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
6ea0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
6eb0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6ec0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
6ed0: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
6ee0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
6ef0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6f00: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65  ./*.** Add or re
6f10: 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  move a page from
6f20: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
6f30: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
6f40: 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d  in the.** statem
6f50: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
6f60: 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65  ** The Pager kee
6f70: 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  ps a separate li
6f80: 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  st of pages that
6f90: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
6fa0: 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65  n.** the stateme
6fb0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69  nt journal.  Thi
6fc0: 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69  s helps the sqli
6fd0: 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
6fe0: 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  mmit().** routin
6ff0: 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65  e run MUCH faste
7000: 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  r for the common
7010: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72   case where ther
7020: 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61  e are many.** pa
7030: 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75  ges in memory bu
7040: 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65  t only a few are
7050: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
7060: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  t journal..*/.st
7070: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61  atic void page_a
7080: 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
7090: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
70a0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
70b0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
70c0: 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20  ( pPg->inStmt ) 
70d0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
70e0: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
70f0: 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78  ==0 && pPg->pNex
7100: 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50  tStmt==0 );.  pP
7110: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
7120: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7130: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61  pStmt ){.    pPa
7140: 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65  ger->pStmt->pPre
7150: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d  vStmt = pPg;.  }
7160: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  .  pPg->pNextStm
7170: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  t = pPager->pStm
7180: 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74  t;.  pPager->pSt
7190: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  mt = pPg;.  pPg-
71a0: 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73  >inStmt = 1;.}.s
71b0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
71c0: 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
71d0: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
71e0: 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  ){.  if( !pPg->i
71f0: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
7200: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
7210: 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Stmt ){.    asse
7220: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  rt( pPg->pPrevSt
7230: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70  mt->pNextStmt==p
7240: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
7250: 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53  PrevStmt->pNextS
7260: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
7270: 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Stmt;.  }else{. 
7280: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
7290: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70  pPager->pStmt==p
72a0: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
72b0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
72c0: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
72d0: 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
72e0: 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  extStmt ){.    a
72f0: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
7300: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
7310: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  ==pPg );.    pPg
7320: 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72  ->pNextStmt->pPr
7330: 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50  evStmt = pPg->pP
7340: 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70  revStmt;.  }.  p
7350: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
7360: 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53  0;.  pPg->pPrevS
7370: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  tmt = 0;.  pPg->
7380: 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  inStmt = 0;.}../
7390: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
73a0: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
73b0: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
73c0: 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  e number.  Retur
73d0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
73e0: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
73f0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
7400: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
7410: 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
7420: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
7430: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
7440: 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  r *p = pPager->a
7450: 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28  Hash[pager_hash(
7460: 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28  pgno)];.  while(
7470: 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70   p && p->pgno!=p
7480: 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  gno ){.    p = p
7490: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
74a0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
74b0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
74c0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
74d0: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
74e0: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
74f0: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
7500: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
7510: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
7520: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
7530: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
7540: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
7550: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
7560: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
7570: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
7580: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
7590: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
75a0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
75b0: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
75c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
75d0: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
75e0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
75f0: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
7600: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7610: 65 72 72 4d 61 73 6b 20 29 20 72 65 74 75 72 6e  errMask ) return
7620: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
7630: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
7640: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  Pg=pNext){.    p
7650: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
7660: 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
7670: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
7680: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
7690: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
76a0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
76b0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
76c0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
76d0: 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  pAll = 0;.  mems
76e0: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
76f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
7700: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70  er->aHash));.  p
7710: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
7720: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7730: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
7740: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
7750: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
7760: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
7770: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
7780: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
7790: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  O_LOCK);.  pPage
77a0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
77b0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
77c0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
77d0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
77e0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
77f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
7800: 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n==0 );.}../*.**
7810: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7820: 73 20 75 73 65 64 20 74 6f 20 72 65 73 65 74 20  s used to reset 
7830: 74 68 65 20 70 61 67 65 72 20 61 66 74 65 72 20  the pager after 
7840: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
7850: 72 65 2e 20 54 68 69 73 0a 2a 2a 20 64 6f 65 73  re. This.** does
7860: 6e 27 74 20 77 6f 72 6b 20 77 69 74 68 20 69 6e  n't work with in
7870: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
7880: 73 2e 20 49 66 20 61 20 6d 61 6c 6c 6f 63 28 29  s. If a malloc()
7890: 20 66 61 69 6c 73 20 77 68 65 6e 20 61 6e 20 0a   fails when an .
78a0: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
78b0: 61 62 61 73 65 20 69 73 20 69 6e 20 75 73 65 20  abase is in use 
78c0: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
78d0: 6c 65 20 74 6f 20 72 65 63 6f 76 65 72 2e 0a 2a  le to recover..*
78e0: 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
78f0: 63 74 69 6f 6e 20 6f 72 20 73 74 61 74 65 6d 65  ction or stateme
7900: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
7910: 73 20 61 63 74 69 76 65 2c 20 69 74 20 69 73 20  s active, it is 
7920: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
7930: 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  ** It is an erro
7940: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
7950: 75 6e 63 74 69 6f 6e 20 69 66 20 61 6e 79 20 70  unction if any p
7960: 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
7970: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
7980: 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52 45  TE_OMIT_GLOBALRE
7990: 43 4f 56 45 52 0a 69 6e 74 20 73 71 6c 69 74 65  COVER.int sqlite
79a0: 33 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67  3pager_reset(Pag
79b0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
79c0: 66 28 20 70 50 61 67 65 72 20 29 7b 0a 20 20 20  f( pPager ){.   
79d0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
79e0: 66 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20  f || MEMDB ){.  
79f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7a00: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
7a10: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
7a20: 73 6b 20 26 3d 20 7e 28 50 41 47 45 52 5f 45 52  sk &= ~(PAGER_ER
7a30: 52 5f 4d 45 4d 29 3b 0a 20 20 20 20 70 61 67 65  R_MEM);.    page
7a40: 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
7a50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7a60: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
7a70: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  f.../*.** When t
7a80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7a90: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
7aa0: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
7ab0: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
7ac0: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
7ad0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
7ae0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
7af0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7b00: 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61  leases.** the da
7b10: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
7b20: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
7b30: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
7b40: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
7b50: 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c  l.** file is del
7b60: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
7b70: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
7b80: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
7b90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7ba0: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
7bb0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
7bc0: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
7bd0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
7be0: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
7bf0: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
7c00: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
7c10: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
7c20: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
7c30: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
7c40: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
7c50: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
7c60: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
7c70: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
7c80: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
7c90: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
7ca0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
7cb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7cc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67    }.  sqlite3pag
7cd0: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
7ce0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
7cf0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
7d00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
7d10: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
7d20: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
7d30: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
7d40: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
7d50: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
7d60: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
7d70: 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
7d80: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
7d90: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
7da0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
7db0: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
7dc0: 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nal);.    sqlite
7dd0: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
7de0: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
7df0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
7e00: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
7e10: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
7e20: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
7e30: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
7e40: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
7e50: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
7e60: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
7e70: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
7e80: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
7e90: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
7ea0: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
7eb0: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
7ec0: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
7ed0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7ee0: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
7ef0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
7f00: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
7f10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
7f20: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
7f30: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
7f40: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
7f50: 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
7f60: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
7f70: 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   );.  }.  rc = s
7f80: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
7f90: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
7fa0: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  ED_LOCK);.  pPag
7fb0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
7fc0: 52 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67  R_SHARED;.  pPag
7fd0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
7fe0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
7ff0: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72  tMaster = 0;.  r
8000: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8010: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
8020: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
8030: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66   for the page of
8040: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   data..**.** Thi
8050: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
8060: 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73  checksum.  It is
8070: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
8080: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
8090: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
80a0: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67  alue and the pag
80b0: 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78  e number.  We ex
80c0: 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a  perimented with.
80d0: 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66  ** a checksum of
80e0: 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
80f0: 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66  , but that was f
8100: 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73  ound to be too s
8110: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  low..**.** Note 
8120: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
8130: 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61  mber is stored a
8140: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
8150: 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74  of data and.** t
8160: 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73  he checksum is s
8170: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
8180: 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  .  This is impor
8190: 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61  tant.  If journa
81a0: 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  l.** corruption 
81b0: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
81c0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
81d0: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73  he most likely s
81e0: 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68  cenario.** is th
81f0: 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
8200: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
8210: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
8220: 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a  anged.  It is.**
8230: 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
8240: 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
8250: 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
8260: 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
8270: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
8280: 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
8290: 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
82a0: 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
82b0: 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
82c0: 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
82d0: 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
82e0: 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
82f0: 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
8300: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43  **.** FIX ME:  C
8310: 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65  onsider adding e
8320: 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73  very 200th (or s
8330: 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  o) byte of the d
8340: 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68  ata to the.** ch
8350: 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61  ecksum.  That wa
8360: 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  y if a single pa
8370: 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f  ge spans 3 or mo
8380: 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20  re disk sectors 
8390: 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20  and.** only the 
83a0: 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73  middle sector is
83b0: 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c   corrupt, we wil
83c0: 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72  l still have a r
83d0: 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61  easonable.** cha
83e0: 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74  nce of failing t
83f0: 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20  he checksum and 
8400: 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74  thus detecting t
8410: 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73  he problem..*/.s
8420: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
8430: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
8440: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
8450: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74  const char *aDat
8460: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
8470: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
8480: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
8490: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
84a0: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
84b0: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
84c0: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
84d0: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
84e0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
84f0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
8500: 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74  ngle page from t
8510: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8520: 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64  opened on file d
8530: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64  escriptor.** jfd
8540: 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73  .  Playback this
8550: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   one page..**.**
8560: 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20   If useCksum==0 
8570: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f  it means this jo
8580: 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75  urnal does not u
8590: 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43  se checksums.  C
85a0: 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20  hecksums.** are 
85b0: 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74  not used in stat
85c0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62  ement journals b
85d0: 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74  ecause statement
85e0: 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74   journals do not
85f0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76  .** need to surv
8600: 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  ive power failur
8610: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
8620: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
8630: 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20  _one_page(Pager 
8640: 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20  *pPager, OsFile 
8650: 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73  *jfd, int useCks
8660: 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  um){.  int rc;. 
8670: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8690: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
86a0: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
86b0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
86e0: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
86f0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
8700: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8720: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
8730: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
8740: 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44 61 74 61  ng */.  u8 aData
8750: 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  [SQLITE_MAX_PAGE
8760: 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70  _SIZE];  /* Temp
8770: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70   storage for a p
8780: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65  age */..  /* use
8790: 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20  Cksum should be 
87a0: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
87b0: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
87c0: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
87d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
87e0: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
87f0: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
8800: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
8810: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65  ert( jfd == (use
8820: 43 6b 73 75 6d 20 3f 20 26 70 50 61 67 65 72 2d  Cksum ? &pPager-
8830: 3e 6a 66 64 20 3a 20 26 70 50 61 67 65 72 2d 3e  >jfd : &pPager->
8840: 73 74 66 64 29 20 29 3b 0a 0a 0a 20 20 72 63 20  stfd) );...  rc 
8850: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
8860: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
8870: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8880: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
8890: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
88a0: 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70 50 61  jfd, &aData, pPa
88b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
88c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
88d0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
88e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
88f0: 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
8900: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a  >pageSize + 4;..
8910: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
8920: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
8930: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
8940: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
8950: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
8960: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
8970: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
8980: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
8990: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
89a0: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
89b0: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
89c0: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
89d0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
89e0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
89f0: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
8a00: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
8a10: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
8a20: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
8a30: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
8a40: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
8a50: 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
8a60: 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
8a70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8a80: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
8a90: 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64  ( pgno>(unsigned
8aa0: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
8ab0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8ac0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
8ad0: 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20  f( useCksum ){. 
8ae0: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
8af0: 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b  ts(jfd, &cksum);
8b00: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
8b10: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
8b20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
8b30: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
8b40: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
8b50: 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 21 3d  , pgno, aData)!=
8b60: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
8b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8b80: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
8b90: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
8ba0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
8bb0: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
8bc0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
8bd0: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
8be0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
8bf0: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
8c00: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
8c10: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
8c20: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
8c30: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
8c40: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
8c50: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
8c60: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
8c70: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
8c80: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
8c90: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
8ca0: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
8cb0: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
8cc0: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
8cd0: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
8ce0: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
8cf0: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
8d00: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
8d10: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
8d20: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
8d30: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
8d40: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
8d50: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
8d60: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
8d70: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
8d80: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
8d90: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
8da0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
8db0: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
8dc0: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
8dd0: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
8de0: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
8df0: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
8e00: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
8e10: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
8e20: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
8e30: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
8e40: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
8e50: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
8e60: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
8e70: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
8e80: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
8e90: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
8ea0: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
8eb0: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
8ec0: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
8ed0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
8ee0: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f  e in the main ro
8ef0: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
8f00: 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
8f10: 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42   if a full ROLLB
8f20: 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72  ACK occurs after
8f30: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20   the statement. 
8f40: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   ** rollback the
8f50: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77   full ROLLBACK w
8f60: 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20  ill not restore 
8f70: 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20  the page to its 
8f80: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f  original.  ** co
8f90: 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64  ntent.  Two cond
8fa0: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d  itions must be m
8fb0: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
8fc0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
8fd0: 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31  e.  ** files. (1
8fe0: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
8ff0: 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20  ust be locked.  
9000: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
9010: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
9020: 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ** page content 
9030: 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  is in the main j
9040: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
9050: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
9060: 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61  s not in.  ** ca
9070: 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69  che or else it i
9080: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
9090: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20  Sync==0..  */.  
90a0: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
90b0: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
90c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
90d0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
90e0: 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50  _EXCLUSIVE || pP
90f0: 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33  g!=0 );.  TRACE3
9100: 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
9110: 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
9120: 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
9130: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9140: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
9150: 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d  LUSIVE && (pPg==
9160: 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79  0 || pPg->needSy
9170: 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 73 71  nc==0) ){.    sq
9180: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
9190: 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
91a0: 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
91b0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  ageSize);.    rc
91c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
91d0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 61  e(&pPager->fd, a
91e0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
91f0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
9200: 20 70 50 67 20 29 20 70 50 67 2d 3e 64 69 72 74   pPg ) pPg->dirt
9210: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 0;.  }.  if(
9220: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
9230: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
9240: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
9250: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
9260: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
9270: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
9280: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
9290: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
92a0: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
92b0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
92c0: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
92d0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
92e0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
92f0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
9300: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
9310: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
9320: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
9330: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
9340: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
9350: 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
9360: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
9370: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
9380: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d   /* assert( pPg-
9390: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
93a0: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20  >pgno==1 ); */. 
93b0: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
93c0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
93d0: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
93e0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
93f0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
9400: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
9410: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
9420: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
9430: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
9440: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
9450: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
9460: 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
9470: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
9480: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
9490: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
94a0: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
94b0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
94c0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f  );.#endif.    CO
94d0: 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
94e0: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
94f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9500: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
9510: 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
9520: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
9530: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9540: 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
9550: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
9560: 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
9570: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9580: 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
9590: 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
95a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
95b0: 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
95c0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
95d0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
95e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
95f0: 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
9600: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  t is..**.** The 
9610: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9620: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
9630: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68   names of all ch
9640: 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ild journals..**
9650: 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61   To tell if a ma
9660: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
9670: 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65   be deleted, che
9680: 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68  ck to each of th
9690: 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20  e.** children.  
96a0: 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  If all children 
96b0: 61 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69  are either missi
96c0: 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66  ng or do not ref
96d0: 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65  er to.** a diffe
96e0: 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  rent master jour
96f0: 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  nal, then this m
9700: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61  aster journal ca
9710: 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  n be deleted..*/
9720: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
9730: 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73  r_delmaster(cons
9740: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
9750: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
9760: 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20  t master_open = 
9770: 30 3b 0a 20 20 4f 73 46 69 6c 65 20 6d 61 73 74  0;.  OsFile mast
9780: 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73  er;.  char *zMas
9790: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
97a0: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
97b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
97c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
97d0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
97e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
97f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9800: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
9810: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9820: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
9830: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
9840: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
9850: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
9860: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
9870: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
9880: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
9890: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d  erence..  */.  m
98a0: 65 6d 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30  emset(&master, 0
98b0: 2c 20 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29  , sizeof(master)
98c0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
98d0: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
98e0: 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72  zMaster, &master
98f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9900: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
9910: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d  lmaster_out;.  m
9920: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
9930: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9940: 46 69 6c 65 53 69 7a 65 28 26 6d 61 73 74 65 72  FileSize(&master
9950: 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
9960: 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
9970: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
9980: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
9990: 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72   if( nMasterJour
99a0: 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61  nal>0 ){.    cha
99b0: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  r *zJournal;.   
99c0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
99d0: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c  r = 0;..    /* L
99e0: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
99f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9a00: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
9a10: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
9a20: 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ** sqliteMalloc(
9a30: 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
9a40: 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
9a50: 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  al. .    */.    
9a60: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
9a70: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
9a80: 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75  alloc(nMasterJou
9a90: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21  rnal);.    if( !
9aa0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
9ab0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
9ac0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
9ad0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
9ae0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
9af0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
9b00: 64 28 26 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(&master, zMast
9b10: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
9b20: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
9b30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9b40: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
9b50: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
9b60: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
9b70: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
9b80: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
9b90: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
9ba0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
9bb0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9bc0: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f  OsFileExists(zJo
9bd0: 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  urnal) ){.      
9be0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
9bf0: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
9c00: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
9c10: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
9c20: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
9c30: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
9c40: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
9c50: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9c60: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
9c70: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
9c80: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
9c90: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9ca0: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
9cb0: 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20  .        OsFile 
9cc0: 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 20 20 20  journal;.       
9cd0: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
9ce0: 20 6d 65 6d 73 65 74 28 26 6a 6f 75 72 6e 61 6c   memset(&journal
9cf0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6a 6f 75 72  , 0, sizeof(jour
9d00: 6e 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 72  nal));.        r
9d10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
9d20: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e  nReadOnly(zJourn
9d30: 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  al, &journal);. 
9d40: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
9d50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9d60: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9d70: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
9d80: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
9d90: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
9da0: 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c 20 26 7a  nal(&journal, &z
9db0: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
9dc0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9dd0: 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(&journal);.  
9de0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
9df0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9e00: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9e10: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
9e20: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
9e30: 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26  zMasterPtr!=0 &&
9e40: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
9e50: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
9e60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
9e70: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
9e80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
9e90: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
9ea0: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
9eb0: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
9ec0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9ed0: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
9ee0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
9ef0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
9f00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9f10: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
9f20: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
9f30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
9f40: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
9f50: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
9f60: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
9f70: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
9f80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
9f90: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
9fa0: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
9fb0: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
9fc0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
9fd0: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
9fe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9ff0: 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20  *.** Make every 
a000: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
a010: 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61  e agree with wha
a020: 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49  t is on disk.  I
a030: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a  n other words,.*
a040: 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73  * reread the dis
a050: 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  k to reset the s
a060: 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68  tate of the cach
a070: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a080: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a090: 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  after a rollback
a0a0: 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f   in which some o
a0b0: 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68  f the dirty cach
a0c0: 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e  e.** pages had n
a0d0: 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
a0e0: 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20  n out to disk.  
a0f0: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20  We need to roll 
a100: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68  back the.** cach
a110: 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  e content and th
a120: 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
a130: 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72   do that is to r
a140: 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f  eread the old co
a150: 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72  ntent.** back fr
a160: 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a  om the disk..*/.
a170: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a180: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61  _reload_cache(Pa
a190: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a1a0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
a1b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a1c0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
a1d0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
a1e0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
a1f0: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
a200: 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  [SQLITE_MAX_PAGE
a210: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20  _SIZE];.    if( 
a220: 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f  !pPg->dirty ) co
a230: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
a240: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
a250: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
a260: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
a270: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
a280: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
a290: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28  >pageSize*(i64)(
a2a0: 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20  pPg->pgno-1));. 
a2b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a2c0: 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d  3OsRead(&pPager-
a2d0: 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
a2e0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a2f0: 20 20 20 20 54 52 41 43 45 33 28 22 52 45 46 45      TRACE3("REFE
a300: 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e  TCH %d page %d\n
a310: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
a320: 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
a330: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
a340: 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45  reak;.      CODE
a350: 43 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20  C(pPager, zBuf, 
a360: 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20  pPg->pgno, 2);. 
a370: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a380: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
a390: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a3a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a3b0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
a3c0: 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47   memcmp(zBuf, PG
a3d0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a3e0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a3f0: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ze) ){.      mem
a400: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
a410: 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50  A(pPg), zBuf, pP
a420: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a430: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
a440: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
a450: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
a460: 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f  xReiniter(PGHDR_
a470: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
a480: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a490: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a4a0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
a4b0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
a4c0: 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
a4d0: 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
a4e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a4f0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
a500: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  0;.    pPg->dirt
a510: 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
a520: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
a530: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
a540: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
a550: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
a560: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
a580: 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  ate the main fil
a590: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  e of the given p
a5a0: 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62  ager to the numb
a5b0: 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69  er of pages.** i
a5c0: 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  ndicated..*/.sta
a5d0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
a5e0: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
a5f0: 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29  ager, int nPage)
a600: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
a610: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
a620: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
a630: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
a640: 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72  Truncate(&pPager
a650: 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61  ->fd, pPager->pa
a660: 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
a670: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  e);.}../*.** Pla
a680: 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
a690: 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
a6a0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
a6b0: 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
a6c0: 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
a6d0: 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
a6e0: 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
a6f0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
a700: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
a710: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
a720: 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
a730: 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
a740: 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
a750: 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
a760: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
a770: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
a780: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
a790: 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
a7a0: 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
a7b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
a7c0: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
a7d0: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
a7e0: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
a7f0: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
a800: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
a810: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
a820: 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
a830: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
a840: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
a850: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
a860: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
a870: 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
a880: 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
a890: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
a8a0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
a8b0: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
a8c0: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
a8d0: 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
a8e0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
a8f0: 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
a900: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
a910: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
a920: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
a930: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
a940: 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
a950: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
a960: 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
a970: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
a980: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
a990: 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20  urnal.).**  (6) 
a9a0: 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
a9b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a9c0: 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
a9d0: 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
a9e0: 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
a9f0: 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
aa00: 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
aa10: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
aa20: 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
aa30: 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
aa40: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
aa50: 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
aa60: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
aa70: 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
aa80: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
aa90: 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
aaa0: 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29  n UTF-8..**  (7)
aab0: 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
aac0: 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
aad0: 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
aae0: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
aaf0: 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
ab00: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
ab10: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
ab20: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
ab30: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
ab40: 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
ab50: 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
ab60: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
ab70: 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
ab80: 68 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73  he first 6 items
ab90: 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
aba0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
abb0: 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
abc0: 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69  nce of the 7th i
abd0: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
abe0: 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
abf0: 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
ac00: 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
ac10: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
ac20: 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
ac30: 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
ac40: 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
ac50: 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
ac60: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
ac70: 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
ac80: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
ac90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
aca0: 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
acb0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
acc0: 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
acd0: 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
ace0: 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
acf0: 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
ad00: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
ad10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ad20: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
ad30: 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
ad40: 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
ad50: 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
ad60: 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
ad70: 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
ad80: 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
ad90: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
ada0: 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
adb0: 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
adc0: 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
add0: 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
ade0: 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
adf0: 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
ae00: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
ae10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
ae20: 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
ae30: 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
ae40: 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
ae50: 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
ae60: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
ae70: 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
ae80: 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
ae90: 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
aea0: 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
aeb0: 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
aec0: 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
aed0: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
aee0: 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
aef0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
af00: 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
af10: 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
af20: 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
af30: 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
af40: 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
af50: 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
af60: 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
af70: 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
af80: 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
af90: 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
afa0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
afb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
afc0: 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
afd0: 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
afe0: 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
aff0: 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
b000: 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
b010: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
b020: 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
b030: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
b040: 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
b050: 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
b060: 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
b070: 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
b080: 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
b090: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
b0a0: 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
b0b0: 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
b0c0: 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
b0d0: 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
b0e0: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
b0f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
b100: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
b110: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
b120: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
b130: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a  ager){.  i64 szJ
b140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b150: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
b160: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
b170: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
b180: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
b190: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b1a0: 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
b1b0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
b1c0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
b1d0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
b1e0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
b1f0: 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
b200: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b210: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
b220: 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
b230: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
b240: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
b250: 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
b260: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
b270: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
b280: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
b290: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b2a0: 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a  file if any */..
b2b0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
b2c0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
b2d0: 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
b2e0: 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
b2f0: 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
b300: 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
b310: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
b320: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
b330: 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  en );.  rc = sql
b340: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
b350: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
b360: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
b370: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
b380: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
b390: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
b3a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b3b0: 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
b3c0: 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
b3d0: 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
b3e0: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
b3f0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
b400: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
b410: 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
b420: 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
b430: 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
b440: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
b450: 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
b460: 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
b470: 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
b480: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  */.  rc = readMa
b490: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26 70 50 61  sterJournal(&pPa
b4a0: 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74  ger->jfd, &zMast
b4b0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
b4c0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
b4d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b4e0: 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65  TE_OK || (zMaste
b4f0: 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46  r && !sqlite3OsF
b500: 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65  ileExists(zMaste
b510: 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r)) ){.    sqlit
b520: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
b530: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
b540: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
b550: 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20  ITE_DONE ) rc = 
b560: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
b570: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
b580: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
b590: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
b5a0: 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72  fd, 0);.  pPager
b5b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
b5c0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
b5d0: 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
b5e0: 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61  her when the rea
b5f0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61  dJournalHdr() ca
b600: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20  ll returns.  ** 
b610: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
b620: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
b630: 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  s. */.  while( 1
b640: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   ){..    /* Read
b650: 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
b660: 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
b670: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
b680: 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
b690: 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
b6a0: 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
b6b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
b6c0: 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
b6d0: 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
b6e0: 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
b6f0: 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
b700: 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
b710: 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
b720: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
b730: 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
b740: 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
b750: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
b760: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
b770: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
b780: 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  er, szJ, &nRec, 
b790: 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
b7a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b7b0: 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
b7c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
b7d0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
b7e0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
b7f0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
b800: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
b810: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
b820: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
b830: 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
b840: 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
b850: 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
b860: 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
b870: 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
b880: 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
b890: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
b8a0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
b8b0: 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
b8c0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
b8d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
b8e0: 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
b8f0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
b900: 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
b910: 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
b920: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
b930: 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
b940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
b950: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b960: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
b970: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
b980: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
b990: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
b9a0: 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
b9b0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
b9c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
b9d0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
b9e0: 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
b9f0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
ba00: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
ba10: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
ba20: 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f  e back to it's o
ba30: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
ba40: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
ba50: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
ba60: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 0a  R_EXCLUSIVE && .
ba70: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
ba80: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
ba90: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
baa0: 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  r) ){.      asse
bab0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
bac0: 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61  DbSize==0 || pPa
bad0: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d  ger->origDbSize=
bae0: 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72  =mxPg );.      r
baf0: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
bb00: 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
bb10: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
bb20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bb30: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
bb40: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
bb50: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
bb60: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
bb70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20 3d 20   }..    /* rc = 
bb80: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
bb90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52  Pager->jfd, JOUR
bba0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
bbb0: 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20  r)); */.    if( 
bbc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
bbd0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
bbe0: 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70  k;.  .    /* Cop
bbf0: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
bc00: 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
bc10: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
bc20: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
bc30: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
bc40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
bc50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
bc60: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
bc70: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
bc80: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
bc90: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
bca0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bcb0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
bcc0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
bcd0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
bce0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
bcf0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bd00: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
bd10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bd20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bd30: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
bd40: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
bd50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
bd60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73  .  }..  /* Pages
bd70: 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
bd80: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
bd90: 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72  ournal but never
bda0: 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65   synced.  ** whe
bdb0: 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20  re not restored 
bdc0: 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76  by the loop abov
bdd0: 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 72  e.  We have to r
bde0: 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a  estore those.  *
bdf0: 2a 20 70 61 67 65 73 20 62 79 20 72 65 61 64 69  * pages by readi
be00: 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f  ng them back fro
be10: 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  m the original d
be20: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
be30: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
be40: 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72  TE_OK );.  pager
be50: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
be60: 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ager);..end_play
be70: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
be80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
be90: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
bea0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
beb0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74  .  }.  if( zMast
bec0: 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  er ){.    /* If 
bed0: 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
bee0: 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
bef0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
bf00: 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20   return true,.  
bf10: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
bf20: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
bf30: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
bf40: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
bf50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
bf60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
bf70: 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
bf80: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
bf90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
bfa0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
bfb0: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
bfc0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
bfd0: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
bfe0: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
bff0: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
c000: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
c010: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
c020: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
c030: 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f  nt PAGER_SECTOR_
c040: 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  SIZE.  ** value.
c050: 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
c060: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
c070: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
c080: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
c090: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47  sectorSize = PAG
c0a0: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  ER_SECTOR_SIZE;.
c0b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c0c0: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
c0d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
c0e0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
c0f0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
c100: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
c110: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
c120: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
c130: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
c140: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
c150: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
c160: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
c170: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
c180: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
c190: 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d        the statem
c1a0: 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ent is stored in
c1b0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
c1c0: 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
c1d0: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
c1e0: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
c1f0: 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
c200: 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
c210: 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74  ng back the stat
c220: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61  ement journal, a
c230: 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  lso.**         p
c240: 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65  layback all page
c250: 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  s of the transac
c260: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67  tion journal beg
c270: 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  inning.**       
c280: 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67    at offset pPag
c290: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a  er->stmtJSize..*
c2a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c2b0: 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
c2c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
c2d0: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c2f0: 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  ize of the full 
c300: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
c310: 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e   hdrOff;.  int n
c320: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
c330: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c340: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
c350: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c360: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c370: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
c380: 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61  rc;..  szJ = pPa
c390: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
c3a0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
c3b0: 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f  .  {.    i64 os_
c3c0: 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  szJ;.    rc = sq
c3d0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
c3e0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f  &pPager->jfd, &o
c3f0: 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20  s_szJ);.    if( 
c400: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
c410: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61  return rc;.    a
c420: 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73  ssert( szJ==os_s
c430: 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  zJ );.  }.#endif
c440: 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66  ..  /* Set hdrOf
c450: 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73  f to be the offs
c460: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
c470: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
c480: 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  ritten.  ** this
c490: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
c4a0: 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65  action, or the e
c4b0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
c4c0: 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  f no journal.  *
c4d0: 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  * header was wri
c4e0: 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  tten..  */.  hdr
c4f0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
c500: 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65  mtHdrOff;.  asse
c510: 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
c520: 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20  Sync || !hdrOff 
c530: 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66  );.  if( !hdrOff
c540: 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d   ){.    hdrOff =
c550: 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   szJ;.  }.  .  /
c560: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
c570: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
c580: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
c590: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
c5a0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
c5b0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
c5c0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
c5d0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
c5e0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
c5f0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
c600: 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
c610: 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f  ->stmtSize;..  /
c620: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
c630: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
c640: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
c650: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
c660: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c670: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
c680: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c690: 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  pen );.  sqlite3
c6a0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
c6b0: 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63  stfd, 0);.  nRec
c6c0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
c6d0: 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  Rec;.  .  /* Cop
c6e0: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
c6f0: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74   out of the stat
c700: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  ement journal an
c710: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
c720: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
c730: 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
c740: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
c750: 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b  rnal omits check
c760: 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65  sums from.  ** e
c770: 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65  ach record since
c780: 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72   power-failure r
c790: 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69  ecovery is not i
c7a0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74  mportant to stat
c7b0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ement.  ** journ
c7c0: 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  als..  */.  for(
c7d0: 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20  i=nRec-1; i>=0; 
c7e0: 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  i--){.    rc = p
c7f0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
c800: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
c810: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
c820: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
c830: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
c840: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c850: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
c860: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
c870: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72  .  }..  /* Now r
c880: 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62  oll some pages b
c890: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61  ack from the tra
c8a0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
c8b0: 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a  . Pager.stmtJSiz
c8c0: 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73  e.  ** was the s
c8d0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
c8e0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  al file when thi
c8f0: 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  s statement was 
c900: 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a  started, so.  **
c910: 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65   everything afte
c920: 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  r that needs to 
c930: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  be rolled back, 
c940: 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a  either into the.
c950: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
c960: 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c  he memory cache,
c970: 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20   or both..  **. 
c980: 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   ** If it is not
c990: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65   zero, then Page
c9a0: 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20  r.stmtHdrOff is 
c9b0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
c9c0: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
c9d0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
c9e0: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
c9f0: 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61   during this sta
ca00: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
ca10: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
ca20: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
ca30: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
ca40: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
ca50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ca60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
ca70: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
ca80: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
ca90: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
caa0: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
cab0: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
cac0: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
cad0: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65  tmtCksum;.  asse
cae0: 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  rt( JOURNAL_HDR_
caf0: 53 5a 28 70 50 61 67 65 72 29 3c 28 70 50 61 67  SZ(pPager)<(pPag
cb00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20  er->pageSize+8) 
cb10: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  );.  while( pPag
cb20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
cb30: 3d 20 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65  = (hdrOff-(pPage
cb40: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20  r->pageSize+8)) 
cb50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
cb60: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
cb70: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
cb80: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
cb90: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
cba0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
cbb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cbc0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
cbd0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
cbe0: 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ..  while( pPage
cbf0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
cc00: 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  szJ ){.    u32 n
cc10: 52 65 63 3b 0a 20 20 20 20 75 33 32 20 64 75 6d  Rec;.    u32 dum
cc20: 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
cc30: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
cc40: 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  er, szJ, &nRec, 
cc50: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28  &dummy);.    if(
cc60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cc70: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
cc80: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
cc90: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
cca0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
ccb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
ccc0: 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rec==0 ){.      
ccd0: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  nRec = (szJ - pP
cce0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ccf0: 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67  ) / (pPager->pag
cd00: 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a  eSize+8);.    }.
cd10: 20 20 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31      for(i=nRec-1
cd20: 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72  ; i>=0 && pPager
cd30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
cd40: 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  zJ; i--){.      
cd50: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
cd60: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
cd70: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ger, &pPager->jf
cd80: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  d, 1);.      ass
cd90: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
cda0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66  DONE );.      if
cdb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cdc0: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
cdd0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
cde0: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
cdf0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
ce00: 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  .  .end_stmt_pla
ce10: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21  yback:.  if( rc!
ce20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ce30: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
ce40: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
ce50: 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ORRUPT;.    rc =
ce60: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
ce70: 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50    /* bkpt-CORRUP
ce80: 54 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  T */.  }else{.  
ce90: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
cea0: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
ceb0: 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  /* pager_reload_
cec0: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a  cache(pPager); *
ced0: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
cee0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
cef0: 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
cf00: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
cf10: 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
cf20: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a  e allowed..**.**
cf30: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
cf40: 62 65 72 20 69 73 20 74 68 65 20 61 62 73 6f 6c  ber is the absol
cf50: 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ute value of the
cf60: 20 6d 78 50 61 67 65 20 70 61 72 61 6d 65 74 65   mxPage paramete
cf70: 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61 67 65 20  r..** If mxPage 
cf80: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
cf90: 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20   noSync flag is 
cfa0: 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e  also set.  noSyn
cfb0: 63 20 62 79 70 61 73 73 65 73 0a 2a 2a 20 63 61  c bypasses.** ca
cfc0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  lls to sqlite3Os
cfd0: 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70 61 67  Sync().  The pag
cfe0: 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66 61 73  er runs much fas
cff0: 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e 63 20  ter with noSync 
d000: 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20 74 68  on,.** but if th
d010: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
d020: 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
d030: 65 72 65 20 69 73 20 61 6e 20 61 62 72 75 70 74  ere is an abrupt
d040: 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75   power .** failu
d050: 72 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  re, the database
d060: 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
d070: 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
d080: 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e  istent and.** un
d090: 72 65 70 61 69 72 61 62 6c 65 20 73 74 61 74 65  repairable state
d0a0: 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
d0b0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63  te3pager_set_cac
d0c0: 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
d0d0: 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
d0e0: 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
d0f0: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
d100: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
d110: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20  r->tempFile;.   
d120: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
d130: 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
d140: 65 64 53 79 6e 63 20 3d 20 30 3b 20 0a 20 20 7d  edSync = 0; .  }
d150: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
d160: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20  ->noSync = 1;.  
d170: 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50 61    mxPage = -mxPa
d180: 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78  ge;.  }.  if( mx
d190: 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
d1a0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
d1b0: 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  mxPage;.  }else{
d1c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
d1d0: 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  age = 10;.  }.}.
d1e0: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
d1f0: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
d200: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
d210: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
d220: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
d230: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
d240: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
d250: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
d260: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
d270: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
d280: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
d290: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
d2a0: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
d2b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
d2c0: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
d2d0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
d2e0: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
d2f0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
d300: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
d310: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
d320: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
d330: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
d340: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
d350: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
d360: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d370: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
d380: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
d390: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
d3a0: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
d3b0: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
d3c0: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
d3d0: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
d3e0: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
d400: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
d410: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
d420: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
d430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
d440: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
d450: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
d460: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
d470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
d480: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
d490: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
d4a0: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
d4b0: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
d4c0: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
d4d0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
d4e0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d500: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
d510: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
d520: 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
d530: 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
d540: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
d550: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
d560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
d570: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
d580: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
d590: 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
d5a0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
d5b0: 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
d5c0: 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
d5d0: 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
d5e0: 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
d5f0: 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
d610: 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
d620: 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
d630: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
d640: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d650: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
d660: 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
d670: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
d680: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
d690: 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
d6a0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
d6b0: 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
d6c0: 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
d6d0: 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
d6e0: 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
d6f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
d700: 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
d710: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
d720: 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61 67  safety_level(Pag
d730: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d740: 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67 65 72  level){.  pPager
d750: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
d760: 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
d770: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
d780: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
d790: 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
d7a0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
d7b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
d7c0: 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
d7d0: 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
d7e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
d7f0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
d800: 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  .  Write the nam
d810: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  e of the file in
d820: 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61  to zName.** (zNa
d830: 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  me must be at le
d840: 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ast SQLITE_TEMPN
d850: 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c  AME_SIZE bytes l
d860: 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20  ong.)  Write.** 
d870: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
d880: 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52  tor into *fd.  R
d890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
d8a0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f  on success or so
d8b0: 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f  me.** other erro
d8c0: 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
d8d0: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20  l..**.** The OS 
d8e0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
d8f0: 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
d900: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
d910: 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  n it is.** close
d920: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d930: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
d940: 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69  entemp(char *zFi
d950: 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b  le, OsFile *fd){
d960: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a  .  int cnt = 8;.
d970: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a    int rc;.  do{.
d980: 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73      cnt--;.    s
d990: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
d9a0: 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  Name(zFile);.   
d9b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
d9c0: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69  penExclusive(zFi
d9d0: 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77  le, fd, 1);.  }w
d9e0: 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72  hile( cnt>0 && r
d9f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
da00: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
da10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
da20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
da30: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
da40: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
da50: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
da60: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
da70: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
da80: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
da90: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
daa0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
dab0: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
dac0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
dad0: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
dae0: 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
daf0: 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
db00: 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
db10: 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
db20: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
db30: 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
db40: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
db50: 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
db60: 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
db70: 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
db80: 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
db90: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
dba0: 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
dbb0: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
dbc0: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
dbd0: 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
dbe0: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
dbf0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
dc00: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
dc10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
dc20: 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
dc30: 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
dc40: 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
dc50: 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
dc60: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
dc70: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
dc80: 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
dc90: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28  lite3pager_open(
dca0: 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
dcb0: 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
dcc0: 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
dcd0: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
dce0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
dcf0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
dd00: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
dd10: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
dd20: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
dd30: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
dd40: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
dd50: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
dd60: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
dd70: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
dd80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
dd90: 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
dda0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  this file */.){.
ddb0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
ddc0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61  .  char *zFullPa
ddd0: 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  thname = 0;.  in
dde0: 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46  t nameLen;.  OsF
ddf0: 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63  ile fd;.  int rc
de00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
de10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d  int i;.  int tem
de20: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pFile = 0;.  int
de30: 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e   memDb = 0;.  in
de40: 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  t readOnly = 0;.
de50: 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
de60: 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
de70: 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
de80: 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64  =0;.  int noRead
de90: 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20  lock = (flags & 
dea0: 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
deb0: 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54  K)!=0;.  char zT
dec0: 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  emp[SQLITE_TEMPN
ded0: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70  AME_SIZE];..  *p
dee0: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d 65  pPager = 0;.  me
def0: 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a  mset(&fd, 0, siz
df00: 65 6f 66 28 66 64 29 29 3b 0a 20 20 69 66 28 20  eof(fd));.  if( 
df10: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
df20: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
df30: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
df40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
df50: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
df60: 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66  me[0] ){.#ifndef
df70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
df80: 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
df90: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
dfa0: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
dfb0: 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
dfc0: 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  ;.      zFullPat
dfd0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  hname = sqliteSt
dfe0: 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20  rDup("");.      
dff0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e000: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
e010: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75  .    {.      zFu
e020: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e030: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
e040: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
e050: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
e060: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
e070: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e080: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
e090: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
e0a0: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
e0b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
e0c0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
e0d0: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
e0e0: 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b  emp(zTemp, &fd);
e0f0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
e100: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
e110: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
e120: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
e130: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
e140: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e150: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
e160: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
e170: 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c  .  }.  if( !zFul
e180: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e190: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
e1a0: 26 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  &fd);.    return
e1b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e1c0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
e1d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
e1e0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64  lite3OsClose(&fd
e1f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
e200: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e210: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
e220: 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d  .  }.  nameLen =
e230: 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74   strlen(zFullPat
e240: 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72  hname);.  pPager
e250: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
e260: 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
e270: 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33   + nameLen*3 + 3
e280: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
e290: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
e2a0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
e2b0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e2c0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e2d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e2e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54  E_NOMEM;.  }.  T
e2f0: 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25  RACE3("OPEN %d %
e300: 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
e310: 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74  ID(fd), zFullPat
e320: 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72  hname);.  pPager
e330: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
e340: 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  har*)&pPager[1];
e350: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  .  pPager->zDire
e360: 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d  ctory = &pPager-
e370: 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c  >zFilename[nameL
e380: 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  en+1];.  pPager-
e390: 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
e3a0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
e3b0: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74  nameLen+1];.  st
e3c0: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  rcpy(pPager->zFi
e3d0: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
e3e0: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
e3f0: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
e400: 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ory, zFullPathna
e410: 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d  me);.  for(i=nam
e420: 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61  eLen; i>0 && pPa
e430: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
e440: 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
e450: 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
e460: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
e470: 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72  [i-1] = 0;.  str
e480: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
e490: 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  rnal, zFullPathn
e4a0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
e4b0: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
e4c0: 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61  );.  strcpy(&pPa
e4d0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61  ger->zJournal[na
e4e0: 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61  meLen], "-journa
e4f0: 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  l");.  pPager->f
e500: 64 20 3d 20 66 64 3b 0a 23 69 66 20 4f 53 5f 55  d = fd;.#if OS_U
e510: 4e 49 58 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  NIX.  pPager->fd
e520: 2e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  .pPager = pPager
e530: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
e540: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
e550: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   0;.  pPager->us
e560: 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
e570: 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
e580: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
e590: 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
e5a0: 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
e5b0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
e5c0: 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  en = 0;.  pPager
e5d0: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
e5e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
e5f0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
e600: 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
e610: 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
e620: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
e630: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
e640: 20 20 70 50 61 67 65 72 2d 3e 70 73 41 6c 69 67    pPager->psAlig
e650: 6e 65 64 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47  ned = FORCE_ALIG
e660: 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 70 61  NMENT(pPager->pa
e670: 67 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  geSize);.  pPage
e680: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
e690: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
e6a0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
e6b0: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
e6c0: 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67   pPager->nMaxPag
e6d0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
e6e0: 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20  >mxPage = 100;. 
e6f0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
e700: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
e710: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
e720: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e730: 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46  tempFile = tempF
e740: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
e750: 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
e760: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
e770: 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70   = readOnly;.  p
e780: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
e790: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
e7a0: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
e7b0: 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
e7c0: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
e7d0: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
e7e0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
e7f0: 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46  1);.  pPager->pF
e800: 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  irst = 0;.  pPag
e810: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
e820: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e830: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
e840: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f  ger->nExtra = FO
e850: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
e860: 78 74 72 61 29 3b 0a 20 20 70 50 61 67 65 72 2d  xtra);.  pPager-
e870: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41  >sectorSize = PA
e880: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  GER_SECTOR_SIZE;
e890: 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
e8a0: 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20 6d  Handler = 0;.  m
e8b0: 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
e8c0: 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
e8d0: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a  Pager->aHash));.
e8e0: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
e8f0: 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
e900: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e910: 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
e920: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
e930: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e940: 70 61 67 65 72 5f 73 65 74 5f 62 75 73 79 68 61  pager_set_busyha
e950: 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61  ndler(Pager *pPa
e960: 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72  ger, BusyHandler
e970: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b   *pBusyHandler){
e980: 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
e990: 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48  Handler = pBusyH
e9a0: 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  andler;.}../*.**
e9b0: 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63   Set the destruc
e9c0: 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  tor for this pag
e9d0: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
e9e0: 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  , the destructor
e9f0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68   is called.** wh
ea00: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
ea10: 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70   count on each p
ea20: 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f  age reaches zero
ea30: 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  .  The destructo
ea40: 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  r can.** be used
ea50: 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66   to clean up inf
ea60: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
ea70: 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70  extra segment ap
ea80: 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70  pended to each p
ea90: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  age..**.** The d
eaa0: 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74  estructor is not
eab0: 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73   called as a res
eac0: 75 6c 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  ult sqlite3pager
ead0: 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44  _close().  .** D
eae0: 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f  estructors are o
eaf0: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
eb00: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
eb10: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
eb20: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73  te3pager_set_des
eb30: 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70  tructor(Pager *p
eb40: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44  Pager, void (*xD
eb50: 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  esc)(void*,int))
eb60: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
eb70: 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
eb80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
eb90: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
eba0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
ebb0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
ebc0: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
ebd0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
ebe0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
ebf0: 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
ec00: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
ec10: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
ec20: 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
ec30: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
ec40: 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
ec50: 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
ec60: 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
ec70: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
ec80: 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
ec90: 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
eca0: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
ecb0: 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
ecc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
ecd0: 67 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72  ger_set_reiniter
ece0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ecf0: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
ed00: 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  void*,int)){.  p
ed10: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
ed20: 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
ed30: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67  *.** Set the pag
ed40: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
ed50: 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
ed60: 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64   only be changed
ed70: 20 77 68 65 6e 20 74 68 65 20 63 61 63 68 65 20   when the cache 
ed80: 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 76 6f 69  is empty..*/.voi
ed90: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
eda0: 65 74 5f 70 61 67 65 73 69 7a 65 28 50 61 67 65  et_pagesize(Page
edb0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70  r *pPager, int p
edc0: 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65  ageSize){.  asse
edd0: 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  rt( pageSize>=51
ede0: 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
edf0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
ee00: 49 5a 45 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  IZE );.  pPager-
ee10: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
ee20: 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
ee30: 70 73 41 6c 69 67 6e 65 64 20 3d 20 46 4f 52 43  psAligned = FORC
ee40: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 61 67 65  E_ALIGNMENT(page
ee50: 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Size);.}../*.** 
ee60: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
ee70: 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
ee80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
ee90: 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
eea0: 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
eeb0: 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4e 6f 20 65  points to.  No e
eec0: 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73  rror checking is
eed0: 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   done..*/.void s
eee0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61 64  qlite3pager_read
eef0: 5f 66 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  _fileheader(Page
ef00: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
ef10: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
ef20: 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65  *pDest){.  memse
ef30: 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
ef40: 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29    if( MEMDB==0 )
ef50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  {.    sqlite3OsS
ef60: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
ef70: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
ef80: 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
ef90: 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20  fd, pDest, N);. 
efa0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
efb0: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
efc0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
efd0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
efe0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
eff0: 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20   pPager..*/.int 
f000: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
f010: 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
f020: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
f030: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f040: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
f050: 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
f060: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
f070: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
f080: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
f090: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
f0a0: 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54  ->fd, &n)!=SQLIT
f0b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
f0c0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
f0d0: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20  AGER_ERR_DISK;. 
f0e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f0f0: 0a 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e  .  n /= pPager->
f100: 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
f110: 21 4d 45 4d 44 42 20 26 26 20 6e 3d 3d 50 45 4e  !MEMDB && n==PEN
f120: 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
f130: 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
f140: 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
f150: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
f160: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
f170: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
f180: 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65  ze = n;.  }.  re
f190: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
f1a0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
f1b0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
f1c0: 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
f1d0: 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  ager*);.../*.** 
f1e0: 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
f1f0: 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e  it's hash chain.
f200: 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61   Also set the pa
f210: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74  ge number to 0 t
f220: 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68  o indicate.** th
f230: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
f240: 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68  ot part of any h
f250: 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20  ash chain. This 
f260: 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
f270: 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  use the.** sqlit
f280: 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65  e3pager_movepage
f290: 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c  () routine can l
f2a0: 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74  eave a page in t
f2b0: 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65  he .** pNextFree
f2c0: 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20  /pPrevFree list 
f2d0: 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61  that is not a pa
f2e0: 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63  rt of any hash-c
f2f0: 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
f300: 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43  void unlinkHashC
f310: 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  hain(Pager *pPag
f320: 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
f330: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f  .  if( pPg->pgno
f340: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
f350: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
f360: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
f370: 68 69 73 20 70 61 67 65 20 69 73 20 6e 6f 74 20  his page is not 
f380: 69 6e 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  in any hash chai
f390: 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  n. */.    return
f3a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
f3b0: 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
f3c0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
f3d0: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
f3e0: 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
f3f0: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  }.  if( pPg->pPr
f400: 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73  evHash ){.    as
f410: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
f420: 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70  ash[pager_hash(p
f430: 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70 50 67 20  Pg->pgno)]!=pPg 
f440: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  );.    pPg->pPre
f450: 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
f460: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
f470: 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
f480: 69 6e 74 20 68 20 3d 20 70 61 67 65 72 5f 68 61  int h = pager_ha
f490: 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  sh(pPg->pgno);. 
f4a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f4b0: 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67  r->aHash[h]==pPg
f4c0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
f4d0: 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e  aHash[h] = pPg->
f4e0: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 0a  pNextHash;.  }..
f4f0: 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
f500: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
f510: 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
f520: 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sh = 0;.}../*.**
f530: 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66   Unlink a page f
f540: 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
f550: 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61  t (the list of a
f560: 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  ll pages where n
f570: 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66  Ref==0).** and f
f580: 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c  rom its hash col
f590: 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f  lision chain..*/
f5a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
f5b0: 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  inkPage(PgHdr *p
f5c0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
f5d0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
f5e0: 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74  er;..  /* Keep t
f5f0: 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20  he pFirstSynced 
f600: 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67  pointer pointing
f610: 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79   at the first sy
f620: 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20  nchronized page 
f630: 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50  */.  if( pPg==pP
f640: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
f650: 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  ed ){.    PgHdr 
f660: 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
f670: 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ree;.    while( 
f680: 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
f690: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
f6a0: 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67  Free; }.    pPag
f6b0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
f6c0: 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = p;.  }..  /* 
f6d0: 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
f6e0: 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66  freelist */.  if
f6f0: 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
f700: 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   ){.    pPg->pPr
f710: 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
f720: 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
f730: 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
f740: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f750: 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a  >pFirst==pPg );.
f760: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
f770: 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
f780: 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ree;.  }.  if( p
f790: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
f7a0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
f7b0: 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
f7c0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
f7d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
f7e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c  sert( pPager->pL
f7f0: 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  ast==pPg );.    
f800: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
f810: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
f820: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
f830: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
f840: 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  vFree = 0;..  /*
f850: 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
f860: 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65   pgno hash table
f870: 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
f880: 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
f890: 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  g);.}..#ifndef S
f8a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
f8b0: 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  YDB./*.** This r
f8c0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
f8d0: 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e  o truncate an in
f8e0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
f8f0: 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c  .  Delete.** all
f900: 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e   pages whose pgn
f910: 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  o is larger than
f920: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
f930: 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
f940: 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ced..** Referenc
f950: 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
f960: 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
f970: 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
f980: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
f990: 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61  emoryTruncate(Pa
f9a0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
f9b0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
f9c0: 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
f9d0: 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
f9e0: 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
f9f0: 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
fa00: 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
fa10: 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
fa20: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
fa30: 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
fa40: 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
fa50: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
fa60: 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
fa70: 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
fa80: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
fa90: 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
faa0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
fab0: 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
fac0: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
fad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
fae0: 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
faf0: 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  ll;.      unlink
fb00: 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
fb10: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
fb20: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
fb30: 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
fb40: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69   }.}.#else.#defi
fb50: 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74  ne memoryTruncat
fb60: 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e(p).#endif../*.
fb70: 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
fb80: 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c   a lock on a fil
fb90: 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  e.  Invoke the b
fba0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
fbb0: 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63  the lock.** is c
fbc0: 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
fbd0: 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 65  ilable.  Repeate
fbe0: 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
fbf0: 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
fc00: 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
fc10: 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
fc20: 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
fc30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
fc40: 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
fc50: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
fc60: 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
fc70: 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
fc80: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
fc90: 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
fca0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
fcb0: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
fcc0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41  rc;.  assert( PA
fcd0: 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
fce0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
fcf0: 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
fd00: 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
fd10: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
fd20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
fd30: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
fd40: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
fd50: 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
fd60: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
fd70: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
fd80: 0a 20 20 20 20 69 6e 74 20 62 75 73 79 20 3d 20  .    int busy = 
fd90: 31 3b 0a 20 20 20 20 42 75 73 79 48 61 6e 64 6c  1;.    BusyHandl
fda0: 65 72 20 2a 70 48 3b 0a 20 20 20 20 64 6f 20 7b  er *pH;.    do {
fdb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
fdc0: 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65  te3OsLock(&pPage
fdd0: 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
fde0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
fdf0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
fe00: 20 0a 20 20 20 20 20 20 20 20 28 70 48 20 3d 20   .        (pH = 
fe10: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
fe20: 64 6c 65 72 29 21 3d 30 20 26 26 20 0a 20 20 20  dler)!=0 && .   
fe30: 20 20 20 20 20 70 48 2d 3e 78 46 75 6e 63 20 26       pH->xFunc &
fe40: 26 20 70 48 2d 3e 78 46 75 6e 63 28 70 48 2d 3e  & pH->xFunc(pH->
fe50: 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20  pArg, busy++).  
fe60: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
fe70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fe80: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
fe90: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
fea0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
feb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
fec0: 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
fed0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
fee0: 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
fef0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ff00: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
ff10: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
ff20: 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
ff30: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 70 61   rc;.  sqlite3pa
ff40: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
ff50: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
ff60: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
ff70: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
ff80: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
ff90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
ffa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
ffb0: 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61  e>=(unsigned)pPa
ffc0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
ffd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ffe0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  _OK;.  }.  if( M
fff0: 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
10000 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
10010 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72  ge;.    memoryTr
10020 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
10030 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10040 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
10050 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
10060 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
10070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10080 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10090 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63  .  /* Get an exc
100a0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
100b0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
100c0 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a  re truncating. *
100d0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
100e0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
100f0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
10100 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
10110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10120 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
10130 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
10140 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50  ncate(pPager, nP
10150 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
10160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10170 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
10180 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72  = nPage;.  }.  r
10190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
101a0 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
101b0 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
101c0 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
101d0 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
101e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
101f0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
10200 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
10210 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10220 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
10230 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
10240 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
10250 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
10260 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
10270 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
10280 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
10290 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
102a0 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
102b0 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
102c0 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
102d0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
102e0 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
102f0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
10300 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
10310 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
10320 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  r_close(Pager *p
10330 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
10340 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
10350 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e  switch( pPager->
10360 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  state ){.    cas
10370 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
10380 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  :.    case PAGER
10390 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63 61  _SYNCED: .    ca
103a0 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  se PAGER_EXCLUSI
103b0 56 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 57  VE: {.      /* W
103c0 65 20 69 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20  e ignore any IO 
103d0 65 72 72 6f 72 73 20 74 68 61 74 20 6f 63 63 75  errors that occu
103e0 72 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  r during the rol
103f0 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6f  lback.      ** o
10400 70 65 72 61 74 69 6f 6e 2e 20 53 6f 20 64 69 73  peration. So dis
10410 61 62 6c 65 20 49 4f 20 65 72 72 6f 72 20 73 69  able IO error si
10420 6d 75 6c 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  mulation so that
10430 20 74 65 73 74 69 6e 67 0a 20 20 20 20 20 20 2a   testing.      *
10440 2a 20 77 6f 72 6b 73 20 6d 6f 72 65 20 65 61 73  * works more eas
10450 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 23 69  ily..      */.#i
10460 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
10470 5f 54 45 53 54 29 20 26 26 20 28 64 65 66 69 6e  _TEST) && (defin
10480 65 64 28 4f 53 5f 55 4e 49 58 29 20 7c 7c 20 64  ed(OS_UNIX) || d
10490 65 66 69 6e 65 64 28 4f 53 5f 57 49 4e 29 29 0a  efined(OS_WIN)).
104a0 20 20 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74        extern int
104b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
104c0 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 20 20 20  r_pending;.     
104d0 20 69 6e 74 20 69 6f 65 72 72 5f 63 6e 74 20 3d   int ioerr_cnt =
104e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
104f0 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 20 20 20  r_pending;.     
10500 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
10510 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
10520 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c  #endif.      sql
10530 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
10540 63 6b 28 70 50 61 67 65 72 29 3b 0a 23 69 66 20  ck(pPager);.#if 
10550 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
10560 45 53 54 29 20 26 26 20 28 64 65 66 69 6e 65 64  EST) && (defined
10570 28 4f 53 5f 55 4e 49 58 29 20 7c 7c 20 64 65 66  (OS_UNIX) || def
10580 69 6e 65 64 28 4f 53 5f 57 49 4e 29 29 0a 20 20  ined(OS_WIN)).  
10590 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65      sqlite3_io_e
105a0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 69  rror_pending = i
105b0 6f 65 72 72 5f 63 6e 74 3b 0a 23 65 6e 64 69 66  oerr_cnt;.#endif
105c0 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44  .      if( !MEMD
105d0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  B ){.        sql
105e0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
105f0 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
10600 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
10610 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10620 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 70 50 61  ->errMask || pPa
10630 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
10640 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
10650 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10660 73 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a  se PAGER_SHARED:
10670 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45   {.      if( !ME
10680 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MDB ){.        s
10690 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
106a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
106b0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
106c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
106d0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
106e0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
106f0 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ing */.      bre
10700 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
10710 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
10720 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
10730 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e  Next){.#ifndef N
10740 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 4d 45  DEBUG.    if( ME
10750 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48  MDB ){.      PgH
10760 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
10770 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
10780 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
10790 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
107a0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
107b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
107c0 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
107d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
107e0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
107f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
10800 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
10810 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  extAll;.    sqli
10820 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  teFree(pPg);.  }
10830 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45  .  TRACE2("CLOSE
10840 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
10850 70 50 61 67 65 72 29 29 3b 0a 20 20 61 73 73 65  pPager));.  asse
10860 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  rt( pPager->errM
10870 61 73 6b 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ask || (pPager->
10880 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26  journalOpen==0 &
10890 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  & pPager->stmtOp
108a0 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  en==0) );.  if( 
108b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
108c0 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
108d0 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
108e0 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  r->jfd);.  }.  s
108f0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
10900 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
10910 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
10920 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
10930 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
10940 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a  ger->stfd);.  }.
10950 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
10960 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
10970 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61   /* Temp files a
10980 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
10990 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
109a0 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67  OS.  ** if( pPag
109b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
109c0 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73    **   sqlite3Os
109d0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
109e0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20  Filename);.  ** 
109f0 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65  }.  */..  sqlite
10a00 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Free(pPager);.  
10a10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
10a30 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
10a40 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
10a50 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
10a60 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  no sqlite3pager_
10a70 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20  pagenumber(void 
10a80 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
10a90 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47   *p = DATA_TO_PG
10aa0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
10ab0 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
10ac0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f  ./*.** The page_
10ad0 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ref() function i
10ae0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65  ncrements the re
10af0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
10b00 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20  r a page..** If 
10b10 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  the page is curr
10b20 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
10b30 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72  elist (the refer
10b40 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
10b50 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f  ro) then.** remo
10b60 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66  ve it from the f
10b70 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46  reelist..**.** F
10b80 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74  or non-test syst
10b90 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20  ems, page_ref() 
10ba0 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20  is a macro that 
10bb0 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28  calls _page_ref(
10bc0 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74  ).** online of t
10bd0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
10be0 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72  nt is zero.  For
10bf0 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70   test systems, p
10c00 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20  age_ref().** is 
10c10 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
10c20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  so that we can s
10c30 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61  et breakpoints a
10c40 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a  nd trace it..*/.
10c50 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67  static void _pag
10c60 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
10c70 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  ){.  if( pPg->nR
10c80 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ef==0 ){.    /* 
10c90 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  The page is curr
10ca0 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
10cb0 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69  elist.  Remove i
10cc0 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  t. */.    if( pP
10cd0 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  g==pPg->pPager->
10ce0 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
10cf0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d        PgHdr *p =
10d00 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
10d10 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
10d20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
10d30 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
10d40 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d  ee; }.      pPg-
10d50 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
10d60 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d  ynced = p;.    }
10d70 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
10d80 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
10d90 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
10da0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
10db0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
10dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
10dd0 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
10de0 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
10df0 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ee;.    }.    if
10e00 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
10e10 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
10e20 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
10e30 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
10e40 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
10e50 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
10e60 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
10e70 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
10e80 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  }.    pPg->pPage
10e90 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
10ea0 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
10eb0 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a  REFINFO(pPg);.}.
10ec0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
10ed0 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
10ee0 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72  d page_ref(PgHdr
10ef0 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20   *pPg){.    if( 
10f00 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
10f10 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28        _page_ref(
10f20 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
10f30 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  .      pPg->nRef
10f40 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46  ++;.      REFINF
10f50 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  O(pPg);.    }.  
10f60 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
10f70 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28   page_ref(P)   (
10f80 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61  (P)->nRef==0?_pa
10f90 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29  ge_ref(P):(void)
10fa0 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e  (P)->nRef++).#en
10fb0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
10fc0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
10fd0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
10fe0 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
10ff0 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
11000 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
11010 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
11020 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
11030 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
11040 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
11050 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
11060 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65  Data);.  page_re
11070 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
11080 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11090 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
110a0 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72  urnal.  In other
110b0 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
110c0 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
110d0 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
110e0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
110f0 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
11100 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
11110 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
11120 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69  e.** disk.  It i
11130 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f  s not safe to mo
11140 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61  dify the origina
11150 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
11160 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74  until after.** t
11170 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
11180 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20  een synced.  If 
11190 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
111a0 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65  abase is modifie
111b0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
111c0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
111d0 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61  d and a power fa
111e0 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68  ilure occurs, th
111f0 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e  e unsynced journ
11200 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64  al.** data would
11210 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20   be lost and we 
11220 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20  would be unable 
11230 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f  to completely ro
11240 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61  llback the.** da
11250 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
11260 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
11270 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72  tion would occur
11280 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
11290 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74  utine also updat
112a0 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  es the nRec fiel
112b0 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  d in the header 
112c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
112d0 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ** (See comments
112e0 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c   on the pager_pl
112f0 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
11300 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
11310 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a  information.).**
11320 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64   If the sync mod
11330 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73  e is FULL, two s
11340 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e  yncs will occur.
11350 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c    First the whol
11360 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20  e journal.** is 
11370 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65  synced, then the
11380 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
11390 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73  pdated, then a s
113a0 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72  econd sync occur
113b0 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
113c0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
113d0 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  , we do not care
113e0 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
113f0 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61  to rollback.** a
11400 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  fter a power fai
11410 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63  lure, so sync oc
11420 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  curs..**.** This
11430 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
11440 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
11450 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
11460 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
11470 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
11480 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
11490 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
114a0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
114b0 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
114c0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
114d0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
114e0 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
114f0 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
11500 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69  ase.  ** (assumi
11510 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f  ng there is a jo
11520 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65  urnal and it nee
11530 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e  ds to be synced.
11540 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
11550 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
11560 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
11570 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
11580 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
11590 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
115a0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  );.      /* asse
115b0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  rt( !pPager->noS
115c0 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63  ync ); // noSync
115d0 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66   might be set if
115e0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20   synchronous.   
115f0 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64     ** was turned
11600 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74   off after the t
11610 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
11620 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20  tarted.  Ticket 
11630 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20  #615 */.#ifndef 
11640 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20  NDEBUG.      {. 
11650 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
11660 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e  ure the pPager->
11670 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20  nRec counter we 
11680 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65  are keeping agre
11690 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  es.        ** wi
116a0 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70  th the nRec comp
116b0 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69  uted from the si
116c0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
116d0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
116e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a  */.        i64 j
116f0 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Sz;.        rc =
11700 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11710 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
11720 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
11730 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
11740 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
11750 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
11760 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29  ournalOff==jSz )
11770 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
11780 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
11790 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
117a0 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
117b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
117c0 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
117d0 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
117e0 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
117f0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
11800 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
11810 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
11820 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
11830 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
11840 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
11850 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
11860 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
11870 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
11880 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a   for rollback. .
11890 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
118a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
118b0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
118c0 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e       TRACE2("SYN
118d0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
118e0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
118f0 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er));.          
11900 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
11910 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
11920 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
11930 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
11940 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
11950 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
11960 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
11970 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11980 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
11990 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
119a0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
119b0 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
119c0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
119d0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
119e0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
119f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11a00 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
11a10 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
11a20 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20  rnalOff);.      
11a30 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  }.      TRACE2("
11a40 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
11a50 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
11a60 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 72  Pager));.      r
11a70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
11a80 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  c(&pPager->jfd);
11a90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
11aa0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
11ab0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
11ac0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
11ad0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
11ae0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
11af0 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
11b00 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
11b10 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
11b20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
11b30 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
11b40 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
11b50 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
11b60 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
11b70 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
11b80 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
11b90 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
11ba0 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rst;.  }..#ifnde
11bb0 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
11bc0 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
11bd0 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
11be0 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
11bf0 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
11c00 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
11c10 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
11c20 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
11c30 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
11c40 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
11c50 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
11c60 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
11c70 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
11c80 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
11c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
11ca0 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
11cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
11cc0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
11cd0 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
11ce0 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  ->pFirst );.  }.
11cf0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
11d00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
11d10 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
11d20 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
11d30 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
11d40 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
11d50 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
11d60 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
11d70 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
11d80 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20  e file and mark 
11d90 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63  them all.** as c
11da0 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
11db0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
11dc0 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
11dd0 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
11de0 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
11df0 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
11e00 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
11e10 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
11e20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
11e30 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
11e40 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
11e50 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
11e60 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
11e70 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
11e80 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
11e90 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
11ea0 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
11eb0 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
11ec0 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
11ed0 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
11ee0 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
11ef0 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
11f00 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
11f10 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
11f20 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
11f30 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
11f40 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
11f50 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
11f60 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
11f70 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
11f80 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
11f90 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
11fa0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
11fb0 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
11fc0 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
11fd0 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
11fe0 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
11ff0 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
12000 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
12010 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
12020 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
12030 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
12040 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
12050 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
12060 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
12070 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
12080 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
12090 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
120a0 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
120b0 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
120c0 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
120d0 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
120e0 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
120f0 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
12100 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
12110 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
12120 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
12130 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
12140 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
12150 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
12160 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
12170 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
12180 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
12190 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
121a0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
121b0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
121c0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
121d0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
121e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
121f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12200 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  }..  while( pLis
12210 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
12220 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
12230 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
12240 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
12250 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
12260 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
12270 65 53 69 7a 65 29 3b 0a 20 20 20 20 2f 2a 20 49  eSize);.    /* I
12280 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
12290 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
122a0 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
122b0 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
122c0 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
122d0 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
122e0 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
122f0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
12300 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
12310 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
12320 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
12330 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
12340 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
12350 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
12360 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
12370 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
12380 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
12390 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
123a0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
123b0 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
123c0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
123d0 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
123e0 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54 52 41  o, 6);.      TRA
123f0 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE3("STORE %d pa
12400 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
12410 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
12420 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72  ->pgno);.      r
12430 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
12440 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
12450 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
12460 69 73 74 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  ist), pPager->pa
12470 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 43  geSize);.      C
12480 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
12490 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
124a0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
124b0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  0);.      pPager
124c0 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ->nWrite++;.    
124d0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
124e0 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
124f0 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45   TRACE3("NOSTORE
12500 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
12510 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
12520 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
12530 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12540 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12550 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
12560 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
12570 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
12580 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
12590 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
125a0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
125b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
125c0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
125d0 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
125e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
125f0 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
12600 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
12610 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
12620 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
12630 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
12640 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
12650 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
12660 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
12670 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
12680 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
12690 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
126a0 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
126b0 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
126c0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
126d0 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69  p, *pList;.  pLi
126e0 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  st = 0;.  for(p=
126f0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
12700 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
12710 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74  .    if( p->dirt
12720 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44  y ){.      p->pD
12730 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20  irty = pList;.  
12740 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20      pList = p;. 
12750 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12760 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
12770 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
12780 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
12790 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67  journal on the g
127a0 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41  iven pager..** A
127b0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
127c0 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  one that needs t
127d0 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
127e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
127f0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
12800 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12810 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
12820 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
12830 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
12840 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
12850 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
12860 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
12870 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
12880 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74  same name.  Just
12890 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
128a0 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
128b0 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
128c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
128d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
128e0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74  useJournal ) ret
128f0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
12900 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
12910 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
12920 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  al) ) return 0;.
12930 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43    if( sqlite3OsC
12940 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
12950 28 26 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  (&pPager->fd) ) 
12960 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
12970 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
12980 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d  ecount(pPager)==
12990 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
129a0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
129b0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
129c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
129d0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
129e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  .  }.}../*.** Ac
129f0 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
12a00 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
12a10 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
12a20 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
12a30 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
12a40 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
12a50 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
12a60 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
12a70 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
12a80 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
12a90 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66  * A _get works f
12aa0 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
12ab0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
12ac0 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
12ad0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
12ae0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
12af0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
12b00 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
12b10 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
12b20 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
12b30 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
12b40 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
12b50 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
12b60 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
12b70 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
12b80 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
12b90 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
12ba0 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
12bb0 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
12bc0 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
12bd0 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
12be0 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
12bf0 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
12c00 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
12c10 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
12c20 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
12c30 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
12c40 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
12c50 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
12c60 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
12c70 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
12c80 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
12c90 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
12ca0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
12cb0 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
12cc0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
12cd0 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
12ce0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
12cf0 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
12d00 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
12d10 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
12d20 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
12d30 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
12d40 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
12d50 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
12d60 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
12d70 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
12d80 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
12d90 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
12da0 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
12db0 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
12dc0 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
12dd0 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
12de0 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
12df0 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
12e00 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
12e10 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
12e20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
12e30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12e40 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
12e50 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
12e60 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
12e70 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
12e80 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
12e90 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
12ea0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
12eb0 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
12ec0 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
12ed0 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
12ee0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
12ef0 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
12f00 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
12f10 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
12f20 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
12f30 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
12f40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
12f50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
12f60 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
12f70 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
12f80 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
12f90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12fa0 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
12fb0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
12fc0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
12fd0 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
12fe0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
12ff0 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
13000 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
13010 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
13020 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
13030 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
13040 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
13050 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13060 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
13070 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
13080 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  && !MEMDB ){.   
13090 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
130a0 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
130b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
130c0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
130d0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
130e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
130f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13100 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
13120 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
13130 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
13140 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
13150 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
13160 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
13170 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
13180 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
13190 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
131a0 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
131b0 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48 6f  */.    if( hasHo
131c0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
131d0 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72   ){.       int r
131e0 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65  c;..       /* Ge
131f0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
13200 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
13210 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
13220 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
13230 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
13240 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
13250 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
13260 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
13270 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
13280 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
13290 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
132a0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
132b0 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
132c0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
132d0 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
132e0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
132f0 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
13300 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  at the.       **
13310 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
13320 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
13330 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
13340 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
13350 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b   .       ** back
13360 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  ..       ** .   
13370 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
13380 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
13390 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
133a0 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
133b0 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73 65  the.       ** se
133c0 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
133d0 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
133e0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
133f0 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
13400 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
13410 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
13420 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
13430 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
13440 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
13450 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
13460 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
13470 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
13480 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13490 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
134a0 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
134b0 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
134c0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  O_LOCK);.       
134d0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
134e0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
134f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13500 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
13510 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
13520 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
13530 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  IVE;..       /* 
13540 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
13550 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
13560 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
13570 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
13580 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
13590 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
135a0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
135b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a      **.       **
135c0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
135d0 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
135e0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
135f0 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
13600 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
13610 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75   is never open u
13620 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64  nless the main d
13630 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
13640 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77  ds.       ** a w
13650 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68  rite lock, so th
13660 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
13670 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f   chance of two o
13680 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a  r more.       **
13690 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
136a0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
136b0 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
136c0 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
136d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
136e0 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61  OpenReadOnly(pPa
136f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
13700 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13710 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13730 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
13740 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
13750 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
13760 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
13770 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
13780 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
13790 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
137a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
137b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
137c0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50  n = 1;.       pP
137d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
137e0 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
137f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13800 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
13810 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
13820 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  r = 0;.       pP
13830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
13840 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a   = 0;..       /*
13850 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
13860 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
13870 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
13880 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
13890 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
138a0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
138b0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f   lock..       */
138c0 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  .       rc = pag
138d0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
138e0 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  er);.       if( 
138f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13900 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
13910 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20   rc;.       }.  
13920 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b    }.    pPg = 0;
13930 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
13940 20 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65   Search for page
13950 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20   in cache */.   
13960 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
13970 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
13980 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
13990 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
139a0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
139b0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
139c0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
139d0 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
139e0 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
139f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
13a00 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
13a10 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
13a20 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
13a30 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  h;.    pPager->n
13a40 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Miss++;.    if( 
13a50 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
13a60 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
13a70 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
13a80 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20  0 || MEMDB ){.  
13a90 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
13aa0 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  new page */.    
13ab0 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61    pPg = sqliteMa
13ac0 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
13ad0 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
13ae0 70 73 41 6c 69 67 6e 65 64 0a 20 20 20 20 20 20  psAligned.      
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b00 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
13b10 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
13b20 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
13b50 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
13b60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
13b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  =0 ){.        pP
13b80 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
13b90 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a   PAGER_ERR_MEM;.
13ba0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13bb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
13bc0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
13bd0 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pPg, 0, sizeof
13be0 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69  (*pPg));.      i
13bf0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
13c00 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
13c10 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
13c20 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66  ager), 0, sizeof
13c30 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20  (PgHistory));.  
13c40 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
13c50 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
13c60 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
13c70 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
13c80 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67  pAll;.      pPag
13c90 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
13ca0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
13cb0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
13cc0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70   pPager->nPage>p
13cd0 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20  Pager->nMaxPage 
13ce0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
13cf0 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  t( pPager->nMaxP
13d00 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50  age==(pPager->nP
13d10 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  age-1) );.      
13d20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61    pPager->nMaxPa
13d30 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ge++;.      }.  
13d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13d50 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f  * Find a page to
13d60 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74   recycle.  Try t
13d70 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  o locate a page 
13d80 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  that does not.  
13d90 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75      ** require u
13da0 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
13db0 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
13dc0 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
13dd0 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
13de0 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20  pFirstSynced;.. 
13df0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f       /* If we co
13e00 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70  uld not find a p
13e10 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
13e20 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79  t require an fsy
13e30 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  nc().      ** on
13e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13e50 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65  e then fsync the
13e60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
13e70 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20 20  This is a.      
13e80 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
13e90 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
13ea0 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
13eb0 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
13ec0 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  mes.      ** it 
13ed0 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e  can't be helped.
13ee0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13ef0 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
13f00 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
13f10 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
13f20 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
13f30 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
13f40 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
13f50 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
13f60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
13f70 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
13f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13f90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
13fa0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
13fb0 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75       /* If in fu
13fc0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72  ll-sync mode, wr
13fd0 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61  ite a new journa
13fe0 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68  l header into th
13ff0 65 0a 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e..  ** journal 
14000 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
14010 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
14020 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
14030 72 6e 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65  rnal..  ** heade
14040 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76  r that is involv
14050 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
14060 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  ck of pages that
14070 20 68 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65   have..  ** alre
14080 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
14090 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
140a0 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
140b0 61 64 65 72 20 69 73 0a 09 20 20 2a 2a 20 74 72  ader is..  ** tr
140c0 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ashed when the n
140d0 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
140e0 61 74 65 64 29 2e 0a 20 20 20 20 20 20 20 20 20  ated)..         
140f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50   */.          pP
14100 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
14110 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14120 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14130 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20  lOff > 0 );.    
14140 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
14150 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
14160 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
14170 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
14180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
14190 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
141a0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
141b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
141c0 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20  IOERR;.         
141d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
141e0 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
141f0 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  r->pFirst;.     
14200 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
14210 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b   pPg->nRef==0 );
14220 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
14230 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
14240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14250 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20  f it is dirty.. 
14260 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
14270 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
14280 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14290 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
142a0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   );.        pPg-
142b0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
142c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
142d0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20  write_pagelist( 
142e0 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69  pPg );.        i
142f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
14310 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
14320 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
14330 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
14340 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
14350 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14360 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
14370 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  >dirty==0 );..  
14380 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
14390 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
143a0 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
143b0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
143c0 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73   then.      ** s
143d0 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
143e0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
143f0 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
14400 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  g the.      ** s
14410 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  qlite_dont_rollb
14420 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
14430 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
14440 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
14450 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74  ion..      ** It
14460 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
14470 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
14480 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
14490 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
144a0 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62        ** might b
144b0 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
144c0 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
144d0 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
144e0 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
144f0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
14500 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  was marked alway
14510 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73  sRollback.  This
14520 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20   means that all 
14530 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20  pages must.     
14540 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
14550 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
14560 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
14570 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14580 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
14590 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
145a0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61      pPager->alwa
145b0 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
145c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
145d0 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64  * Unlink the old
145e0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
145f0 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ree list and the
14600 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20   hash table.    
14610 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e    */.      unlin
14620 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
14630 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b    pPager->nOvfl+
14640 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  +;.    }.    pPg
14650 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
14660 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
14670 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  InJournal && (in
14680 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
14690 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
146a0 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
146b0 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61  Memory(pPager->a
146c0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f  InJournal, pgno/
146d0 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  8);.      assert
146e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
146f0 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70  lOpen );.      p
14700 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
14710 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
14720 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
14730 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
14740 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
14750 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Sync = 0;.    }e
14760 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
14770 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
14780 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
14790 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
147a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
147b0 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67  nStmt && (int)pg
147c0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
147d0 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
147e0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49    && (pPager->aI
147f0 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20  nStmt[pgno/8] & 
14800 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
14810 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  0 ){.      page_
14820 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
14830 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
14840 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d  {.      page_rem
14850 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69  ove_from_stmt_li
14860 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
14870 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
14880 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  0;.    pPg->nRef
14890 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46   = 1;.    REFINF
148a0 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67  O(pPg);.    pPag
148b0 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
148c0 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
148d0 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  gno);.    pPg->p
148e0 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
148f0 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
14900 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
14910 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
14920 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
14930 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14940 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
14950 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
14960 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
14970 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
14980 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
14990 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45    if( pPager->nE
149a0 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20  xtra>0 ){.      
149b0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
149c0 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
149d0 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  r), 0, pPager->n
149e0 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
149f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
14a00 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
14a10 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
14a20 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
14a30 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
14a40 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
14a50 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
14a60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14a70 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
14a80 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
14a90 74 28 70 50 61 67 65 72 29 3c 28 69 6e 74 29 70  t(pPager)<(int)p
14aa0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  gno ){.      mem
14ab0 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
14ac0 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
14ad0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
14af0 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73  nt rc;.      ass
14b00 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
14b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
14b20 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
14b30 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  , (pgno-1)*(i64)
14b40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14b50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14b60 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
14b70 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
14b80 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
14b90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
14ba0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 46 45        TRACE3("FE
14bb0 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e  TCH %d page %d\n
14bc0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
14bd0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
14be0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
14bf0 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
14c00 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e  A(pPg), pPg->pgn
14c10 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 3);.      if(
14c20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14c30 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 66 69  {.        i64 fi
14c40 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  leSize;.        
14c50 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
14c60 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66  eSize(&pPager->f
14c70 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51  d,&fileSize)!=SQ
14c80 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20  LITE_OK.        
14c90 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69         || fileSi
14ca0 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72 2d  ze>=pgno*pPager-
14cb0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
14cc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
14cd0 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f  ger_unref(PGHDR_
14ce0 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20  TO_DATA(pPg));. 
14cf0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14d00 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rc;.        }els
14d10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  e{.          mem
14d20 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
14d30 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
14d40 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14d50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
14d60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61  lse{.        pPa
14d70 67 65 72 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20  ger->nRead++;.  
14d80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
14d90 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
14da0 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
14db0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
14dc0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
14dd0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
14de0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
14df0 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
14e00 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
14e10 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48  /.    pPager->nH
14e20 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72  it++;.    page_r
14e30 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
14e40 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54  ppPage = PGHDR_T
14e50 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72  O_DATA(pPg);.  r
14e60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
14e80 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
14e90 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
14ea0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
14eb0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
14ec0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
14ed0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
14ee0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
14ef0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
14f00 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
14f10 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
14f20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
14f30 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68  pager_get().  Th
14f40 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
14f50 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
14f60 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
14f70 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74  pager_get() is t
14f80 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
14f90 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
14fa0 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
14fb0 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
14fc0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
14fd0 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
14fe0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
14ff0 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
15000 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
15010 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
15020 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
15030 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
15040 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
15050 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
15060 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15070 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
15080 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
15090 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
150a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
150b0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
150c0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
150d0 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
150e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
150f0 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61  ;.  }.  pPg = pa
15100 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
15110 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
15120 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pPg==0 ) return 
15130 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  0;.  page_ref(pP
15140 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48  g);.  return PGH
15150 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
15160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
15170 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
15180 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
15190 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
151a0 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
151b0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
151c0 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
151d0 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
151e0 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
151f0 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
15200 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
15210 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
15220 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
15230 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
15240 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
15250 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15260 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64  pager_unref(void
15270 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
15280 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65  r *pPg;..  /* De
15290 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
152a0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
152b0 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20  this page.  */. 
152c0 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50   pPg = DATA_TO_P
152d0 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61  GHDR(pData);.  a
152e0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
152f0 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  >0 );.  pPg->nRe
15300 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f--;.  REFINFO(p
15310 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  Pg);..  CHECK_PA
15320 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  GE(pPg);..  /* W
15330 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
15340 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
15350 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
15360 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
15370 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
15380 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
15390 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
153a0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
153b0 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
153c0 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61  *pPager;.    pPa
153d0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
153e0 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
153f0 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70  tFree = 0;.    p
15400 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
15410 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20  pPager->pLast;. 
15420 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
15430 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
15440 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
15450 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
15460 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
15470 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c  e = pPg;.    }el
15480 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
15490 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a  ->pFirst = pPg;.
154a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
154b0 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26  g->needSync==0 &
154c0 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  & pPager->pFirst
154d0 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Synced==0 ){.   
154e0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
154f0 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20  tSynced = pPg;. 
15500 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
15510 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
15520 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
15530 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
15540 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
15550 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
15560 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c  .    /* When all
15570 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65   pages reach the
15580 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20   freelist, drop 
15590 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72  the read lock fr
155a0 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  om.    ** the da
155b0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
155c0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
155d0 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65  nRef--;.    asse
155e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
155f0 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
15600 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
15610 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  & !MEMDB ){.    
15620 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
15630 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
15640 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15650 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
15660 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
15670 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
15680 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
15690 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
156a0 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
156b0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
156c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
156d0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
156e0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
156f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
15700 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
15710 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
15720 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
15730 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
15740 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
15750 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
15760 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
15770 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
15780 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
15790 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
157a0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  ( !MEMDB );.  as
157b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
157c0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
157d0 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
157e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
157f0 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Open==0 );.  ass
15800 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
15810 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
15820 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
15830 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
15840 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
15850 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
15860 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
15870 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  rnal = sqliteMal
15880 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
15890 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
158a0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
158b0 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
158c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
158d0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  M;.    goto fail
158e0 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
158f0 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  al;.  }.  rc = s
15900 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
15910 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a  usive(pPager->zJ
15920 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
15930 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d  >jfd,pPager->tem
15940 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72  pFile);.  pPager
15950 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
15960 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
15970 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
15980 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
15990 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
159a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
159b0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
159c0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
159d0 0a 20 20 53 45 54 5f 46 55 4c 4c 53 59 4e 43 28  .  SET_FULLSYNC(
159e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
159f0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a  ger->fullSync);.
15a00 20 20 53 45 54 5f 46 55 4c 4c 53 59 4e 43 28 70    SET_FULLSYNC(p
15a10 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
15a20 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  r->fullSync);.  
15a30 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72  sqlite3OsOpenDir
15a40 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a  ectory(pPager->z
15a50 44 69 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67  Directory, &pPag
15a60 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67  er->jfd);.  pPag
15a70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
15a80 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
15a90 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
15aa0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
15ab0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
15ac0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
15ad0 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
15ae0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
15af0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
15b00 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
15b10 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
15b20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 67 6f 74  pPager);.    got
15b30 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
15b40 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
15b50 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
15b60 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
15b70 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  ize;..  rc = wri
15b80 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
15b90 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  ger);..  if( pPa
15ba0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
15bb0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
15bc0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
15bd0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
15be0 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  _begin(pPager);.
15bf0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
15c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
15c10 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
15c20 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
15c30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15c40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
15c50 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
15c60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15c70 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
15c80 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
15c90 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
15ca0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29  ger->aInJournal)
15cb0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
15cc0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 73 71  ournal = 0;.  sq
15cd0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
15ce0 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
15cf0 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
15d00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
15d10 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  OCK;.  return rc
15d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
15d30 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
15d40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
15d50 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
15d60 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
15d70 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
15d80 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
15d90 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
15da0 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20  3pager_commit() 
15db0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
15dc0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
15dd0 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  rollback() is ca
15de0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
15df0 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
15e00 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
15e10 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
15e20 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61  er_unref() is ca
15e30 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79  lled to on every
15e40 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
15e50 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
15e60 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  st parameter to 
15e70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15e80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79  a pointer to any
15e90 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68   open page of th
15ea0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
15eb0 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61  le.  Nothing cha
15ec0 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70  nges about the p
15ed0 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64  age - it is used
15ee0 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63   merely to.** ac
15ef0 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20  quire a pointer 
15f00 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
15f10 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72  ucture and as pr
15f20 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69  oof that there i
15f30 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72  s.** already a r
15f40 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
15f50 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
15f60 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  The second param
15f70 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68  eter indicates h
15f80 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e  ow much space in
15f90 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76   bytes to reserv
15fa0 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65  e for a.** maste
15fb0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e  r journal file-n
15fc0 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ame at the start
15fd0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
15fe0 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74  when it is creat
15ff0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72  ed..**.** A jour
16000 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
16010 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ed if this is no
16020 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  t a temporary fi
16030 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61  le.  For tempora
16040 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65  ry.** files, the
16050 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20   opening of the 
16060 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
16070 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
16080 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63  here is an.** ac
16090 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69  tual need to wri
160a0 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
160b0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
160c0 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
160d0 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72  ady reserved for
160e0 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72   writing, this r
160f0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
16100 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c  p..**.** If exFl
16110 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61  ag is true, go a
16120 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20  head and get an 
16130 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
16140 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d  n the file.** im
16150 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61  mediately instea
16160 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74  d of waiting unt
16170 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75  il we try to flu
16180 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
16190 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20  he.** exFlag is 
161a0 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61  ignored if a tra
161b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
161c0 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69  ady active..*/.i
161d0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
161e0 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
161f0 61 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a  a, int exFlag){.
16200 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
16210 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
16220 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
16230 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
16240 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
16250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
16260 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
16270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
16280 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
16290 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
162a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
162b0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
162c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
162d0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
162e0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
162f0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
16300 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
16310 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
16320 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
16330 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
16340 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
16350 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
16360 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
16370 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
16380 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
16390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
163a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
163b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
163c0 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
163d0 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20       if( exFlag 
163e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
163f0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
16400 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
16410 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16430 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16440 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16450 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16460 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
16470 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
16480 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32   0;.      TRACE2
16490 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
164a0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
164b0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ger));.      if(
164c0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
164d0 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e  nal && !pPager->
164e0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
164f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
16500 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
16510 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
16520 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16530 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
16540 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
16550 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
16560 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
16570 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
16580 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
16590 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
165a0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
165b0 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
165c0 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
165d0 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
165e0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
165f0 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
16600 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
16610 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
16620 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
16630 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
16640 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
16650 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
16660 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
16670 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
16680 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
16690 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
166a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
166b0 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
166c0 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
166d0 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
166e0 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
166f0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
16700 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
16710 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
16720 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
16730 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
16740 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
16750 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
16760 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
16770 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
16780 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
16790 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
167a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
167b0 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
167c0 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
167d0 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
167e0 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
167f0 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
16800 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
16810 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
16820 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61  all to sqlite3pa
16830 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20  ger_commit() or 
16840 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
16850 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65  lback() to.** re
16860 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  set..*/.int sqli
16870 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 76  te3pager_write(v
16880 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
16890 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
168a0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
168b0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
168c0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
168d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
168e0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
168f0 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
16900 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
16910 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20  >errMask ){ .   
16920 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
16930 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
16940 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
16950 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
16960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
16970 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
16980 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
16990 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
169a0 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
169b0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
169c0 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
169d0 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
169e0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
169f0 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
16a00 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
16a10 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
16a20 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  way..  */.  pPg-
16a30 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69 66  >dirty = 1;.  if
16a40 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
16a50 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74   && (pPg->inStmt
16a60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   || pPager->stmt
16a70 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20  InUse==0) ){.   
16a80 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
16a90 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  che = 1;.  }else
16aa0 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  {..    /* If we 
16ab0 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
16ac0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
16ad0 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
16ae0 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  .    ** written 
16af0 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
16b00 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  on journal or th
16b10 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e ckeckpoint jou
16b20 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62  rnal.    ** or b
16b30 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oth..    **.    
16b40 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
16b50 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
16b60 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
16b70 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
16b80 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69    ** create it i
16b90 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  f it does not.. 
16ba0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
16bb0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
16bc0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
16bd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16be0 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61  3pager_begin(pDa
16bf0 74 61 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ta, 0);.    if( 
16c00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16c10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
16c20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
16c30 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
16c40 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
16c50 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  D );.    if( !pP
16c60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16c70 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  n && pPager->use
16c80 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
16c90 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
16ca0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
16cb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16cc0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
16cd0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16ce0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16cf0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
16d00 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  !pPager->useJour
16d10 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
16d20 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
16d30 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  1;.  .    /* The
16d40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
16d50 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
16d60 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
16d70 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
16d80 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
16d90 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
16da0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
16db0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
16dc0 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
16dd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16de0 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
16df0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
16e00 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
16e10 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
16e20 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75  al && (pPager->u
16e30 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d  seJournal || MEM
16e40 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  DB) ){.      if(
16e50 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
16e60 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
16e70 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  bSize ){.       
16e80 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20   int szPg;.     
16e90 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20     u32 saved;.  
16ea0 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
16eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
16ec0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
16ed0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
16ee0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
16ef0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f        TRACE3("JO
16f00 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
16f10 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
16f20 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
16f30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
16f40 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
16f50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
16f60 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
16f70 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
16f80 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16f90 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  e );.          i
16fa0 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
16fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
16fc0 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
16fd0 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
16fe0 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
16ff0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
17000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
17010 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17020 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
17030 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
17040 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
17050 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
17060 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
17070 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70  _cksum(pPager, p
17080 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29  Pg->pgno, pData)
17090 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ;.          save
170a0 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44 52  d = *(u32*)PGHDR
170b0 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
170c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
170d0 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63 6b    store32bits(ck
170e0 73 75 6d 2c 20 70 50 67 2c 20 70 50 61 67 65 72  sum, pPg, pPager
170f0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17100 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50         szPg = pP
17110 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
17120 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  ;.          stor
17130 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e  e32bits(pPg->pgn
17140 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20  o, pPg, -4);.   
17150 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17160 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
17170 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72  er->jfd, &((char
17180 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a  *)pData)[-4], sz
17190 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Pg);.          p
171a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
171b0 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20  f += szPg;.     
171c0 20 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f 55       TRACE4("JOU
171d0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
171e0 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17200 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
17210 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
17220 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
17230 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50          CODEC(pP
17240 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
17250 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
17260 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48        *(u32*)PGH
17270 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
17280 20 70 50 61 67 65 72 29 20 3d 20 73 61 76 65 64   pPager) = saved
17290 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
172a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
172b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
172c0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
172d0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
172e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
172f0 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
17300 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  _ERR_FULL;.     
17310 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17320 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17330 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17340 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
17350 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17360 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
17370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
17380 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
17390 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
173a0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
173b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  ;.          pPg-
173c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
173d0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
173e0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
173f0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
17400 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
17410 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
17420 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
17430 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
17440 20 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61            page_a
17450 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
17460 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
17470 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17490 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
174a0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
174b0 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
174c0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
174d0 20 20 20 20 20 54 52 41 43 45 34 28 22 41 50 50       TRACE4("APP
174e0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
174f0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
17510 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
17520 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
17530 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
17540 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
17550 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
17560 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
17570 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
17580 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69    }.      pPg->i
17590 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
175a0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
175b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
175c0 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
175d0 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
175e0 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
175f0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
17600 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
17610 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
17620 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
17630 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
17640 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
17650 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
17660 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
17670 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
17680 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
17690 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
176a0 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
176b0 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
176c0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
176d0 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
176e0 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
176f0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
17700 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
17710 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
17720 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
17730 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
17740 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
17750 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
17760 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
17770 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
17780 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
17790 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
177a0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
177b0 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t->pStmt==0 );. 
177c0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
177d0 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
177e0 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
177f0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
17800 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
17810 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
17820 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
17830 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Stmt, PGHDR_TO_D
17840 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
17850 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
17870 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
17880 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
17890 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
178a0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
178b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
178c0 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
178d0 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
178e0 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 43 4f   -4);.        CO
178f0 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
17900 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
17910 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
17920 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
17930 50 61 67 65 72 2d 3e 73 74 66 64 2c 28 28 63 68  Pager->stfd,((ch
17940 61 72 2a 29 70 44 61 74 61 29 2d 34 2c 20 70 50  ar*)pData)-4, pP
17950 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
17960 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
17970 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
17980 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
17990 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
179a0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
179b0 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
179c0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
179d0 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  no, 0);.        
179e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
179f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
17a00 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
17a10 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
17a20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17a30 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
17a40 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  _ERR_FULL;.     
17a50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17a60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17a70 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
17a80 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
17a90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
17aa0 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
17ab0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
17ac0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
17ad0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
17ae0 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o&7);.      }.  
17af0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
17b00 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
17b10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
17b20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
17b30 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
17b40 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
17b50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
17b60 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
17b70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
17b80 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
17b90 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
17ba0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
17bb0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
17bc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17bd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17be0 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
17bf0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17c00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17c10 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
17c20 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
17c30 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
17c40 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
17c50 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ** to sqlite3pag
17c60 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20  er_write().  In 
17c70 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
17c80 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
17c90 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
17ca0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
17cb0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e   the page..*/.in
17cc0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  t sqlite3pager_i
17cd0 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20  swriteable(void 
17ce0 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
17cf0 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
17d00 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
17d10 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
17d20 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  y;.}..#ifndef SQ
17d30 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
17d40 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
17d50 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
17d60 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
17d70 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
17d80 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
17d90 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
17da0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  t sqlite3pager_o
17db0 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
17dc0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
17dd0 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
17de0 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a  .  void *pPage;.
17df0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
17e00 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
17e10 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
17e20 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
17e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17e40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17e50 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
17e60 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
17e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17e80 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
17e90 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
17ea0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
17eb0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
17ec0 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
17ed0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17ee0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17ef0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
17f00 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
17f10 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
17f20 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
17f30 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
17f40 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
17f50 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63   page "pgno" bac
17f60 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
17f70 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
17f80 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
17f90 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
17fa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
17fb0 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
17fc0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
17fd0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
17fe0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
17ff0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
18000 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
18010 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
18020 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
18030 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
18040 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
18050 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
18060 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
18070 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
18080 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
18090 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
180a0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
180b0 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
180c0 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
180d0 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
180e0 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
180f0 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
18100 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
18110 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
18120 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
18130 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
18140 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
18150 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
18160 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
18170 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
18180 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
18190 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
181a0 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
181b0 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
181c0 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
181d0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
181e0 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
181f0 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
18200 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
18210 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
18220 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
18230 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
18240 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
18250 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
18260 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
18270 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
18280 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
18290 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
182a0 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
182b0 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
182c0 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
182d0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
182e0 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
182f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
18300 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
18310 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
18320 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
18330 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
18340 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f  ause the page co
18350 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63  ntains.** critic
18360 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
18370 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
18380 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64  e it gets rolled
18390 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a   back in spite.*
183a0 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f  * of the dont_ro
183b0 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
183c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
183d0 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50  ger_dont_write(P
183e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
183f0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
18400 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d  r *pPg;..  if( M
18410 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a  EMDB ) return;..
18420 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
18430 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
18440 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79  o);.  pPg->alway
18450 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
18460 20 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d   if( pPg && pPg-
18470 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66  >dirty ){.    if
18480 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
18490 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
184a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
184b0 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
184c0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
184d0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
184e0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
184f0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
18500 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
18510 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
18520 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
18530 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
18540 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
18550 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
18560 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
18570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18580 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
18590 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
185a0 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
185b0 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
185c0 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
185d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
185e0 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
185f0 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
18600 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
18610 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
18620 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
18630 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
18640 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
18650 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
18660 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
18670 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
18680 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
18690 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
186a0 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
186b0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
186c0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
186d0 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
186e0 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
186f0 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50  f %d\n", pgno, P
18700 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
18710 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
18720 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
18730 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
18740 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
18750 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
18760 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
18770 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
18780 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
18790 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
187a0 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
187b0 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
187c0 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
187d0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
187e0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
187f0 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
18800 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
18810 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
18820 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
18830 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
18840 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
18850 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
18860 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urnal..*/.void s
18870 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
18880 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _rollback(void *
18890 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
188a0 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
188b0 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
188c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
188d0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69  Pg->pPager;..  i
188e0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
188f0 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  !=PAGER_EXCLUSIV
18900 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  E || pPager->jou
18910 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
18920 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
18930 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
18940 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
18950 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d  sRollback || MEM
18960 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
18970 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
18980 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
18990 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
189a0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
189b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
189c0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
189d0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
189e0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
189f0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
18a00 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
18a10 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
18a20 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
18a30 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
18a40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
18a50 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
18a60 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
18a70 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
18a80 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
18a90 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
18aa0 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e  .    TRACE3("DON
18ab0 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
18ac0 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
18ad0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
18ae0 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
18af0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
18b00 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
18b10 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
18b20 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
18b30 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
18b40 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
18b50 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
18b60 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
18b70 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
18b80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18b90 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
18ba0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
18bb0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
18bc0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
18bd0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
18be0 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
18bf0 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
18c00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18c10 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
18c20 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
18c30 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
18c40 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
18c50 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
18c60 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
18c70 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  teFree(pHist->pO
18c80 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  rig);.  sqliteFr
18c90 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
18ca0 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
18cb0 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
18cc0 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73  Stmt = 0;.}.#els
18cd0 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48  e.#define clearH
18ce0 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66  istory(x).#endif
18cf0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
18d00 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
18d10 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
18d20 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
18d30 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
18d40 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
18d50 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
18d60 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
18d70 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
18d80 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
18d90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
18da0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
18db0 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
18dc0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
18dd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
18de0 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  er_commit(Pager 
18df0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
18e00 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
18e10 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
18e20 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f  >errMask==PAGER_
18e30 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
18e40 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
18e50 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
18e60 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
18e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18e80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
18e90 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ULL;.    }.    r
18ea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
18eb0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
18ec0 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
18ed0 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
18ee0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
18ef0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
18f00 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
18f10 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
18f20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18f30 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
18f40 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54    TRACE2("COMMIT
18f50 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18f60 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
18f70 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67  MEMDB ){.    pPg
18f80 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
18f90 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
18fa0 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ger);.    while(
18fb0 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c   pPg ){.      cl
18fc0 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52  earHistory(PGHDR
18fd0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
18fe0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50  ager));.      pP
18ff0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
19000 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
19010 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
19020 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
19030 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
19040 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
19050 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
19060 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
19070 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  y;.    }.#ifndef
19080 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28   NDEBUG.    for(
19090 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
190a0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
190b0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
190c0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
190d0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
190e0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
190f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
19100 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
19110 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
19120 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
19130 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
19140 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
19150 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
19160 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
19170 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
19180 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
19190 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
191a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
191b0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
191c0 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
191d0 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65  ){.    /* Exit e
191e0 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f  arly (without do
191f0 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e  ing the time-con
19200 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  suming sqlite3Os
19210 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20  Sync() calls).  
19220 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61    ** if there ha
19230 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
19240 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
19250 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
19260 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19270 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
19280 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
19290 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
192a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
192b0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
192c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
192d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
192e0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
192f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
19300 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c  ger_sync(pPager,
19310 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
19320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19330 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61     goto commit_a
19340 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  bort;.  }.  rc =
19350 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
19360 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ck(pPager);.  pP
19370 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
19380 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
19390 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
193a0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
193b0 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68   wrong during th
193c0 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
193d0 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62  ..  */.commit_ab
193e0 6f 72 74 3a 0a 20 20 73 71 6c 69 74 65 33 70 61  ort:.  sqlite3pa
193f0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
19400 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
19410 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
19420 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
19430 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
19440 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
19450 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
19460 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  .** All in-memor
19470 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65  y cache pages re
19480 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72  vert to their or
19490 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74  iginal data cont
194a0 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75  ents..** The jou
194b0 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e  rnal is deleted.
194c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
194d0 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ine cannot fail 
194e0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
194f0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
19500 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
19510 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e  e correct lockin
19520 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49  g protocol (SQLI
19530 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20  TE_PROTOCOL) or 
19540 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
19550 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20  r.** process is 
19560 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e  writing trash in
19570 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
19580 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52  ile (SQLITE_CORR
19590 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73  UPT) or.** unles
195a0 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63  s a prior malloc
195b0 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54  () failed (SQLIT
195c0 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f  E_NOMEM).  Appro
195d0 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20  priate error.** 
195e0 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e  codes are return
195f0 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  ed for all these
19600 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68   occasions.  Oth
19610 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54  erwise,.** SQLIT
19620 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
19630 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19640 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50  pager_rollback(P
19650 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19660 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45   int rc;.  TRACE
19670 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
19680 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
19690 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
196a0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
196b0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67  ;.    for(p=pPag
196c0 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
196d0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
196e0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
196f0 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
19700 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c  t( !p->alwaysRol
19710 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  lback );.      i
19720 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a  f( !p->dirty ){.
19730 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19740 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
19750 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
19760 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20  pPager))->pOrig 
19770 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
19780 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
19790 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
197a0 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74  p, pPager))->pSt
197b0 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  mt );.        co
197c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
197d0 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
197e0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
197f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
19800 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
19810 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
19820 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
19830 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
19840 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
19850 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ze);.        TRA
19860 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE3("ROLLBACK-PA
19870 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  GE %d of %d\n", 
19880 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
19890 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
198a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
198b0 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
198c0 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
198d0 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
198e0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
198f0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61      }.      clea
19900 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
19910 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20  .      p->dirty 
19920 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
19930 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
19940 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30     p->inStmt = 0
19950 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76  ;.      p->pPrev
19960 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53  Stmt = p->pNextS
19970 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  tmt = 0;..      
19980 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
19990 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
199a0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
199b0 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
199c0 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  (p), pPager->pag
199d0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
199e0 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20        .    }.   
199f0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
19a00 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
19a10 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
19a20 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20  >origDbSize;.   
19a30 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
19a40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
19a50 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
19a60 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
19a70 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
19a80 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
19a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19aa0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
19ab0 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70  dirtyCache || !p
19ac0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
19ad0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  en ){.    rc = p
19ae0 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
19af0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
19b00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
19b10 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
19b20 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
19b30 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
19b40 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  && pPager->errMa
19b50 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk!=PAGER_ERR_FU
19b60 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
19b70 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
19b80 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
19b90 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
19ba0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
19bb0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
19bc0 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
19bd0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
19be0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
19bf0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
19c00 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
19c10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c    rc = pager_rel
19c20 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
19c30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
19c40 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
19c50 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
19c60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19c70 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
19c80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
19c90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
19ca0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
19cb0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
19cc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19cd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
19ce0 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f  UPT;  /* bkpt-CO
19cf0 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 70 50 61  RRUPT */.    pPa
19d00 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
19d10 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
19d20 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  T;.  }.  pPager-
19d30 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
19d40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19d50 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
19d60 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
19d70 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
19d80 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
19d90 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
19da0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
19db0 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
19dc0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
19dd0 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e  e3pager_isreadon
19de0 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
19df0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
19e00 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
19e10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19e20 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
19e30 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
19e40 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
19e50 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t *sqlite3pager_
19e60 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  stats(Pager *pPa
19e70 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
19e80 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
19e90 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
19ea0 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
19eb0 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
19ec0 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
19ed0 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
19ee0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
19ef0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
19f00 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
19f10 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61  er->errMask;.  a
19f20 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
19f30 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
19f40 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
19f50 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76  8] = pPager->nOv
19f60 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61  fl;.  a[9] = pPa
19f70 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
19f80 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
19f90 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
19fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
19fb0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
19fc0 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
19fd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19fe0 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
19ff0 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
1a000 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
1a010 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
1a020 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
1a030 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
1a040 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
1a050 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
1a060 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
1a070 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
1a080 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
1a090 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
1a0a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1a0b0 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50  ger_stmt_begin(P
1a0c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1a0d0 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
1a0e0 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
1a0f0 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61  PNAME_SIZE];.  a
1a100 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1a110 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61  stmtInUse );.  a
1a120 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1a130 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52  bSize>=0 );.  TR
1a140 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
1a150 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1a160 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
1a170 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
1a180 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
1a190 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1a1a0 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
1a1b0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
1a1c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a1d0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
1a1e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1a1f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
1a200 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
1a210 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a220 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
1a230 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1a240 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50  rnalOpen );.  pP
1a250 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
1a260 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
1a270 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1a280 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
1a290 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29  er->aInStmt==0 )
1a2a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c  {.    sqlite3OsL
1a2b0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
1a2c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
1a2d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a2e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
1a2f0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
1a300 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1a310 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
1a320 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  , &pPager->stmtJ
1a330 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
1a340 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
1a350 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  n_failed;.  asse
1a360 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
1a370 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d  JSize == pPager-
1a380 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23  >journalOff );.#
1a390 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e  endif.  pPager->
1a3a0 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67  stmtJSize = pPag
1a3b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
1a3c0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
1a3d0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1a3e0 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ize;.  pPager->s
1a3f0 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20  tmtHdrOff = 0;. 
1a400 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
1a410 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
1a420 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70  umInit;.  if( !p
1a430 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
1a440 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1a450 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
1a460 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72  p(zTemp, &pPager
1a470 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28  ->stfd);.    if(
1a480 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
1a490 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
1a4a0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
1a4b0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
1a4c0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
1a4d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1a4e0 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
1a4f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a500 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
1a510 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
1a520 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b  ager->aInStmt ){
1a530 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
1a540 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29  pPager->aInStmt)
1a550 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1a560 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
1a570 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a580 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74  *.** Commit a st
1a590 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
1a5a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1a5b0 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  t_commit(Pager *
1a5c0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
1a5d0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1a5e0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1a5f0 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  Pg, *pNext;.    
1a600 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
1a610 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
1a620 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1a630 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
1a640 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
1a650 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  ek(&pPager->stfd
1a660 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73  , 0);.      /* s
1a670 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
1a680 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
1a690 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  0); */.      sql
1a6a0 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d  iteFree( pPager-
1a6b0 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  >aInStmt );.    
1a6c0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1a6d0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
1a6e0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
1a6f0 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
1a700 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70  =pNext){.      p
1a710 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
1a720 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73  tStmt;.      ass
1a730 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74  ert( pPg->inStmt
1a740 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
1a750 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
1a760 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
1a770 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
1a780 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1a790 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1a7a0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1a7b0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1a7c0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1a7d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
1a7e0 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
1a7f0 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
1a800 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1a810 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
1a820 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
1a830 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1a840 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
1a850 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
1a860 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
1a870 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
1a880 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
1a890 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1a8a0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74  ** Rollback a st
1a8b0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
1a8c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1a8d0 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  t_rollback(Pager
1a8e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1a8f0 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
1a900 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1a910 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
1a920 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  -ROLLBACK %d\n",
1a930 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1a940 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
1a950 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
1a960 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  *pPg;.      for(
1a970 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
1a980 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  t; pPg; pPg=pPg-
1a990 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
1a9a0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1a9b0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1a9c0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1a9d0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
1a9e0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
1a9f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1aa00 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1aa10 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d  Pg), pHist->pStm
1aa20 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t, pPager->pageS
1aa30 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
1aa40 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
1aa50 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
1aa60 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1aa70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1aa80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1aa90 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1aaa0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
1aab0 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  .      memoryTru
1aac0 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
1aad0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1aae0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1aaf0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1ab00 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
1ab10 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1ab20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
1ab30 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65  tmt_commit(pPage
1ab40 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1ab50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ab60 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
1ab70 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
1ab80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ab90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1aba0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
1abb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1abc0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
1abd0 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
1abe0 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  r_filename(Pager
1abf0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1ac00 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
1ac10 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
1ac20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
1ac30 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
1ac40 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
1ac50 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1ac60 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50  3pager_dirname(P
1ac70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ac80 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1ac90 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
1aca0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1acb0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
1acc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1acd0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
1ace0 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a   *sqlite3pager_j
1acf0 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
1ad00 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1ad10 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
1ad20 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rnal;.}../*.** S
1ad30 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
1ad40 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
1ad50 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
1ad60 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61  _set_codec(.  Pa
1ad70 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
1ad80 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f  oid (*xCodec)(vo
1ad90 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
1ada0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
1adb0 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
1adc0 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
1add0 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
1ade0 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
1adf0 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  cArg;.}../*.** T
1ae00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1ae10 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
1ae20 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
1ae30 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
1ae40 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
1ae50 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
1ae60 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
1ae70 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ae80 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1ae90 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
1aea0 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67  r){.  void *pPag
1aeb0 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  e;.  PgHdr *pPgH
1aec0 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
1aed0 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
1aee0 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70  rc;..  /* Open p
1aef0 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
1af00 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
1af10 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1af20 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
1af30 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , 1, &pPage);.  
1af40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1af50 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1af60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1af70 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1af80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1af90 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1afa0 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
1afb0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
1afc0 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  t byte 24. */.  
1afd0 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f  pPgHdr = DATA_TO
1afe0 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20  _PGHDR(pPage);. 
1aff0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1b000 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
1b010 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20  (pPgHdr, 24);.. 
1b020 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1b030 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1b040 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1b050 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1b060 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1b070 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32  ter++;.  store32
1b080 62 69 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e  bits(change_coun
1b090 74 65 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29  ter, pPgHdr, 24)
1b0a0 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  ;..  /* Release 
1b0b0 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
1b0c0 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ce. */.  sqlite3
1b0d0 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
1b0e0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
1b0f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b100 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1b110 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
1b120 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
1b130 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
1b140 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
1b150 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b160 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
1b170 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
1b180 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
1b190 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
1b1a0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
1b1b0 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
1b1c0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
1b1d0 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
1b1e0 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
1b1f0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
1b200 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
1b210 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
1b220 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1b230 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
1b240 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
1b250 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
1b260 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
1b270 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b280 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
1b290 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
1b2a0 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
1b2b0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1b2c0 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
1b2d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b2e0 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
1b2f0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
1b300 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
1b310 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
1b320 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
1b330 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
1b340 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
1b350 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
1b360 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65  o an sqlite3page
1b370 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a  r_sync() call..*
1b380 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1b390 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
1b3a0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
1b3b0 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
1b3c0 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
1b3d0 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
1b3e0 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
1b3f0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
1b400 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1b410 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65  3pager_sync(Page
1b420 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
1b430 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
1b440 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20  Pgno nTrunc){.  
1b450 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b460 4f 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28 22 44  OK;..  TRACE4("D
1b470 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
1b480 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
1b490 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a   nTrunc=%d\n", .
1b4a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
1b4b0 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
1b4c0 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a  , nTrunc);..  /*
1b4d0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
1b4e0 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
1b4f0 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
1b500 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
1b510 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  r this.  ** func
1b520 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1b530 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
1b540 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1b550 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1b560 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
1b570 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26  CED && !MEMDB &&
1b580 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1b590 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
1b5a0 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
1b5b0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1b5c0 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f  alOpen );..    /
1b5d0 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1b5e0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1b5f0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1b600 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
1b610 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1b620 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
1b630 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
1b640 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1b650 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
1b660 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
1b670 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
1b680 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
1b690 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
1b6a0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1b6b0 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
1b6c0 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
1b6d0 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
1b6e0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
1b6f0 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
1b700 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
1b710 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1b720 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
1b730 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
1b740 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
1b750 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
1b760 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
1b770 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1b780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b790 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1b7a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b7b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1b7c0 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
1b7d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1b7e0 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
1b7f0 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
1b800 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
1b810 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
1b820 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  es.        ** be
1b830 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
1b840 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
1b850 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
1b860 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
1b870 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a         ** file..
1b880 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b890 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
1b8a0 20 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a     void *pPage;.
1b8b0 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e          for( i=n
1b8c0 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67  Trunc+1; i<=pPag
1b8d0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20  er->origDbSize; 
1b8e0 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
1b8f0 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61   if( !(pPager->a
1b900 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26  InJournal[i/8] &
1b910 20 28 31 3c 3c 28 69 26 37 29 29 29 20 29 7b 0a   (1<<(i&7))) ){.
1b920 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1b930 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1b940 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
1b950 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1b960 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b970 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1b980 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1b990 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1b9a0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
1b9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1b9c0 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1b9d0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1b9e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b9f0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1ba00 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1ba10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
1ba20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1ba30 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
1ba40 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1ba50 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1ba60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ba70 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1ba80 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72  nc_exit;.      r
1ba90 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1baa0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1bab0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bac0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1bad0 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
1bae0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1baf0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1bb00 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1bb10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bb20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1bb30 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
1bb40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1bb50 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1bb60 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1bb70 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
1bb80 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
1bb90 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
1bba0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
1bbb0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1bbc0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1bbd0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
1bbe0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1bbf0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
1bc00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bc10 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1bc20 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79  exit;..    /* Sy
1bc30 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1bc40 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1bc50 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1bc60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1bc70 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50  qlite3OsSync(&pP
1bc80 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 7d  ager->fd);.    }
1bc90 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
1bca0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
1bcb0 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  ED;.  }..sync_ex
1bcc0 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
1bcd0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1bce0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1bcf0 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
1bd00 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
1bd10 64 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f  d by pData to lo
1bd20 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
1bd30 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  he file. .**.** 
1bd40 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
1bd50 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1bd60 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1bd70 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74  pgno. If current
1bd80 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73   page.** pgno is
1bd90 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
1bda0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1bdb0 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
1bdc0 77 72 69 74 74 65 6e 20 74 68 65 72 65 20 62 79  written there by
1bdd0 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74  .** by this rout
1bde0 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70  ine. The same ap
1bdf0 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61 67  plies to the pag
1be00 65 20 70 44 61 74 61 20 72 65 66 65 72 73 20 74  e pData refers t
1be10 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  o on entry to.**
1be20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1be30 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
1be40 74 6f 20 74 68 65 20 70 61 67 65 20 72 65 66 65  to the page refe
1be50 72 65 64 20 74 6f 20 62 79 20 70 44 61 74 61 20  red to by pData 
1be60 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
1be70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
1be80 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
1be90 65 64 20 77 69 74 68 20 70 61 67 65 20 70 44 61  ed with page pDa
1bea0 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  ta (i.e. data st
1beb0 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
1bec0 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
1bed0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
1bee0 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
1bef0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1bf00 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
1bf10 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
1bf20 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
1bf30 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
1bf40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1bf50 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
1bf60 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
1bf70 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1bf80 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
1bf90 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
1bfa0 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
1bfb0 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
1bfc0 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
1bfd0 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
1bfe0 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
1bff0 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
1c000 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
1c010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1c020 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65  er_movepage(Page
1c030 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
1c040 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e  *pData, Pgno pgn
1c050 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1c060 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1c070 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72  (pData);.  PgHdr
1c080 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74   *pPgOld; .  int
1c090 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   h;.  Pgno needS
1c0a0 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20  yncPgno = 0;..  
1c0b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1c0c0 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 35  f>0 );..  TRACE5
1c0d0 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
1c0e0 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
1c0f0 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
1c100 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
1c110 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1c120 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
1c130 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  , pgno);..  if( 
1c140 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
1c150 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
1c160 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
1c170 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1c180 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  inJournal );.   
1c190 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
1c1a0 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rty );.    asser
1c1b0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1c1c0 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
1c1d0 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
1c1e0 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e   it's hash-chain
1c1f0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
1c200 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
1c210 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
1c220 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
1c230 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
1c240 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
1c250 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
1c260 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
1c270 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
1c280 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
1c290 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
1c2a0 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
1c2b0 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
1c2c0 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
1c2d0 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
1c2e0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
1c2f0 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
1c300 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20    */.  pPgOld = 
1c310 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1c320 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
1c330 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
1c340 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
1c350 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75  nRef==0 );.    u
1c360 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
1c370 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a  Pager, pPgOld);.
1c380 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69 72 74      pPgOld->dirt
1c390 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
1c3a0 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20  PgOld->needSync 
1c3b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c3c0 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e   pPgOld->inJourn
1c3d0 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  al );.      pPg-
1c3e0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1c3f0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1c400 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  ync = 1;.      a
1c410 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1c420 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d  eedSync );.    }
1c430 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  .  }..  /* Chang
1c440 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
1c450 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e  r for pPg and in
1c460 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
1c470 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e   new hash-chain.
1c480 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   */.  pPg->pgno 
1c490 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 61  = pgno;.  h = pa
1c4a0 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a  ger_hash(pgno);.
1c4b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
1c4c0 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
1c4d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
1c4e0 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
1c4f0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
1c500 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
1c510 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
1c520 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
1c530 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
1c540 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
1c550 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
1c560 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
1c570 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67 2d 3e  sh = 0;..  pPg->
1c580 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70 50 61  dirty = 1;.  pPa
1c590 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1c5a0 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
1c5b0 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
1c5c0 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
1c5d0 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
1c5e0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1c5f0 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
1c600 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
1c610 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
1c620 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1c630 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1c640 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
1c650 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
1c660 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
1c670 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
1c680 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
1c690 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
1c6a0 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  aInJournal bit h
1c6b0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
1c6c0 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
1c6d0 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
1c6e0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
1c6f0 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
1c700 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
1c710 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
1c720 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
1c730 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
1c740 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
1c750 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
1c760 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
1c770 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
1c780 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
1c790 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
1c7a0 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
1c7b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
1c7c0 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64 53      void *pNeedS
1c7d0 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ync;.    assert(
1c7e0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1c7f0 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
1c800 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1c810 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
1c820 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63 29  gno, &pNeedSync)
1c830 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1c840 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1c850 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
1c860 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1c870 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52     DATA_TO_PGHDR
1c880 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65  (pNeedSync)->nee
1c890 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44  dSync = 1;.    D
1c8a0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
1c8b0 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e  edSync)->inJourn
1c8c0 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41  al = 1;.    DATA
1c8d0 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53  _TO_PGHDR(pNeedS
1c8e0 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20 31 3b  ync)->dirty = 1;
1c8f0 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
1c900 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79 6e  r_unref(pNeedSyn
1c910 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
1c920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1c930 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1c940 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1c950 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1c960 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
1c970 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
1c980 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66  t state of the f
1c990 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65  ile lock for the
1c9a0 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
1c9b0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1c9c0 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c  e is one of NO_L
1c9d0 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  OCK, SHARED_LOCK
1c9e0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c  , RESERVED_LOCK,
1c9f0 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  .** PENDING_LOCK
1ca00 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  , or EXCLUSIVE_L
1ca10 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  OCK..*/.int sqli
1ca20 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61  te3pager_locksta
1ca30 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
1ca40 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53  ){.#ifdef OS_TES
1ca50 54 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  T.  return pPage
1ca60 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79  r->fd->fd.lockty
1ca70 70 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  pe;.#else.  retu
1ca80 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c 6f  rn pPager->fd.lo
1ca90 63 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 7d  cktype;.#endif.}
1caa0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1cab0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1cac0 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
1cad0 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
1cae0 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
1caf0 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
1cb00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
1cb10 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67  ager_refdump(Pag
1cb20 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
1cb30 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
1cb40 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
1cb50 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
1cb60 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
1cb70 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
1cb80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1cb90 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1cba0 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
1cbb0 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
1cbc0 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
1cbd0 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
1cbe0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
1cbf0 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
1cc00 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  f..#endif /* SQL
1cc10 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
1cc20 2a 2f 0a                                         */.