/ Hex Artifact Content
Login

Artifact 57348b21910450b47cdb7ab7a9a4e6bac68f6a5f:


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 36  : pager.c,v 1.26
0350: 37 20 32 30 30 36 2f 30 35 2f 30 33 20 32 33 3a  7 2006/05/03 23:
0360: 33 34 3a 30 36 20 64 72 68 20 45 78 70 20 24 0a  34:06 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28  .#define TRACE1(
0440: 58 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  X)       sqlite3
0450: 44 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23  DebugPrintf(X).#
0460: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0470: 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  Y)     sqlite3De
0480: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23  bugPrintf(X,Y).#
0490: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
04a0: 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65  Y,Z)   sqlite3De
04b0: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29  bugPrintf(X,Y,Z)
04c0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
04d0: 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33  X,Y,Z,W) sqlite3
04e0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04f0: 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Z,W).#define TRA
0500: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0530: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
0540: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
0550: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0560: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c  define TRACE4(X,
0580: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0590: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
05a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
05b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
05c0: 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 64   macros are used
05d0: 20 77 69 74 68 69 6e 20 74 68 65 20 54 52 41 43   within the TRAC
05e0: 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76  EX() macros abov
05f0: 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75  e.** to print ou
0600: 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  t file-descripto
0610: 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52  rs. .**.** PAGER
0620: 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69  ID() takes a poi
0630: 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
0640: 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20 61  struct as it's a
0650: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0660: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0670: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0680: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
0690: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
06a0: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
06b0: 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e   as it's argumen
06c0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  t..*/.#define PA
06d0: 47 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28  GERID(p) ((int)(
06e0: 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20  p->fd)).#define 
06f0: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
0700: 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a   ((int)fd)../*.*
0710: 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65  * The page cache
0720: 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61   as a whole is a
0730: 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20  lways in one of 
0740: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
0750: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
0760: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
0770: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0780: 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  che is not curre
0790: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
07a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
07b0: 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e            writin
07c0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
07d0: 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ile.  There is n
07e0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
07f0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
0800: 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  held in memory. 
0810: 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   This is the ini
0820: 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  tial.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
0840: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ate..**.**   PAG
0850: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20  ER_SHARED       
0860: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0870: 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  is reading the d
0880: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74    Writing is not
08b0: 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65   permitted.  The
08c0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20  re can be.**    
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64     multiple read
08f0: 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68  ers accessing th
0900: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a  e same database.
0910: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0920: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74           file at
0930: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
0940: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45  **.**   PAGER_RE
0950: 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73  SERVED      This
0960: 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73   process has res
0970: 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61  erved the databa
0980: 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  se for writing.*
0990: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
09a0: 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20          but has 
09b0: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79  not yet made any
09c0: 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20   changes.  Only 
09d0: 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20  one process.**  
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63       at a time c
0a00: 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64  an reserve the d
0a10: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72  atabase.  The or
0a20: 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  iginal.**       
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
0a50: 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  s not been modif
0a60: 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20  ied so other.** 
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20        processes 
0a90: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
0aa0: 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b  ding the on-disk
0ab0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0ac0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0ad0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  se file..**.**  
0ae0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
0af0: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0b00: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0b10: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0b40: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0b50: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0b60: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0b70: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
0b80: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
0b90: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
0ba0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bc0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0bd0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  ng..**.**   PAGE
0be0: 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20  R_SYNCED        
0bf0: 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  The pager moves 
0c00: 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72  to this state fr
0c10: 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  om PAGER_EXCLUSI
0c20: 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  VE.**           
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65              afte
0c40: 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
0c50: 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
0c60: 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ten to the.**   
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0c90: 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
0ca0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
0cb0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
0cc0: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e             disk.
0cd0: 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e   All that remain
0ce0: 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65  s to do is to re
0cf0: 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  move the.**     
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61    journal file a
0d20: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
0d30: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20  on will be.**   
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a      committed..*
0d60: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61  *.** The page ca
0d70: 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20  che comes up in 
0d80: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d90: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a  he first time a.
0da0: 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
0db0: 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  get() occurs, th
0dc0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0dd0: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0de0: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0df0: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0e00: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0e10: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0e20: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0e30: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0e40: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0e50: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0e60: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0e70: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
0e80: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, 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 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0eb0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0ec0: 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65  that sqlite_page
0ed0: 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  _write() can onl
0ee0: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0ef0: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0f00: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0f10: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0f20: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0f30: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0f40: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0f50: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0f60: 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61  VED.).** The tra
0f70: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0f80: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0f90: 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e  s when before an
0fa0: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
0fb0: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
0fc0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74  abase file.  Aft
0fd0: 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67  er an sqlite3pag
0fe0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  er_rollback().**
0ff0: 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72   or sqlite_pager
1000: 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73  _commit(), the s
1010: 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74  tate goes back t
1020: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
1030: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1040: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1050: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1060: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1070: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1080: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1090: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
10a0: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
10b0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
10c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
10d0: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
10e0: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10f0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
1100: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
1110: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49        5../*.** I
1120: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  f the SQLITE_BUS
1130: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  Y_RESERVED_LOCK 
1140: 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20  macro is set to 
1150: 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d  true at compile-
1160: 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61  time,.** then fa
1170: 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f  iled attempts to
1180: 20 67 65 74 20 61 20 72 65 73 65 72 76 65 64 20   get a reserved 
1190: 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65  lock will invoke
11a0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
11b0: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f  ck..** This is o
11c0: 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ff by default.  
11d0: 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73  To see why, cons
11e0: 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
11f0: 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20  ng scenario:.** 
1200: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65  .** Suppose thre
1210: 61 64 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  ad A already has
1220: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
1230: 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73 65 72  nd wants a reser
1240: 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72  ved lock..** Thr
1250: 65 61 64 20 42 20 61 6c 72 65 61 64 79 20 68 61  ead B already ha
1260: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
1270: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65  k and wants an e
1280: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
1290: 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61  If.** both threa
12a0: 64 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65  ds are using the
12b0: 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ir busy callback
12c0: 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  s, it might be a
12d0: 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65   long time.** be
12e0: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
12f0: 74 68 72 65 61 64 73 20 67 69 76 65 20 75 70 20  threads give up 
1300: 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f  and allows the o
1310: 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e  ther to proceed.
1320: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
1330: 68 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20  hread trying to 
1340: 67 65 74 20 74 68 65 20 72 65 73 65 72 76 65 64  get the reserved
1350: 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71   lock gives up q
1360: 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74  uickly.** (if it
1370: 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69   never invokes i
1380: 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ts busy callback
1390: 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  ) then the conte
13a0: 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a  ntion will be.**
13b0: 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c   resolved quickl
13c0: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
13d0: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
13e0: 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65  ED_LOCK.# define
13f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1400: 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e  ERVED_LOCK 0.#en
1410: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1420: 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c  macro rounds val
1430: 75 65 73 20 75 70 20 73 6f 20 74 68 61 74 20 69  ues up so that i
1440: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1450: 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20  n address it.** 
1460: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1470: 20 62 65 20 61 6e 20 61 64 64 72 65 73 73 20 74   be an address t
1480: 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74  hat is aligned t
1490: 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  o an 8-byte boun
14a0: 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  dary..*/.#define
14b0: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
14c0: 28 58 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e  (X)   (((X)+7)&~
14d0: 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69  7)../*.** Each i
14e0: 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  n-memory image o
14f0: 66 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20  f a page begins 
1500: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
1510: 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68  ng header..** Th
1520: 69 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c  is header is onl
1530: 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69  y visible to thi
1540: 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20  s pager module. 
1550: 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63   The client.** c
1560: 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70  ode that calls p
1570: 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74  ager sees only t
1580: 68 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  he data that fol
1590: 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e  lows the header.
15a0: 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f  .**.** Client co
15b0: 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73  de should call s
15c0: 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
15d0: 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72  e() on a page pr
15e0: 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a  ior to making.**
15f0: 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f   any modificatio
1600: 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e  ns to that page.
1610: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
1620: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1630: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1640: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1650: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
1660: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1670: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
1680: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
1690: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
16a0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
16b0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
16c0: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
16d0: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
16e0: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
16f0: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1700: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1710: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1720: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1730: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1740: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1750: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1760: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
1770: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
1780: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
1790: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
17a0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
17b0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
17c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
17d0: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
17e0: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
17f0: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69  3pager_write() i
1800: 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  s called and.** 
1810: 69 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e  is cleared again
1820: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63   when the page c
1830: 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65  ontent is writte
1840: 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72  n back to the or
1850: 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  iginal.** databa
1860: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65  se file..*/.type
1870: 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72  def struct PgHdr
1880: 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50   PgHdr;.struct P
1890: 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a  gHdr {.  Pager *
18a0: 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
18b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
18c0: 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68  ager to which th
18d0: 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20  is page belongs 
18e0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
1910: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
1920: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
1930: 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72  *pNextHash, *pPr
1940: 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68  evHash;  /* Hash
1950: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
1960: 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20   for PgHdr.pgno 
1970: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1980: 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65  tFree, *pPrevFre
1990: 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20  e;  /* Freelist 
19a0: 6f 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  of pages where n
19b0: 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64  Ref==0 */.  PgHd
19c0: 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20  r *pNextAll;    
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19e0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
19f0: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
1a00: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
1a10: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
1a20: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
1a30: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1a40: 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61  */.  u8 inJourna
1a50: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1a60: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68      /* TRUE if h
1a70: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
1a80: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
1a90: 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20  u8 inStmt;      
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ab0: 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65  * TRUE if in the
1ac0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
1ad0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
1ae0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
1af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1b00: 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  E if we need to 
1b10: 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67  write back chang
1b20: 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  es */.  u8 needS
1b30: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
1b40: 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a         /* Sync j
1b50: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72  ournal before wr
1b60: 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  iting this page 
1b70: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
1b80: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
1b90: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64      /* Disable d
1ba0: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
1bb0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
1bc0: 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66    short int nRef
1bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
1bf0: 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  ers of this page
1c00: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
1c10: 72 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79  rty, *pPrevDirty
1c20: 3b 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61  ;    /* Dirty pa
1c30: 67 65 73 20 73 6f 72 74 65 64 20 62 79 20 50 67  ges sorted by Pg
1c40: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 75 33  Hdr.pgno */.  u3
1c50: 32 20 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  2 notUsed;      
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c70: 42 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a  Buffer space */.
1c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1c90: 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20  ECK_PAGES.  u32 
1ca0: 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66  pageHash;.#endif
1cb0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61  .  /* pPager->pa
1cc0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1cd0: 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77  page data follow
1ce0: 20 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a   this header */.
1cf0: 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72    /* Pager.nExtr
1d00: 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c  a bytes of local
1d10: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65   data follow the
1d20: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b   page data */.};
1d30: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ../*.** For an i
1d40: 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61  n-memory only da
1d50: 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74  tabase, some ext
1d60: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
1d70: 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74  s recorded about
1d80: 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f  .** each page so
1d90: 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63 61   that changes ca
1da0: 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1db0: 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .  (Journal file
1dc0: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65  s are not.** use
1dd0: 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  d for in-memory 
1de0: 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68 65  databases.)  The
1df0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72   following infor
1e00: 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20  mation is added 
1e10: 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  to.** the end of
1e20: 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f   every EXTRA blo
1e30: 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ck for in-memory
1e40: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
1e50: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
1e60: 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  on could have be
1e70: 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74 6c  en added directl
1e80: 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20 73  y to the PgHdr s
1e90: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74  tructure..** But
1ea0: 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74   then it would t
1eb0: 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61 20  ake up an extra 
1ec0: 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61  8 bytes of stora
1ed0: 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64  ge on every PgHd
1ee0: 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69  r.** even for di
1ef0: 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  sk-based databas
1f00: 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69  es.  Splitting i
1f10: 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62 79  t out saves 8 by
1f20: 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  tes.  This.** is
1f30: 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20   only a savings 
1f40: 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73  of 0.8% but thos
1f50: 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61 64  e percentages ad
1f60: 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  d up..*/.typedef
1f70: 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72   struct PgHistor
1f80: 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72  y PgHistory;.str
1f90: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a  uct PgHistory {.
1fa0: 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20    u8 *pOrig;    
1fb0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67   /* Original pag
1fc0: 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65  e text.  Restore
1fd0: 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75   to this on a fu
1fe0: 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ll rollback */. 
1ff0: 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20   u8 *pStmt;     
2000: 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77 61  /* Text as it wa
2010: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2020: 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ng of the curren
2030: 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d  t statement */.}
2040: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f  ;../*.** A macro
2050: 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69   used for invoki
2060: 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20  ng the codec if 
2070: 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a  there is one.*/.
2080: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
2090: 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65  S_CODEC.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
20b0: 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d   if( P->xCodec!=
20c0: 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50  0 ){ P->xCodec(P
20d0: 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c  ->pCodecArg,D,N,
20e0: 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43  X); }.# define C
20f0: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
2100: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
2110: 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50  c!=0?P->xCodec(P
2120: 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c  ->pCodecArg,D,N,
2130: 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64  X):D)).#else.# d
2140: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
2150: 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a  ,N,X) /* NO-OP *
2160: 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  /.# define CODEC
2170: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
2180: 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r*)D).#endif../*
2190: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f  .** Convert a po
21a0: 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72  inter to a PgHdr
21b0: 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
21c0: 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61  to its data.** a
21d0: 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a  nd back again..*
21e0: 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  /.#define PGHDR_
21f0: 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f  TO_DATA(P)  ((vo
2200: 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23  id*)(&(P)[1])).#
2210: 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50  define DATA_TO_P
2220: 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48  GHDR(D)  (&((PgH
2230: 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64  dr*)(D))[-1]).#d
2240: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45  efine PGHDR_TO_E
2250: 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64  XTRA(G,P) ((void
2260: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29  *)&((char*)(&(G)
2270: 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53  [1]))[(P)->pageS
2280: 69 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47  ize]).#define PG
2290: 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47  HDR_TO_HIST(P,PG
22a0: 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20  R)  \.          
22b0: 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26    ((PgHistory*)&
22c0: 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d  ((char*)(&(P)[1]
22d0: 29 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69  ))[(PGR)->pageSi
22e0: 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61  ze+(PGR)->nExtra
22f0: 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69  ])../*.** How bi
2300: 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  g to make the ha
2310: 73 68 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f  sh table used fo
2320: 72 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65  r locating in-me
2330: 6d 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20 62 79  mory pages.** by
2340: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68   page number. Th
2350: 69 73 20 6d 61 63 72 6f 20 6c 6f 6f 6b 73 20 61  is macro looks a
2360: 20 6c 69 74 74 6c 65 20 73 69 6c 6c 79 2c 20 62   little silly, b
2370: 75 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 0a  ut is evaluated.
2380: 2a 2a 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ** at compile-ti
2390: 6d 65 2c 20 6e 6f 74 20 72 75 6e 2d 74 69 6d 65  me, not run-time
23a0: 20 28 61 74 20 6c 65 61 73 74 20 66 6f 72 20 67   (at least for g
23b0: 63 63 20 74 68 69 73 20 69 73 20 74 72 75 65 29  cc this is true)
23c0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50  ..*/.#define N_P
23d0: 47 5f 48 41 53 48 20 28 5c 0a 20 20 28 4d 41 58  G_HASH (\.  (MAX
23e0: 5f 50 41 47 45 53 3e 31 30 32 34 29 3f 32 30 34  _PAGES>1024)?204
23f0: 38 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45  8: \.  (MAX_PAGE
2400: 53 3e 35 31 32 29 3f 31 30 32 34 3a 20 5c 0a 20  S>512)?1024: \. 
2410: 20 28 4d 41 58 5f 50 41 47 45 53 3e 32 35 36 29   (MAX_PAGES>256)
2420: 3f 35 31 32 3a 20 5c 0a 20 20 28 4d 41 58 5f 50  ?512: \.  (MAX_P
2430: 41 47 45 53 3e 31 32 38 29 3f 32 35 36 3a 20 5c  AGES>128)?256: \
2440: 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 36 34  .  (MAX_PAGES>64
2450: 29 3f 31 32 38 3a 36 34 20 5c 0a 29 0a 0a 2f 2a  )?128:64 \.)../*
2460: 0a 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20  .** Hash a page 
2470: 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e  number.*/.#defin
2480: 65 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29  e pager_hash(PN)
2490: 20 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41    ((PN)&(N_PG_HA
24a0: 53 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  SH-1))../*.** A 
24b0: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
24c0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
24d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
24e0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
24f0: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d   Pager.errCode m
2500: 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ay be set to SQL
2510: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
2520: 45 5f 43 4f 52 52 55 50 54 2c 20 53 51 4c 49 54  E_CORRUPT, SQLIT
2530: 45 5f 50 52 4f 54 4f 43 4f 4c 0a 2a 2a 20 6f 72  E_PROTOCOL.** or
2540: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e   SQLITE_FULL. On
2550: 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69  ce one of the fi
2560: 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73  rst three errors
2570: 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73   occurs, it pers
2580: 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72  ists.** and is r
2590: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
25a0: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
25b0: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
25c0: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  all.  The.** SQL
25d0: 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20  ITE_FULL return 
25e0: 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79  code is slightly
25f0: 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70   different. It p
2600: 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74  ersists only unt
2610: 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73  il the.** next s
2620: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
2630: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
2640: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
2650: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c  he. Also,.** SQL
2660: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
2670: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
2680: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
2690: 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  and sqlite3pager
26a0: 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49  _lookup().** API
26b0: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
26c0: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
26d0: 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63  sfully..*/.struc
26e0: 74 20 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a  t Pager {.  u8 j
26f0: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
2700: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2710: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
2720: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
2730: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  alid */.  u8 jou
2740: 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20  rnalStarted;    
2750: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2760: 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e   header of journ
2770: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  al is synced */.
2780: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a0: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
27b0: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
27c0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
27d0: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
27e0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
27f0: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
2800: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
2810: 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20  u8 stmtOpen;    
2820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2830: 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74 65  rue if the state
2840: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
2850: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
2860: 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20  stmtInUse;      
2870: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2880: 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61   we are in a sta
2890: 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
28a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74  ction */.  u8 st
28b0: 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  mtAutoopen;     
28c0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73         /* Open s
28d0: 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  tmt journal when
28e0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
28f0: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
2900: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
2910: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2920: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
2930: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
2940: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
2950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2960: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
2970: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
2980: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
2990: 20 75 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 20   u8 full_fsync; 
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b0: 55 73 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  Use F_FULLFSYNC 
29c0: 77 68 65 6e 20 61 76 61 69 6c 61 62 6c 65 20 2a  when available *
29d0: 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20  /.  u8 state;   
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c  /* PAGER_UNLOCK,
2a00: 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52   _SHARED, _RESER
2a10: 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75  VED, etc. */.  u
2a20: 38 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20  8 errCode;      
2a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2a40: 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e  e of several kin
2a50: 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ds of errors */.
2a60: 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20    u8 tempFile;  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a80: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   zFilename is a 
2a90: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
2aa0: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
2ad0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
2ae0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2af0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2b00: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2b10: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
2b20: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
2b30: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61   */.  u8 dirtyCa
2b40: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
2b50: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
2b60: 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63  hed pages have c
2b70: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61  hanged */.  u8 a
2b80: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
2b90: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
2ba0: 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  le dont_rollback
2bb0: 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  () for all pages
2bc0: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
2bf0: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
2c00: 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73  O */.  u8 setMas
2c10: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
2c20: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2c30: 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65  m-j name has bee
2c40: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e  n written to jrn
2c50: 6c 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  l */.  int dbSiz
2c60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2c70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c80: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
2c90: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
2ca0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2cb0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
2cc0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2cd0: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
2ce0: 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20  stmtSize;       
2cf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2d00: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  of database (in 
2d10: 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62  pages) at stmt_b
2d20: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
2d30: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
2d40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2d50: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
2d60: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2d70: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
2d80: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
2d90: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
2da0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
2db0: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
2dc0: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
2dd0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
2de0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2df0: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
2e00: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
2e10: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
2e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2e30: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
2e40: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
2e50: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2e60: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
2e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e80: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2e90: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
2ea0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
2eb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
2ec0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
2ed0: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
2ee0: 69 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20 20  int nMaxPage;   
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2f00: 69 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20 6f  igh water mark o
2f10: 66 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  f nPage */.  int
2f20: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
2f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f40: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
2f50: 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72  pages with PgHdr
2f60: 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74  .nRef>0 */.  int
2f70: 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20   mxPage;        
2f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2f90: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
2fa0: 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63  ges to hold in c
2fb0: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  ache */.  u8 *aI
2fc0: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
2fd0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2fe0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2ff0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3000: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
3010: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
3020: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
3030: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3040: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
3050: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
3060: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
3070: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
3080: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
3090: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Name of the jour
30c0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
30d0: 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20  ar *zDirectory; 
30e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
30f0: 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61  ectory hold data
3100: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
3110: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69   files */.  OsFi
3120: 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20  le *fd, *jfd;   
3130: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3140: 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
3150: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
3160: 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  rnal */.  OsFile
3170: 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20   *stfd;         
3180: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
3190: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
31a0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
31b0: 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61  urnal*/.  BusyHa
31c0: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
31d0: 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ler;  /* Pointer
31e0: 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48   to sqlite.busyH
31f0: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64  andler */.  PgHd
3200: 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73  r *pFirst, *pLas
3210: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
3220: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
3230: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
3240: 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f  Synced;        /
3250: 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67  * First free pag
3260: 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65  e with PgHdr.nee
3270: 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67  dSync==0 */.  Pg
3280: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
3290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
32a0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
32b0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74  /.  PgHdr *pStmt
32c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32d0: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
32e0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
32f0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3300: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3320: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72   List of all dir
3330: 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36  ty pages */.  i6
3340: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
3350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
3360: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
3370: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3380: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
3390: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
33a0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
33b0: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
33c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
33d0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
33e0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
33f0: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3400: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
3410: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
3420: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
3430: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
3440: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
3450: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
3460: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36   started */.  i6
3470: 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20  4 stmtJSize;    
3480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
3490: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
34a0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
34b0: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
34c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
34d0: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
34e0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
34f0: 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53  back */.#ifdef S
3500: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
3510: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f   nHit, nMiss, nO
3520: 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63 68  vfl;     /* Cach
3530: 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c  e hits, missing,
3540: 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f   and LRU overflo
3550: 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ws */.  int nRea
3560: 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  d,nWrite;       
3570: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
3580: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
3590: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
35a0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
35b0: 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f  r)(void*,int); /
35c0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
35d0: 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67  ine when freeing
35e0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
35f0: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76 6f   (*xReiniter)(vo
3600: 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43  id*,int);   /* C
3610: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
3620: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
3630: 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  pages */.  void 
3640: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
3650: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
3660: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
3670: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
3680: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
3690: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
36a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
36b0: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
36c0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
36d0: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
36e0: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
36f0: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
3700: 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23  er to PgHdr */.#
3710: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
3720: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
3730: 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70  EMENT.  Pager *p
3740: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
3750: 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69      /* Linked li
3760: 73 74 20 6f 66 20 70 61 67 65 72 73 20 69 6e 20  st of pagers in 
3770: 74 68 69 73 20 74 68 72 65 61 64 20 2a 2f 0a 23  this thread */.#
3780: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
3790: 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  If SQLITE_TEST i
37a0: 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 69  s defined then i
37b0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 72  ncrement the var
37c0: 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a 2a  iable given in.*
37d0: 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a  * the argument.*
37e0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
37f0: 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54 45  TEST.# define TE
3800: 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b 0a  ST_INCR(x)  x++.
3810: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54  #else.# define T
3820: 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e 64  EST_INCR(x).#end
3830: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  if../*.** Journa
3840: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
3850: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
3860: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
3870: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
3880: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
3890: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
38a0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
38b0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
38c0: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
38d0: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
38e0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
38f0: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
3900: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
3910: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
3920: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
3930: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
3940: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
3950: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
3960: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
3970: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
3980: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
3990: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
39a0: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
39b0: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
39c0: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
39d0: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
39e0: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
39f0: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
3a00: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
3a10: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
3a20: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
3a30: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
3a40: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
3a50: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
3a60: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
3a70: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
3a80: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
3a90: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3aa0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
3ab0: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
3ac0: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
3ad0: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
3ae0: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
3af0: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
3b00: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
3b10: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
3b20: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
3b30: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
3b40: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
3b50: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
3b60: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
3b70: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
3b80: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
3b90: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
3ba0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
3bb0: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
3bc0: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
3bd0: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
3be0: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
3bf0: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
3c00: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
3c10: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
3c20: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
3c30: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
3c40: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
3c50: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
3c60: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
3c70: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
3c80: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
3c90: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
3ca0: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
3cb0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
3cc0: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
3cd0: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
3ce0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
3cf0: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
3d00: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
3d10: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
3d20: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
3d30: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
3d40: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
3d50: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3d60: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
3d70: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
3d80: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
3d90: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
3da0: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
3db0: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
3dc0: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
3dd0: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
3de0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
3df0: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
3e00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
3e10: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
3e20: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
3e30: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
3e40: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
3e50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
3e60: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
3e70: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
3e80: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
3e90: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
3ea0: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
3eb0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
3ec0: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
3ed0: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
3ee0: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
3ef0: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
3f00: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
3f10: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
3f20: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3f30: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
3f40: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
3f50: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
3f60: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
3f70: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
3f80: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
3f90: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
3fa0: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
3fb0: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
3fc0: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
3fd0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
3fe0: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
3ff0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
4000: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
4010: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
4020: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
4030: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
4040: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
4050: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
4060: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
4070: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
4080: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
4090: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
40a0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
40b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
40c0: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20  default size of 
40d0: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a 2f  a disk sector.*/
40e0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
40f0: 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a 0a  ECTOR_SIZE 512..
4100: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
4110: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
4120: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
4130: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
4140: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
4150: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
4160: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
4170: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
4180: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
4190: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
41a0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
41b0: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
41c0: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
41d0: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
41e0: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
41f0: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
4200: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
4210: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
4220: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
4230: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
4240: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
4250: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
4260: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
4270: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
4280: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
4290: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
42a0: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
42b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
42c0: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
42d0: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
42e0: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
42f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4300: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
4310: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
4320: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
4330: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
4340: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45  7483647../*.** E
4350: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
4360: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
4370: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
4380: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
4390: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
43a0: 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f  t pager3_refinfo
43b0: 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73  _enable = 0;.  s
43c0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
43d0: 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a  _refinfo(PgHdr *
43e0: 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  p){.    static i
43f0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
4400: 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69  if( !pager3_refi
4410: 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74  nfo_enable ) ret
4420: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
4430: 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
4440: 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64      "REFCNT: %4d
4450: 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
4460: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
4470: 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
4480: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20  TA(p), p->nRef. 
4490: 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b     );.    cnt++;
44a0: 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20     /* Something 
44b0: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
44c0: 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20  int on */.  }.# 
44d0: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
44e0: 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  )  pager_refinfo
44f0: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
4500: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65  ne REFINFO(X).#e
4510: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
4520: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4530: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
4540: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4550: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
4560: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
4570: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
4580: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4590: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
45a0: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
45b0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
45c0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
45d0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
45e0: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
45f0: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4600: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
4610: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
4620: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20  OsFile *fd, u32 
4630: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
4640: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
4650: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
4660: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
4670: 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20 69  sizeof(ac));.  i
4680: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4690: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
46a0: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
46b0: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
46c0: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
46d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
46e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
46f0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4700: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
4710: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
4720: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
4730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4740: 75 74 33 32 62 69 74 73 28 63 68 61 72 20 2a 61  ut32bits(char *a
4750: 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 61  c, u32 val){.  a
4760: 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29  c[0] = (val>>24)
4770: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d   & 0xff;.  ac[1]
4780: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
4790: 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28  xff;.  ac[2] = (
47a0: 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a  val>>8) & 0xff;.
47b0: 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20    ac[3] = val & 
47c0: 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  0xff;.}../*.** W
47d0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
47e0: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
47f0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
4800: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
4810: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
4820: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
4830: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
4840: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
4850: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
4860: 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ite32bits(OsFile
4870: 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a   *fd, u32 val){.
4880: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
4890: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
48a0: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
48b0: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
48c0: 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ac, 4);.}../*.**
48d0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
48e0: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
48f0: 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74   'offset' from t
4900: 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
4910: 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65  ed by.** page he
4920: 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61  ader 'p'..*/.sta
4930: 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65  tic u32 retrieve
4940: 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c  32bits(PgHdr *p,
4950: 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20   int offset){.  
4960: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
4970: 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73  c;.  ac = &((uns
4980: 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44  igned char*)PGHD
4990: 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66  R_TO_DATA(p))[of
49a0: 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20  fset];.  return 
49b0: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
49c0: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
49d0: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
49e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
49f0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
4a00: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
4a10: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
4a20: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
4a30: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
4a40: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
4a50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
4a60: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
4a70: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
4a80: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
4a90: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
4aa0: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
4ab0: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
4ac0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4ad0: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
4ae0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4af0: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
4b00: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
4b10: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4b20: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
4b30: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
4b40: 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52 4f  PT or SQLITE_PRO
4b50: 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65 72  TOCOL,.** the er
4b60: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
4b70: 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73  istent. All subs
4b80: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
4b90: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a   on this Pager.*
4ba0: 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  * will immediate
4bb0: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
4bc0: 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  me error code..*
4bd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
4be0: 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
4bf0: 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
4c00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4c10: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
4c20: 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65  TE_FULL || pPage
4c30: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
4c40: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 0a  TE_OK );.  if( .
4c50: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46      rc==SQLITE_F
4c60: 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 3d 3d 53  ULL ||.    rc==S
4c70: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20  QLITE_IOERR ||. 
4c80: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f     rc==SQLITE_CO
4c90: 52 52 55 50 54 20 7c 7c 0a 20 20 20 20 72 63 3d  RRUPT ||.    rc=
4ca0: 3d 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  =SQLITE_PROTOCOL
4cb0: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
4cc0: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
4cd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4ce0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4cf0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
4d00: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
4d10: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
4d20: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
4d30: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
4d40: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
4d50: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
4d60: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
4d70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
4d80: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
4d90: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
4da0: 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  r *)PGHDR_TO_DAT
4db0: 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28  A(pPage);.  for(
4dc0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50  i=0; i<pPage->pP
4dd0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
4de0: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
4df0: 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b   (hash+i)^pData[
4e00: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
4e10: 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   hash;.}../*.** 
4e20: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
4e30: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
4e40: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
4e50: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
4e60: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
4e70: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
4e80: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
4e90: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
4ea0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
4eb0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
4ec0: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
4ed0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
4ee0: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
4ef0: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
4f00: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4f10: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
4f20: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
4f30: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
4f40: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
4f50: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
4f60: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
4f70: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
4f80: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
4f90: 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67   || MEMDB || pPg
4fa0: 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20  ->dirty || .    
4fb0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d    pPg->pageHash=
4fc0: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
4fd0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
4fe0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
4ff0: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  AGE(x).#endif../
5000: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
5010: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
5020: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
5030: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
5040: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
5050: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5060: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
5070: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
5080: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
5090: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
50a0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
50b0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
50c0: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
50d0: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
50e0: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
50f0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
5100: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
5110: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
5120: 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72  Free() *pzMaster
5130: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
5140: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5150: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
5160: 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73  t *pzMaster is s
5170: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
5180: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
5190: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
51a0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
51b0: 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c  al(OsFile *pJrnl
51c0: 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65  , char **pzMaste
51d0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
51e0: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
51f0: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
5200: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
5210: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
5220: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
5230: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
5240: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
5250: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  *pzMaster = 0;..
5260: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5270: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
5280: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
5290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
52a0: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
52b0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
52c0: 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73  3OsSeek(pJrnl, s
52d0: 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63  zJ-16);.  if( rc
52e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
52f0: 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20  turn rc;. .  rc 
5300: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
5310: 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  nl, &len);.  if(
5320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5330: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5340: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5350: 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  Jrnl, &cksum);. 
5360: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5370: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5380: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5390: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
53a0: 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72  gic, 8);.  if( r
53b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
53c0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
53d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
53e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
53f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5400: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
5410: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
5420: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5430: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d  turn rc;..  *pzM
5440: 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29  aster = (char *)
5450: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
5460: 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d  +1);.  if( !*pzM
5470: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  aster ){.    ret
5480: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5490: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
54a0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
54b0: 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  , *pzMaster, len
54c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
54d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
54e0: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
54f0: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
5500: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  er = 0;.    retu
5510: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
5520: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
5530: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
5540: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5550: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
5560: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
5570: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70      cksum -= (*p
5580: 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d  zMaster)[i];.  }
5590: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
55a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
55b0: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
55c0: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
55d0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
55e0: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
55f0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
5600: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5610: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
5620: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
5630: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
5640: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
5650: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
5660: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
5670: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
5680: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
5690: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
56a0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
56b0: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
56c0: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
56d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a  .  }else{.    (*
56e0: 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d  pzMaster)[len] =
56f0: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
5700: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5710: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
5720: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5730: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
5740: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
5750: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
5760: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
5770: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
5780: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
5790: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
57a0: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
57b0: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
57c0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
57d0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
57e0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
57f0: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
5800: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
5810: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
5820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5840: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
5860: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5880: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
58a0: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
58c0: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
58d0: 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61  c int seekJourna
58e0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
58f0: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
5900: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
5910: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5920: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
5930: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
5940: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
5950: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
5960: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
5970: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
5980: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
5990: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
59a0: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
59b0: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
59c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
59d0: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
59e0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
59f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
5a00: 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b  nalOff = offset;
5a10: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5a20: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
5a30: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
5a40: 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a  rnalOff);.}../*.
5a50: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
5a60: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
5a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
5a80: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
5a90: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
5aa0: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
5ab0: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
5ac0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
5ad0: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
5ae0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
5af0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
5b00: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
5b10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
5b20: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
5b30: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
5b40: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
5b50: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
5b60: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
5b70: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
5b80: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
5b90: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
5ba0: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
5bb0: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
5bc0: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
5bd0: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
5be0: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
5bf0: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
5c00: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
5c10: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
5c20: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
5c30: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
5c40: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
5c50: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
5c60: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
5c70: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
5c80: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
5c90: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
5ca0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5cb0: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
5cc0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
5cd0: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 0a 20 20  lMagic)+16];..  
5ce0: 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75  int rc = seekJou
5cf0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
5d00: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
5d10: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
5d20: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
5d30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5d40: 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  f;.  if( pPager-
5d50: 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29  >stmtHdrOff==0 )
5d60: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
5d70: 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65  mtHdrOff = pPage
5d80: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20  r->journalHdr;. 
5d90: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
5da0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
5db0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5dc0: 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a  );..  /* FIX ME:
5dd0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73   .  **.  ** Poss
5de0: 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72  ibly for a pager
5df0: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
5e00: 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
5e10: 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e  l magic should n
5e20: 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  ot.  ** be writt
5e30: 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73  en until nRec is
5e40: 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61   filled in as pa
5e50: 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a  rt of next syncJ
5e60: 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a  ournal(). .  **.
5e70: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61    ** Actually ma
5e80: 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  ybe the whole jo
5e90: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f  urnal header sho
5ea0: 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75  uld be delayed u
5eb0: 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70  ntil that.  ** p
5ec0: 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75  oint. Think abou
5ed0: 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d  t this..  */.  m
5ee0: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
5ef0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
5f00: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5f10: 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e  ic));.  /* The n
5f20: 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46  Rec Field. 0xFFF
5f30: 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e  FFFFF for no-syn
5f40: 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20  c journals. */. 
5f50: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
5f60: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
5f70: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
5f80: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66  er->noSync ? 0xf
5f90: 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
5fa0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
5fb0: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
5fc0: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
5fd0: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  e3Randomness(siz
5fe0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
5ff0: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
6000: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
6010: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6020: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6030: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
6040: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
6050: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
6060: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
6070: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6080: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6090: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
60a0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
60b0: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
60c0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
60d0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
60e0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
60f0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6100: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
6110: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
6120: 72 53 69 7a 65 29 3b 0a 20 20 72 63 20 3d 20 73  rSize);.  rc = s
6130: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
6140: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
6150: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
6160: 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er));..  /* The 
6170: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
6180: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
6190: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
61a0: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
61b0: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
61c0: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
61d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
61e0: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
61f0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
6200: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
6210: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
6220: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
6230: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
6240: 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
6250: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6260: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6270: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
6280: 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a  fd, "\000", 1);.
6290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
62a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
62b0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
62c0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
62d0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
62e0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
62f0: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
6300: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
6310: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
6320: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6330: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
6340: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
6350: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
6360: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
6370: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
6380: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
6390: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
63a0: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
63b0: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
63c0: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
63d0: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
63e0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63f0: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
6400: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
6410: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
6420: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
6430: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
6440: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
6450: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
6460: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
6470: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
6480: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
6490: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
64a0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
64b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
64c0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
64d0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
64e0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
64f0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
6500: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
6510: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
6520: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
6530: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
6540: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
6550: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
6560: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
6570: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
6580: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
6590: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
65a0: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
65b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
65c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
65d0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
65e0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
65f0: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
6600: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
6610: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
6620: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
6630: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
6640: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
6650: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6660: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
6670: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6680: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6690: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
66a0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
66b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
66c0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
66d0: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
66e0: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
66f0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
6700: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
6710: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
6720: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
6730: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
6740: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6750: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63   rc;..  if( memc
6760: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6770: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6780: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
6790: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
67a0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
67b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
67c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65  Pager->jfd, pNRe
67d0: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
67e0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
67f0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6800: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
6810: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
6820: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6830: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
6840: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6850: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
6860: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6870: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
6880: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
6890: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
68a0: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
68b0: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
68c0: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
68d0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
68e0: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
68f0: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
6900: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
6910: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
6920: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
6930: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
6940: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
6950: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
6960: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
6970: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
6980: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
6990: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
69a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
69b0: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
69c0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
69d0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  s(pPager->jfd, (
69e0: 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73  u32 *)&pPager->s
69f0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
6a00: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6a10: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
6a20: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
6a30: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6a40: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6a50: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
6a60: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
6a70: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75  rnalOff);.  retu
6a80: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
6a90: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
6aa0: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
6ab0: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
6ac0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6ad0: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
6ae0: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
6af0: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
6b00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6b10: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
6b20: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
6b30: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
6b40: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
6b50: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
6b60: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
6b70: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
6b80: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
6b90: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
6ba0: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
6bb0: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
6bc0: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
6bd0: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
6be0: 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  **.** + 4 bytes:
6bf0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
6c00: 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65  ** + N bytes: le
6c10: 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
6c20: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20  ournal name..** 
6c30: 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20  + 4 bytes: N.** 
6c40: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
6c50: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
6c60: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20  hecksum..** + 8 
6c70: 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
6c80: 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
6c90: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6ca0: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
6cb0: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
6cc0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
6cd0: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
6ce0: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  name..**.** If z
6cf0: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
6d00: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
6d10: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
6d20: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
6d30: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
6d40: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
6d50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
6d60: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
6d70: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
6d80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
6d90: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
6da0: 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74   int len; .  int
6db0: 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d   i; .  u32 cksum
6dc0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
6dd0: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
6de0: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
6df0: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
6e00: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
6e10: 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  er) return SQLIT
6e20: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
6e30: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
6e40: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
6e50: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
6e60: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
6e70: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
6e80: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
6e90: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
6ea0: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
6eb0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
6ec0: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
6ed0: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
6ee0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6ef0: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
6f00: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
6f10: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
6f20: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
6f30: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
6f40: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
6f50: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
6f60: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
6f70: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
6f80: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
6f90: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6fa0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6fb0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
6fc0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
6fd0: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
6fe0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
6ff0: 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a  r->jfd, PAGER_MJ
7000: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
7010: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7020: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7030: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
7040: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
7050: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
7060: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
7070: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7080: 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74   rc;..  put32bit
7090: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
70a0: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
70b0: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
70c0: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
70d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
70e0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
70f0: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
7100: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
7110: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
7120: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
7130: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
7140: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
7150: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
7160: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7170: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
7180: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
7190: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
71a0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
71b0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
71c0: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
71d0: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
71e0: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
71f0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
7200: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
7210: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
7220: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
7230: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
7240: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
7250: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
7260: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
7270: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
7280: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
7290: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
72a0: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
72b0: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
72c0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
72d0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
72e0: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64  ic void page_add
72f0: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  _to_stmt_list(Pg
7300: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
7310: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
7320: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
7330: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
7340: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
7350: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  pPg->pPrevStmt==
7360: 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53  0 && pPg->pNextS
7370: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d  tmt==0 );.  pPg-
7380: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
7390: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
73a0: 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  tmt ){.    pPage
73b0: 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53  r->pStmt->pPrevS
73c0: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  tmt = pPg;.  }. 
73d0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
73e0: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
73f0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
7400: 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69   = pPg;.  pPg->i
7410: 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61  nStmt = 1;.}.sta
7420: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
7430: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
7440: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
7450: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53  .  if( !pPg->inS
7460: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
7470: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  if( pPg->pPrevSt
7480: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
7490: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
74a0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67  ->pNextStmt==pPg
74b0: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
74c0: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
74d0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
74e0: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
74f0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
7500: 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67  ager->pStmt==pPg
7510: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   );.    pPg->pPa
7520: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
7530: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7540: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
7550: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  tStmt ){.    ass
7560: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53  ert( pPg->pNextS
7570: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  tmt->pPrevStmt==
7580: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
7590: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
75a0: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Stmt = pPg->pPre
75b0: 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67  vStmt;.  }.  pPg
75c0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
75d0: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
75e0: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e  t = 0;.  pPg->in
75f0: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
7600: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
7610: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
7620: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
7630: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
7640: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7650: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
7660: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
7670: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
7680: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
7690: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
76a0: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
76b0: 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  *p = pPager->aHa
76c0: 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67  sh[pager_hash(pg
76d0: 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  no)];.  while( p
76e0: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
76f0: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
7700: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
7710: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
7720: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
7730: 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61  atabase and clea
7740: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
7750: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
7760: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
7770: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
7780: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
7790: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
77a0: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
77b0: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
77c0: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
77d0: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
77e0: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
77f0: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
7800: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
7810: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
7820: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
7830: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7840: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
7850: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
7860: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
7870: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
7880: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
7890: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
78a0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
78b0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
78c0: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
78d0: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
78e0: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
78f0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
7900: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
7910: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
7920: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
7930: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
7940: 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ll = 0;.  memset
7950: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
7960: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
7970: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61  ->aHash));.  pPa
7980: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
7990: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
79a0: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
79b0: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
79c0: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
79d0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
79e0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
79f0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7a00: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
7a10: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
7a20: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
7a30: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
7a40: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
7a50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7a60: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
7a70: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
7a80: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7a90: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7aa0: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7ab0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7ac0: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
7ad0: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
7ae0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7af0: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7b00: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
7b10: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
7b20: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7b30: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7b40: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
7b50: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
7b60: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
7b70: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
7b80: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
7b90: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
7ba0: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
7bb0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
7bc0: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
7bd0: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
7be0: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
7bf0: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
7c00: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
7c10: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
7c20: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
7c30: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
7c40: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
7c50: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
7c60: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
7c70: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
7c80: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
7c90: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
7ca0: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
7cb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7cc0: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
7cd0: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
7ce0: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
7cf0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
7d00: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
7d10: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
7d20: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
7d30: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
7d40: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
7d50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7d60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7d70: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7d80: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
7d90: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
7da0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
7db0: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
7dc0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
7dd0: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
7de0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
7df0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
7e00: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
7e10: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
7e20: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
7e30: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
7e40: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
7e50: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
7e60: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
7e70: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
7e80: 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  nc = 0;.#ifdef S
7e90: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
7ea0: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
7eb0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
7ec0: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
7ed0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
7ee0: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
7ef0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
7f00: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
7f10: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
7f20: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
7f30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7f40: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
7f50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
7f60: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
7f70: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75  ==0 || pPager->u
7f80: 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  seJournal==0 );.
7f90: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
7fa0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
7fb0: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
7fc0: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
7fd0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
7fe0: 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f  RED;.  pPager->o
7ff0: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
8000: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
8010: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
8020: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
8030: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
8040: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
8050: 3e 70 46 69 72 73 74 3b 0a 20 20 72 65 74 75 72  >pFirst;.  retur
8060: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
8070: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
8080: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  n a checksum for
8090: 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74   the page of dat
80a0: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  a..**.** This is
80b0: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
80c0: 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61  ksum.  It is rea
80d0: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
80e0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
80f0: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
8100: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75   and the page nu
8110: 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69  mber.  We experi
8120: 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  mented with.** a
8130: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
8140: 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75   entire data, bu
8150: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
8160: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
8170: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
8180: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8190: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
81a0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
81b0: 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ata and.** the c
81c0: 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
81d0: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
81e0: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
81f0: 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  .  If journal.**
8200: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
8210: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
8220: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
8230: 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61  ost likely scena
8240: 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f  rio.** is that o
8250: 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
8260: 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
8270: 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
8280: 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63  d.  It is.** muc
8290: 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
82a0: 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
82b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
82c0: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
82d0: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
82e0: 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
82f0: 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
8300: 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
8310: 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
8320: 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
8330: 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
8340: 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
8350: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a  corruption..**.*
8360: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69  * FIX ME:  Consi
8370: 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79  der adding every
8380: 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62   200th (or so) b
8390: 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  yte of the data 
83a0: 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  to the.** checks
83b0: 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66  um.  That way if
83c0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73   a single page s
83d0: 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64  pans 3 or more d
83e0: 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a  isk sectors and.
83f0: 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64  ** only the midd
8400: 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72  le sector is cor
8410: 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74  rupt, we will st
8420: 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f  ill have a reaso
8430: 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20  nable.** chance 
8440: 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63  of failing the c
8450: 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73  hecksum and thus
8460: 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70   detecting the p
8470: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  roblem..*/.stati
8480: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
8490: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
84a0: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
84b0: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
84c0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
84d0: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
84e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
84f0: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
8500: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
8510: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
8520: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
8530: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
8540: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
8550: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
8560: 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
8570: 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  PgHdr*);../*.** 
8580: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
8590: 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ge from the jour
85a0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  nal file opened 
85b0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
85c0: 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79  or.** jfd.  Play
85d0: 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61  back this one pa
85e0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65  ge..**.** If use
85f0: 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e  Cksum==0 it mean
8600: 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64  s this journal d
8610: 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63  oes not use chec
8620: 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d  ksums.  Checksum
8630: 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65  s.** are not use
8640: 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a  d in statement j
8650: 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20  ournals because 
8660: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8670: 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65  ls do not.** nee
8680: 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77  d to survive pow
8690: 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a  er failures..*/.
86a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
86b0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
86c0: 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
86d0: 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69  , OsFile *jfd, i
86e0: 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20  nt useCksum){.  
86f0: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
8700: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
8710: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
8720: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
8730: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
8740: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
8750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8760: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
8770: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
8780: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
8790: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
87a0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
87b0: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
87c0: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
87d0: 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45   u8 aData[SQLITE
87e0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b  _MAX_PAGE_SIZE];
87f0: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
8800: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
8810: 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73  .  /* useCksum s
8820: 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f  hould be true fo
8830: 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  r the main journ
8840: 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  al and false for
8850: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
8860: 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66  journals.  Verif
8870: 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61  y that this is a
8880: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
8890: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66   */.  assert( jf
88a0: 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f  d == (useCksum ?
88b0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
88c0: 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a  Pager->stfd) );.
88d0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
88e0: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
88f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8900: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8910: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8920: 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61  OsRead(jfd, &aDa
8930: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
8940: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
8950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8960: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
8970: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
8980: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8990: 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69   + 4;..  /* Sani
89a0: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
89b0: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
89c0: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
89d0: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
89e0: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
89f0: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
8a00: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
8a10: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
8a20: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
8a30: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
8a40: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
8a50: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
8a60: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
8a70: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
8a80: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
8a90: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
8aa0: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
8ab0: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
8ac0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
8ad0: 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
8ae0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
8af0: 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
8b00: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
8b10: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75   }.  if( pgno>(u
8b20: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
8b30: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
8b40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8b50: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73    }.  if( useCks
8b60: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  um ){.    rc = r
8b70: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
8b80: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
8b90: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
8ba0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
8bb0: 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
8bc0: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
8bd0: 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21  (pPager, aData)!
8be0: 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
8bf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
8c00: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
8c10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8c20: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
8c30: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
8c40: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
8c50: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
8c60: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
8c70: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
8c80: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
8c90: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
8ca0: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
8cb0: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
8cc0: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
8cd0: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
8ce0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
8cf0: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
8d00: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
8d10: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
8d20: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
8d30: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
8d40: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
8d50: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
8d60: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
8d70: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
8d80: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
8d90: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
8da0: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
8db0: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
8dc0: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
8dd0: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
8de0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
8df0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
8e00: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
8e10: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
8e20: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
8e30: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
8e40: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
8e50: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
8e60: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
8e70: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
8e80: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
8e90: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
8ea0: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
8eb0: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
8ec0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
8ed0: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
8ee0: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
8ef0: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
8f00: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
8f10: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
8f20: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
8f30: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
8f40: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
8f50: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
8f60: 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72  re in the main r
8f70: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
8f80: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
8f90: 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c  , if a full ROLL
8fa0: 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65  BACK occurs afte
8fb0: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  r the statement.
8fc0: 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68    ** rollback th
8fd0: 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  e full ROLLBACK 
8fe0: 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65  will not restore
8ff0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73   the page to its
9000: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63   original.  ** c
9010: 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e  ontent.  Two con
9020: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  ditions must be 
9030: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
9040: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
9050: 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28  se.  ** files. (
9060: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
9070: 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20  must be locked. 
9080: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
9090: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  t the original. 
90a0: 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74   ** page content
90b0: 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   is in the main 
90c0: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
90d0: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
90e0: 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63  is not in.  ** c
90f0: 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20  ache or else it 
9100: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
9110: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20  dSync==0..  */. 
9120: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
9130: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
9140: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9150: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9160: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
9170: 50 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45  Pg!=0 );.  TRACE
9180: 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  3("PLAYBACK %d p
9190: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
91a0: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
91b0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
91c0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
91d0: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
91e0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
91f0: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
9200: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
9210: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
9220: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
9230: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9240: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9250: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9260: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9270: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
9280: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9290: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
92a0: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
92b0: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
92c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
92d0: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
92e0: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
92f0: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
9300: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
9310: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
9320: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
9330: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
9340: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
9350: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
9360: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
9370: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
9380: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
9390: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
93a0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
93b0: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
93c0: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
93d0: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
93e0: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
93f0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
9400: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
9410: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
9420: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
9430: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
9440: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50  g->nRef==0 || pP
9450: 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f  g->pgno==1 ); */
9460: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48  .    pData = PGH
9470: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
9480: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
9490: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
94a0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
94b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
94c0: 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a  structor ){  /**
94d0: 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c  * FIX ME:  Shoul
94e0: 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69  d this be xReini
94f0: 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50  t? ***/.      pP
9500: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
9510: 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  r(pData, pPager-
9520: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9530: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
9540: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
9550: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
9560: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
9570: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
9580: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
9590: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
95a0: 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   3);.  }.  retur
95b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
95c0: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
95d0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
95e0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
95f0: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
9600: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
9610: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
9620: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9630: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
9640: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
9650: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
9660: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
9670: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
9680: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
9690: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
96a0: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
96b0: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
96c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
96d0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
96e0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
96f0: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
9700: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
9710: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9720: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
9730: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
9740: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
9750: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
9760: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
9770: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
9780: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
9790: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
97a0: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
97b0: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
97c0: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
97d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
97e0: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63  ager_delmaster(c
97f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
9800: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
9810: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
9820: 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a   = 0;.  OsFile *
9830: 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68  master = 0;.  ch
9840: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
9850: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
9860: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
9870: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
9880: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
9890: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
98a0: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
98b0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
98c0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
98d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
98e0: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
98f0: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
9900: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
9910: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
9920: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
9930: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
9940: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
9950: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
9960: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
9970: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
9980: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
9990: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
99a0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
99b0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
99c0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
99d0: 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73 74 65  OsFileSize(maste
99e0: 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
99f0: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
9a00: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
9a10: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
9a20: 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
9a30: 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
9a40: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
9a50: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
9a60: 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  tr = 0;..    /* 
9a70: 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
9a80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9a90: 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
9aa0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20  btained from.   
9ab0: 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63   ** sqliteMalloc
9ac0: 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
9ad0: 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
9ae0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
9af0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
9b00: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
9b10: 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
9b20: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  urnal);.    if( 
9b30: 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
9b40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
9b50: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9b60: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
9b70: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
9b80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
9b90: 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74  ad(master, zMast
9ba0: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
9bb0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
9bc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9bd0: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
9be0: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
9bf0: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
9c00: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
9c10: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
9c20: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
9c30: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
9c40: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9c50: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f  OsFileExists(zJo
9c60: 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  urnal) ){.      
9c70: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
9c80: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
9c90: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
9ca0: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
9cb0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
9cc0: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
9cd0: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
9ce0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9cf0: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
9d00: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
9d10: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
9d20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9d30: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
9d40: 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20  .        OsFile 
9d50: 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  *journal = 0;.  
9d60: 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20        int c;..  
9d70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9d80: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
9d90: 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72  (zJournal, &jour
9da0: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
9db0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9dc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
9dd0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
9de0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
9df0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
9e00: 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e  terJournal(journ
9e10: 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29  al, &zMasterPtr)
9e20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9e30: 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61  3OsClose(&journa
9e40: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
9e50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
9e60: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
9e70: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9e80: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
9e90: 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
9ea0: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
9eb0: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
9ec0: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73  r)==0;.        s
9ed0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
9ee0: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69  rPtr);.        i
9ef0: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
9f00: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
9f10: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
9f20: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
9f30: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
9f40: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
9f50: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
9f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9f70: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
9f80: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
9f90: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
9fa0: 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73  }.  .  sqlite3Os
9fb0: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
9fc0: 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
9fd0: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
9fe0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
9ff0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a  iteFree(zMasterJ
a000: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
a010: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
a020: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
a030: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
a040: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
a060: 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
a070: 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69  e cache agree wi
a080: 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
a090: 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  sk.  In other wo
a0a0: 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74  rds,.** reread t
a0b0: 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74  he disk to reset
a0c0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
a0d0: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
a0e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a0f0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f  alled after a ro
a100: 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20  llback in which 
a110: 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74  some of the dirt
a120: 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73  y cache.** pages
a130: 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20   had never been 
a140: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64  written out to d
a150: 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  isk.  We need to
a160: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a   roll back the.*
a170: 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20  * cache content 
a180: 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20  and the easiest 
a190: 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69  way to do that i
a1a0: 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  s to reread the 
a1b0: 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62  old content.** b
a1c0: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ack from the dis
a1d0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
a1e0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
a1f0: 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
a200: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
a210: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
a220: 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50  ITE_OK;.  for(pP
a230: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
a240: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
a250: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61  extAll){.    cha
a260: 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41  r zBuf[SQLITE_MA
a270: 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20  X_PAGE_SIZE];.  
a280: 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74    if( !pPg->dirt
a290: 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
a2a0: 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
a2b0: 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
a2c0: 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
a2d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a2e0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
a2f0: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
a300: 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e 70  ize*(i64)(pPg->p
a310: 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 69  gno-1));.      i
a320: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a330: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
a340: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
a350: 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
a360: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a370: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a380: 20 20 54 52 41 43 45 33 28 22 52 45 46 45 54 43    TRACE3("REFETC
a390: 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
a3a0: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
a3b0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
a3c0: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
a3d0: 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31  ak;.      CODEC1
a3e0: 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70  (pPager, zBuf, p
a3f0: 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20  Pg->pgno, 2);.  
a400: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
a410: 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70  emset(zBuf, 0, p
a420: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
a430: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a440: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
a450: 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48  memcmp(zBuf, PGH
a460: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
a470: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a480: 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  e) ){.      memc
a490: 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
a4a0: 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61  (pPg), zBuf, pPa
a4b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a4c0: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
a4d0: 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
a4e0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
a4f0: 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54  Reiniter(PGHDR_T
a500: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
a510: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a520: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a530: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
a540: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
a550: 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
a560: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
a570: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
a580: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
a590: 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
a5a0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
a5b0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
a5c0: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
a5d0: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
a5e0: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
a5f0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 44    }.  pPager->pD
a600: 69 72 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75  irty = 0;.  retu
a610: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a620: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
a630: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
a640: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
a650: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
a660: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  .** indicated..*
a670: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
a680: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
a690: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
a6a0: 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
a6b0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
a6c0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
a6d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
a6e0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
a6f0: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
a700: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
a710: 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nPage);.}../*.**
a720: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
a730: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
a740: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
a750: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
a760: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
a770: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
a780: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
a790: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
a7a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
a7b0: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
a7c0: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
a7d0: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
a7e0: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
a7f0: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
a800: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
a810: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
a820: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
a830: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
a840: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
a850: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
a860: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
a870: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
a880: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
a890: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
a8a0: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
a8b0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
a8c0: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
a8d0: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
a8e0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
a8f0: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
a900: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
a910: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
a920: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
a930: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
a940: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
a950: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
a960: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
a970: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
a980: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
a990: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
a9a0: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
a9b0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
a9c0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
a9d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a9e0: 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20  .**       name. 
a9f0: 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62   The value may b
aa00: 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65  e zero (indicate
aa10: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
aa20: 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  o master.**     
aa30: 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20    journal.).**  
aa40: 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20  (6)  N bytes of 
aa50: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
aa60: 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61  al name.  The na
aa70: 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74  me will be nul-t
aa80: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20  erminated.**    
aa90: 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20     and might be 
aaa0: 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65  shorter than the
aab0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
aac0: 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69   (5).  If the fi
aad0: 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  rst byte.**     
aae0: 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73    of the name is
aaf0: 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65   \000 then there
ab00: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   is no master jo
ab10: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74  urnal.  The mast
ab20: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
ab30: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72  nal name is stor
ab40: 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
ab50: 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (7)  Zero or mo
ab60: 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
ab70: 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
ab80: 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
ab90: 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
aba0: 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
abb0: 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
abc0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
abd0: 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
abe0: 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
abf0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
ac00: 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
ac10: 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
ac20: 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69  an the first 6 i
ac30: 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
ac40: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
ac50: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
ac60: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37  nstance of the 7
ac70: 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
ac80: 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
ac90: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
aca0: 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
acb0: 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
acc0: 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
acd0: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
ace0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
acf0: 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
ad00: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
ad10: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
ad20: 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
ad30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ad40: 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
ad50: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
ad60: 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
ad70: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
ad80: 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
ad90: 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
ada0: 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
adb0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
adc0: 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
add0: 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
ade0: 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
adf0: 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
ae00: 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
ae10: 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
ae20: 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
ae30: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
ae40: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
ae50: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
ae60: 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
ae70: 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
ae80: 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
ae90: 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
aea0: 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
aeb0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
aec0: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
aed0: 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
aee0: 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
aef0: 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
af00: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
af10: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
af20: 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
af30: 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
af40: 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
af50: 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
af60: 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
af70: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
af80: 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
af90: 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
afa0: 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
afb0: 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
afc0: 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
afd0: 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
afe0: 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
aff0: 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
b000: 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
b010: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
b020: 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
b030: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
b040: 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
b050: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
b060: 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
b070: 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
b080: 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
b090: 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
b0a0: 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
b0b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b0c0: 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
b0d0: 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
b0e0: 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
b0f0: 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
b100: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
b110: 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
b120: 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
b130: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
b140: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
b150: 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
b160: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
b170: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
b180: 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
b190: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
b1a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
b1b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b1c0: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
b1d0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
b1e0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
b1f0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b200: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b210: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
b220: 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
b230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b240: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
b250: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
b260: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b280: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b290: 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
b2a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b2b0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
b2c0: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
b2d0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b2f0: 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
b300: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
b310: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
b320: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
b330: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
b340: 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
b350: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
b360: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
b370: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
b380: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
b390: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
b3a0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
b3b0: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
b3c0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
b3d0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
b3e0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
b3f0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
b400: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
b410: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b420: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
b430: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
b440: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
b450: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
b460: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
b470: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
b480: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
b490: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
b4a0: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
b4b0: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
b4c0: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
b4d0: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
b4e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
b4f0: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
b500: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
b510: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
b520: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
b530: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
b540: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
b550: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
b560: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
b570: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
b580: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
b590: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
b5a0: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
b5b0: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
b5c0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
b5d0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
b5e0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
b5f0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
b600: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b610: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b620: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
b630: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
b640: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
b650: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
b660: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
b670: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
b680: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
b690: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
b6a0: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
b6b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
b6c0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
b6d0: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
b6e0: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
b6f0: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
b700: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
b710: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
b720: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
b730: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
b740: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
b750: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b760: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
b770: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
b780: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
b790: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
b7a0: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
b7b0: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
b7c0: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
b7d0: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
b7e0: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
b7f0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
b800: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
b810: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
b820: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
b830: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
b840: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b850: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
b860: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
b870: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
b880: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
b890: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
b8a0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
b8b0: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
b8c0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
b8d0: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
b8e0: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
b8f0: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
b900: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
b910: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
b920: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
b930: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
b940: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
b950: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
b960: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
b970: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
b980: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
b990: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
b9a0: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
b9b0: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
b9c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
b9d0: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
b9e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b9f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ba00: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
ba10: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
ba20: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
ba30: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
ba40: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
ba50: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
ba60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
ba70: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
ba80: 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
ba90: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
baa0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
bab0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
bac0: 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20  le back to it's 
bad0: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
bae0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
baf0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
bb00: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
bb10: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
bb20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
bb30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
bb40: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
bb50: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
bb60: 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50  gDbSize==0 || pP
bb70: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
bb80: 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20  ==mxPg );.      
bb90: 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
bba0: 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
bbb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
bbc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bbd0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
bbe0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
bbf0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
bc00: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
bc10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
bc20: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
bc30: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
bc40: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
bc50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
bc60: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
bc70: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
bc80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
bc90: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
bca0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
bcb0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
bcc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
bcd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bce0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
bcf0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
bd00: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
bd10: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
bd20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bd30: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
bd40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bd50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bd60: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
bd70: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
bd80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bd90: 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
bda0: 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
bdb0: 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
bdc0: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
bdd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
bde0: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
bdf0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
be00: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29  .  if( zMaster )
be10: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
be20: 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
be30: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
be40: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
be50: 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a  urn true,.    **
be60: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
be70: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
be80: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
be90: 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
bea0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
beb0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
bec0: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
bed0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a  zMaster);.    }.
bee0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
bef0: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  Master);.  }..  
bf00: 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
bf10: 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
bf20: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
bf30: 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
bf40: 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
bf50: 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
bf60: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
bf70: 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 50  th a different P
bf80: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
bf90: 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
bfa0: 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
bfb0: 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
bfc0: 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
bfd0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74  /.  pPager->sect
bfe0: 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53  orSize = PAGER_S
bff0: 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 72 65  ECTOR_SIZE;.  re
c000: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c010: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
c020: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c030: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
c040: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
c050: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
c060: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
c070: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
c080: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
c090: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
c0a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
c0b0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
c0c0: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
c0d0: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
c0e0: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
c0f0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
c100: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
c110: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
c120: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
c130: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
c140: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
c150: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
c160: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
c170: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
c180: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
c190: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
c1a0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c1b0: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
c1c0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
c1d0: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
c1e0: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
c1f0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
c200: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
c210: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
c220: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
c230: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
c240: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
c250: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72  nal */.  i64 hdr
c260: 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b  Off;.  int nRec;
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
c290: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
c2c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
c2d0: 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
c2e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66  >journalOff;.#if
c2f0: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b  ndef NDEBUG .  {
c300: 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b  .    i64 os_szJ;
c310: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c320: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
c330: 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a  er->jfd, &os_szJ
c340: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
c350: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
c360: 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  n rc;.    assert
c370: 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b  ( szJ==os_szJ );
c380: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
c390: 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20  * Set hdrOff to 
c3a0: 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  be the offset to
c3b0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
c3c0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
c3d0: 6e 0a 20 20 2a 2a 20 74 68 69 73 20 73 74 61 74  n.  ** this stat
c3e0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
c3f0: 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
c400: 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
c410: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
c420: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
c430: 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
c440: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
c450: 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
c460: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
c470: 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
c480: 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
c490: 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
c4a0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
c4b0: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
c4c0: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
c4d0: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
c4e0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
c4f0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
c500: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72  CLUSIVE ){.    r
c510: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
c520: 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
c530: 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20  r->stmtSize);.  
c540: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
c550: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
c560: 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  tSize;..  /* Fig
c570: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
c580: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
c590: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
c5a0: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
c5b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
c5c0: 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
c5d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
c5e0: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  ;.  sqlite3OsSee
c5f0: 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
c600: 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61  0);.  nRec = pPa
c610: 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
c620: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
c630: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
c640: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
c650: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
c660: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
c670: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
c680: 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
c690: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
c6a0: 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
c6b0: 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
c6c0: 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
c6d0: 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
c6e0: 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
c6f0: 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
c700: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
c710: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
c720: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
c730: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
c740: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
c750: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
c760: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61  >stfd, 0);.    a
c770: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
c780: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
c790: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c7a0: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
c7b0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
c7c0: 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
c7d0: 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
c7e0: 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
c7f0: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
c800: 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
c810: 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
c820: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c830: 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
c840: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
c850: 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
c860: 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
c870: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
c880: 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
c890: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
c8a0: 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
c8b0: 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
c8c0: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
c8d0: 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
c8e0: 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
c8f0: 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
c900: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
c910: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
c920: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
c930: 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
c940: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
c950: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
c960: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
c970: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
c980: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  fd, pPager->stmt
c990: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
c9a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c9b0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
c9c0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
c9d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c9e0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
c9f0: 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
ca00: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
ca10: 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
ca20: 3b 0a 20 20 61 73 73 65 72 74 28 20 4a 4f 55 52  ;.  assert( JOUR
ca30: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ca40: 72 29 3c 28 70 50 61 67 65 72 2d 3e 70 61 67 65  r)<(pPager->page
ca50: 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68 69  Size+8) );.  whi
ca60: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
ca70: 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66  nalOff <= (hdrOf
ca80: 66 2d 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f-(pPager->pageS
ca90: 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20 20 72  ize+8)) ){.    r
caa0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
cab0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
cac0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
cad0: 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
cae0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
caf0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
cb00: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
cb10: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
cb20: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ck;.  }..  while
cb30: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cb40: 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20  lOff < szJ ){.  
cb50: 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20    u32 nJRec;    
cb60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cb70: 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
cb80: 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
cb90: 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
cba0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
cbb0: 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c  er, szJ, &nJRec,
cbc0: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66   &dummy);.    if
cbd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cbe0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
cbf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
cc00: 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   );.      goto e
cc10: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
cc20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cc30: 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20  nJRec==0 ){.    
cc40: 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d    nJRec = (szJ -
cc50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cc60: 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
cc70: 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
cc80: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52   }.    for(i=nJR
cc90: 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50  ec-1; i>=0 && pP
cca0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ccb0: 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20   < szJ; i--){.  
ccc0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
ccd0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
cce0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
ccf0: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  >jfd, 1);.      
cd00: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
cd10: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
cd20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cd30: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
cd40: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
cd50: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
cd60: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
cd70: 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f  zJ;.  .end_stmt_
cd80: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
cd90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b  rc==SQLITE_OK) {
cda0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
cdb0: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
cdc0: 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f     /* pager_relo
cdd0: 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
cde0: 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ; */.  }.  retur
cdf0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
ce00: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
ce10: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
ce20: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
ce30: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
ce40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
ce50: 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65  er_set_cachesize
ce60: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ce70: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
ce80: 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a  f( mxPage>10 ){.
ce90: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
cea0: 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  ge = mxPage;.  }
ceb0: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
cec0: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20  ->mxPage = 10;. 
ced0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75   }.}../*.** Adju
cee0: 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
cef0: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
cf00: 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
cf10: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
cf20: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
cf30: 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
cf40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
cf50: 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
cf60: 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
cf70: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
cf80: 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
cf90: 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
cfa0: 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
cfb0: 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
cfc0: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
cfd0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
cff0: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
d000: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
d010: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
d020: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
d030: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
d040: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
d050: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
d060: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
d070: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
d080: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
d090: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
d0a0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
d0b0: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
d0c0: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
d0d0: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
d0e0: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
d0f0: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
d100: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
d110: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
d120: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
d130: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
d140: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
d150: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
d160: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
d170: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d180: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
d190: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
d1a0: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
d1b0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
d1c0: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
d1d0: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
d1e0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d1f0: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
d200: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
d210: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
d220: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
d240: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
d250: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
d260: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
d270: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
d280: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
d290: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
d2a0: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
d2c0: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
d2d0: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
d2e0: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
d2f0: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
d300: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
d310: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
d320: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
d330: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
d340: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
d350: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
d360: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
d370: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
d380: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
d390: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
d3a0: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
d3b0: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
d3c0: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
d3d0: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
d3e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d3f0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
d400: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
d410: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
d420: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
d430: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
d440: 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
d450: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
d460: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
d470: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
d480: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
d490: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
d4a0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
d4b0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
d4c0: 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66  l_fsync = full_f
d4d0: 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50 61 67  sync;.  if( pPag
d4e0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
d4f0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
d500: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
d510: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d520: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
d530: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
d540: 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
d550: 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
d560: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
d570: 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
d580: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
d590: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
d5a0: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
d5b0: 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20   only.  .*/.int 
d5c0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
d5d0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  _count = 0;../*.
d5e0: 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
d5f0: 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ary file.  Write
d600: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d610: 20 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65   file into zFile
d620: 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20  .** (zFile must 
d630: 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49  be at least SQLI
d640: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
d650: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57   bytes long.)  W
d660: 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65  rite.** the file
d670: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
d680: 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
d690: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
d6a0: 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
d6b0: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
d6c0: 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a  f we fail..**.**
d6d0: 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
d6e0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
d6f0: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
d700: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a  file when it is.
d710: 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ** closed..*/.st
d720: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
d730: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63  pager_opentemp(c
d740: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69  har *zFile, OsFi
d750: 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74  le **pFd){.  int
d760: 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20   cnt = 8;.  int 
d770: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  rc;.  sqlite3_op
d780: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
d790: 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
d7a0: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
d7b0: 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a  s only */.  do{.
d7c0: 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73      cnt--;.    s
d7d0: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
d7e0: 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  Name(zFile);.   
d7f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
d800: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69  penExclusive(zFi
d810: 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d  le, pFd, 1);.  }
d820: 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20  while( cnt>0 && 
d830: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
d840: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
d850: 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  M );.  return rc
d860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
d870: 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
d880: 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
d890: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
d8a0: 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
d8b0: 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
d8c0: 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
d8d0: 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
d8e0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
d8f0: 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
d900: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
d910: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
d920: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
d930: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
d940: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
d950: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
d960: 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  g sqlite3pager_u
d970: 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nref()..**.** If
d980: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
d990: 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
d9a0: 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
d9b0: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
d9c0: 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
d9d0: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
d9e0: 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
d9f0: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
da00: 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
da10: 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63  lly when it is c
da20: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
da30: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
da40: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c  emory:" then all
da50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
da60: 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a  held in cache..*
da70: 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  * It is never wr
da80: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20  itten to disk.  
da90: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
daa0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
dab0: 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  .** in-memory da
dac0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
dad0: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
dae0: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
daf0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
db00: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
db10: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
db20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
db30: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
db40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
db50: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
db60: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
db70: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
db80: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
db90: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
dba0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
dbb0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
dbd0: 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
dbe0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
dbf0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
dc00: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46   = 0;.  char *zF
dc10: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  ullPathname = 0;
dc20: 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20  .  int nameLen; 
dc30: 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20   /* Compiler is 
dc40: 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61  wrong. This is a
dc50: 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
dc60: 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a  d before use */.
dc70: 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20    OsFile *fd;.  
dc80: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dc90: 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  OK;.  int i;.  i
dca0: 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
dcb0: 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
dcc0: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
dcd0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a   = 0;.  int useJ
dce0: 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
dcf0: 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
dd00: 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20  RNAL)==0;.  int 
dd10: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
dd20: 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
dd30: 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63  EADLOCK)!=0;.  c
dd40: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
dd50: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
dd60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
dd70: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
dd80: 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
dd90: 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
dda0: 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
ddb0: 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
ddc0: 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
ddd0: 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
dde0: 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
ddf0: 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
de00: 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
de10: 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
de20: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
de30: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
de40: 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
de50: 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
de60: 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
de70: 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
de80: 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
de90: 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62   set. It would b
dea0: 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74  e nice to assert
deb0: 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61  .  ** that Threa
dec0: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20  dData.nAlloc is 
ded0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c  non-zero, but al
dee0: 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20 74  as this breaks t
def0: 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20  est cases .  ** 
df00: 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b  written to invok
df10: 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72 65  e the pager dire
df20: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72  ctly..  */.  Thr
df30: 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
df40: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
df50: 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
df60: 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Tsd );.#endif.. 
df70: 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20   /* If malloc() 
df80: 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c  has already fail
df90: 65 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ed return SQLITE
dfa0: 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65  _NOMEM. Before e
dfb0: 76 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67  ven.  ** testing
dfc0: 20 66 6f 72 20 74 68 69 73 2c 20 73 65 74 20 2a   for this, set *
dfd0: 70 70 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20  ppPager to NULL 
dfe0: 73 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e  so the caller kn
dff0: 6f 77 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  ows the pager.  
e000: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 77 61 73  ** structure was
e010: 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65 64   never allocated
e020: 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67  . .  */.  *ppPag
e030: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  er = 0;.  if( sq
e040: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
e050: 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d() ){.    retur
e060: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e070: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66 64    }.  memset(&fd
e080: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29  , 0, sizeof(fd))
e090: 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
e0a0: 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20   pager file and 
e0b0: 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  set zFullPathnam
e0c0: 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61  e to point at ma
e0d0: 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d  lloc()ed .  ** m
e0e0: 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  emory containing
e0f0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69   the complete fi
e100: 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63  lename (i.e. inc
e110: 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63  luding the direc
e120: 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  tory)..  */.  if
e130: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
e140: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
e150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e160: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
e170: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
e180: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
e190: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
e1a0: 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46  Db = 1;.      zF
e1b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
e1c0: 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a  liteStrDup("");.
e1d0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
e1e0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75  .    {.      zFu
e1f0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e200: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
e210: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
e220: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
e230: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
e240: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e250: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
e260: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
e270: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
e280: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
e290: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
e2a0: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
e2b0: 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b  emp(zTemp, &fd);
e2c0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
e2d0: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
e2e0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
e2f0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
e300: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
e310: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e320: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
e330: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
e340: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
e350: 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ate the Pager st
e360: 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74  ructure. As part
e370: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c   of the same all
e380: 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ocation, allocat
e390: 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72  e.  ** space for
e3a0: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20   the full paths 
e3b0: 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72  of the file, dir
e3c0: 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e  ectory and journ
e3d0: 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e  al .  ** (Pager.
e3e0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72  zFilename, Pager
e3f0: 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20  .zDirectory and 
e400: 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e  Pager.zJournal).
e410: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c  .  */.  if( zFul
e420: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e430: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
e440: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
e450: 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
e460: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
e470: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
e480: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
e490: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
e4a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
e4b0: 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
e4c0: 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
e4d0: 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20  ee the memory . 
e4e0: 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
e4f0: 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y zFullPathname,
e500: 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72 20   free the Pager 
e510: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
e520: 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  ose the .  ** fi
e530: 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  le. Since the pa
e540: 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63  ger is not alloc
e550: 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f  ated there is no
e560: 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20   need to set .  
e570: 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72  ** any Pager.err
e580: 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a  Mask variables..
e590: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
e5a0: 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68  er || !zFullPath
e5b0: 6e 61 6d 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49  name || rc!=SQLI
e5c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
e5d0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
e5e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
e5f0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e600: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e610: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
e620: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
e630: 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45  _OK)?SQLITE_NOME
e640: 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52  M:rc);.  }..  TR
e650: 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
e660: 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
e670: 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68  D(fd), zFullPath
e680: 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  name);.  pPager-
e690: 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
e6a0: 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a  ar*)&pPager[1];.
e6b0: 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63    pPager->zDirec
e6c0: 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e  tory = &pPager->
e6d0: 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65  zFilename[nameLe
e6e0: 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n+1];.  pPager->
e6f0: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
e700: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e  er->zDirectory[n
e710: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72  ameLen+1];.  str
e720: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
e730: 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  ename, zFullPath
e740: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
e750: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e760: 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ry, zFullPathnam
e770: 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d  e);..  for(i=nam
e780: 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61  eLen; i>0 && pPa
e790: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
e7a0: 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
e7b0: 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
e7c0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
e7d0: 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72  [i-1] = 0;.  str
e7e0: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
e7f0: 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  rnal, zFullPathn
e800: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
e810: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
e820: 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61  );.  strcpy(&pPa
e830: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61  ger->zJournal[na
e840: 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61  meLen], "-journa
e850: 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  l");.  pPager->f
e860: 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61  d = fd;.  /* pPa
e870: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
e880: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
e890: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
e8a0: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d  useJournal && !m
e8b0: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
e8c0: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52  noReadlock = noR
e8d0: 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
e8e0: 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
e8f0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
e900: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
e910: 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
e920: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
e930: 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
e940: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
e950: 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72  emDb-1;.  pPager
e960: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c  ->pageSize = SQL
e970: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
e980: 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67  _SIZE;.  /* pPag
e990: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
e9a0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
e9b0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
e9c0: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
e9d0: 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
e9e0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78   /* pPager->nMax
e9f0: 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
ea00: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
ea10: 31 30 30 3b 0a 20 20 61 73 73 65 72 74 28 20 50  100;.  assert( P
ea20: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29  AGER_UNLOCK==0 )
ea30: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
ea40: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
ea50: 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  OCK; */.  /* pPa
ea60: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
ea70: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
ea80: 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
ea90: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
eaa0: 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70  mDb = memDb;.  p
eab0: 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
eac0: 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  = readOnly;.  /*
ead0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
eae0: 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
eaf0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
eb00: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
eb10: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
eb20: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
eb30: 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
eb40: 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50  nc?0:1);.  /* pP
eb50: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
eb60: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
eb70: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
eb80: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
eb90: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
eba0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
ebb0: 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e  ra = FORCE_ALIGN
ebc0: 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20  MENT(nExtra);.  
ebd0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
ebe0: 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f  ze = PAGER_SECTO
ebf0: 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61  R_SIZE;.  /* pPa
ec00: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
ec10: 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d  r = 0; */.  /* m
ec20: 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
ec30: 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
ec40: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
ec50: 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
ec60: 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53  pPager;.#ifdef S
ec70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
ec80: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
ec90: 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d   pPager->pNext =
eca0: 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20   pTsd->pPager;. 
ecb0: 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20   pTsd->pPager = 
ecc0: 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20  pPager;.#endif. 
ecd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ece0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
ecf0: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
ed00: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
ed10: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
ed20: 73 65 74 5f 62 75 73 79 68 61 6e 64 6c 65 72 28  set_busyhandler(
ed30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42  Pager *pPager, B
ed40: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
ed50: 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61  yHandler){.  pPa
ed60: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
ed70: 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  r = pBusyHandler
ed80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
ed90: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
eda0: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
edb0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
edc0: 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61  destructor is ca
edd0: 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  lled.** when the
ede0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
edf0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65   on each page re
ee00: 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65  aches zero.  The
ee10: 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a   destructor can.
ee20: 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c  ** be used to cl
ee30: 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69  ean up informati
ee40: 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20  on in the extra 
ee50: 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64  segment appended
ee60: 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a   to each page..*
ee70: 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63  *.** The destruc
ee80: 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  tor is not calle
ee90: 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71  d as a result sq
eea0: 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
eeb0: 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63  ().  .** Destruc
eec0: 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61  tors are only ca
eed0: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 70  lled by sqlite3p
eee0: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f  ager_unref()..*/
eef0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
ef00: 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f  er_set_destructo
ef10: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
ef20: 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76   void (*xDesc)(v
ef30: 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  oid*,int)){.  pP
ef40: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
ef50: 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a  r = xDesc;.}../*
ef60: 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e  .** Set the rein
ef70: 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68  itializer for th
ef80: 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f  is pager.  If no
ef90: 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e  t NULL, the rein
efa0: 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20  itializer.** is 
efb0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
efc0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67  content of a pag
efd0: 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65  e in cache is re
efe0: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
eff0: 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20  iginal.** value 
f000: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
f010: 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
f020: 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68  callback gives h
f030: 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65  igher-level code
f040: 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  .** an opportuni
f050: 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ty to restore th
f060: 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20  e EXTRA section 
f070: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
f080: 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61  e restored.** pa
f090: 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64  ge data..*/.void
f0a0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
f0b0: 74 5f 72 65 69 6e 69 74 65 72 28 50 61 67 65 72  t_reiniter(Pager
f0c0: 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
f0d0: 2a 78 52 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c  *xReinit)(void*,
f0e0: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
f0f0: 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
f100: 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  init;.}../*.** S
f110: 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  et the page size
f120: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
f130: 77 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20  w size.  If the 
f140: 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65  suggest new page
f150: 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70  .** size is inap
f160: 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20  propriate, then 
f170: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
f180: 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65  age size is sele
f190: 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75  cted.** and retu
f1a0: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
f1b0: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61  ite3pager_set_pa
f1c0: 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
f1d0: 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69  ager, int pageSi
f1e0: 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ze){.  assert( p
f1f0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
f200: 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
f210: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
f220: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
f230: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50  >memDb ){.    pP
f240: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
f250: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20   pageSize;.  }. 
f260: 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
f270: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
f280: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f290: 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
f2a0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
f2b0: 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
f2c0: 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
f2d0: 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
f2e0: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
f2f0: 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
f300: 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
f310: 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
f320: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
f330: 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
f340: 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
f350: 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
f360: 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
f370: 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
f380: 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
f390: 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
f3a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
f3b0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
f3c0: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
f3d0: 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
f3e0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
f3f0: 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
f400: 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
f410: 64 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65  d clear_simulate
f420: 64 5f 69 6f 5f 65 72 72 6f 72 28 29 7b 0a 20 20  d_io_error(){.  
f430: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
f440: 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64  _hit = 0;.}.void
f450: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
f460: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
f470: 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
f480: 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
f490: 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
f4a0: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
f4b0: 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
f4c0: 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
f4d0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
f4e0: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
f4f0: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
f500: 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
f510: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63  #else.# define c
f520: 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69  lear_simulated_i
f530: 6f 5f 65 72 72 6f 72 28 29 0a 23 20 64 65 66 69  o_error().# defi
f540: 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
f550: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
f560: 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
f570: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
f580: 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
f590: 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
f5a0: 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
f5b0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
f5c0: 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
f5d0: 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
f5e0: 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
f5f0: 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20  .**.** No error 
f600: 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
f610: 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66  . The rational f
f620: 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
f630: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  this function .*
f640: 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  * may be called 
f650: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65  even if the file
f660: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
f670: 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61  or contain a hea
f680: 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73  der. In .** thes
f690: 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f  e cases sqlite3O
f6a0: 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74  sRead() will ret
f6b0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f  urn an error, to
f6c0: 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65   which the corre
f6d0: 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20  ct .** response 
f6e0: 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d  is to zero the m
f6f0: 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61  emory at pDest a
f700: 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20  nd continue.  A 
f710: 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a  real IO error .*
f720: 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c  * will presumabl
f730: 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70  y recur and be p
f740: 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28  icked up later (
f750: 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75  Todo: Think abou
f760: 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 76 6f 69 64  t this)..*/.void
f770: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
f780: 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28 50 61  ad_fileheader(Pa
f790: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
f7a0: 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
f7b0: 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d  r *pDest){.  mem
f7c0: 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
f7d0: 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30  ;.  if( MEMDB==0
f7e0: 20 29 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   ){.    disable_
f7f0: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
f800: 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
f810: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
f820: 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  >fd, 0);.    sql
f830: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
f840: 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29  r->fd, pDest, N)
f850: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
f860: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
f870: 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ();.  }.}../*.**
f880: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
f890: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
f8a0: 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
f8b0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
f8c0: 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a  th.** pPager. .*
f8d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44  *.** If the PEND
f8e0: 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e  ING_BYTE lies on
f8f0: 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74   the page direct
f900: 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  ly after the end
f910: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c   of the.** file,
f920: 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
f930: 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66  his page part of
f940: 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46   the file too. F
f950: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
f960: 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69  * PENDING_BYTE i
f970: 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65  s byte 4096 (the
f980: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70   first byte of p
f990: 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73  age 5) and the s
f9a0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ize of the.** fi
f9b0: 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73  le is 4096 bytes
f9c0: 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 5 is returned 
f9d0: 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f  instead of 4..*/
f9e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
f9f0: 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65  r_pagecount(Page
fa00: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
fa10: 34 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 n;.  assert( p
fa20: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
fa30: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
fa40: 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
fa50: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
fa60: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66   } else {.    if
fa70: 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  ( sqlite3OsFileS
fa80: 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
fa90: 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  &n)!=SQLITE_OK )
faa0: 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
fab0: 72 6f 72 28 70 50 61 67 65 72 2c 20 53 51 4c 49  ror(pPager, SQLI
fac0: 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 20 20 20  TE_IOERR);.     
fad0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
fae0: 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
faf0: 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
fb00: 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
fb10: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
fb20: 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
fb30: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
fb40: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
fb50: 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
fb60: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
fb70: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
fb80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
fb90: 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
fba0: 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
fbb0: 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
fbc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
fbd0: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
fbe0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
fbf0: 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  B./*.** Clear a 
fc00: 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a  PgHistory block.
fc10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
fc20: 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69  learHistory(PgHi
fc30: 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20  story *pHist){. 
fc40: 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
fc50: 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
fc60: 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
fc70: 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e  Stmt);.  pHist->
fc80: 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69  pOrig = 0;.  pHi
fc90: 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d  st->pStmt = 0;.}
fca0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
fcb0: 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23  learHistory(x).#
fcc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
fcd0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
fce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
fcf0: 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
fd00: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  *);../*.** Unlin
fd10: 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
fd20: 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
fd30: 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75   set the page nu
fd40: 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64  mber to 0 to ind
fd50: 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68  icate.** that th
fd60: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61  e page is not pa
fd70: 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63  rt of any hash c
fd80: 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65  hain. This is re
fd90: 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74  quired because t
fda0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67  he.** sqlite3pag
fdb0: 65 72 5f 6d 6f 76 65 70 61 67 65 28 29 20 72 6f  er_movepage() ro
fdc0: 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20  utine can leave 
fdd0: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  a page in the .*
fde0: 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65  * pNextFree/pPre
fdf0: 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20  vFree list that 
fe00: 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66  is not a part of
fe10: 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e   any hash-chain.
fe20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fe30: 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
fe40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
fe50: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
fe60: 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
fe70: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
fe80: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 7a  page number is z
fe90: 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ero, then this p
fea0: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 61 6e  age is not in an
feb0: 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 2a 2f  y hash chain. */
fec0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
fed0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
fee0: 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  tHash ){.    pPg
fef0: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
ff00: 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
ff10: 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  revHash;.  }.  i
ff20: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
ff30: 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
ff40: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
ff50: 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70  ager_hash(pPg->p
ff60: 67 6e 6f 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20  gno)]!=pPg );.  
ff70: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
ff80: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
ff90: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
ffa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
ffb0: 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50   = pager_hash(pP
ffc0: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
ffd0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
ffe0: 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20  ash[h]==pPg );. 
fff0: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
10000 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
10010 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
10020 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65  MEMDB ){.    cle
10030 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
10040 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
10050 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67  ger));.  }.  pPg
10060 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
10070 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
10080 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
10090 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
100a0 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
100b0 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
100c0 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
100d0 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
100e0 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
100f0 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
10100 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
10110 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
10120 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
10130 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
10140 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
10150 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46    /* Keep the pF
10160 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74  irstSynced point
10170 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  er pointing at t
10180 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f  he first synchro
10190 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  nized page */.  
101a0 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
101b0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
101c0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
101d0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
101e0 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
101f0 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
10200 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
10210 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
10220 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
10230 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
10240 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  k from the freel
10250 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ist */.  if( pPg
10260 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
10270 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
10280 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
10290 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
102a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
102b0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
102c0 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
102d0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
102e0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
102f0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
10300 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
10310 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
10320 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
10330 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65  >pPrevFree;.  }e
10340 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
10350 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d   pPager->pLast==
10360 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
10370 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
10380 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20  pPrevFree;.  }. 
10390 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
103a0 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
103b0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69   = 0;..  /* Unli
103c0 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
103d0 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
103e0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
103f0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
10400 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10410 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
10420 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10430 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
10440 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ncate an in-memo
10450 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 44 65  ry database.  De
10460 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65  lete.** all page
10470 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20  s whose pgno is 
10480 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
10490 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69  er->dbSize and i
104a0 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a  s unreferenced..
104b0 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
104c0 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
104d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
104e0 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74  re zeroed..*/.st
104f0 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79  atic void memory
10500 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
10510 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
10520 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
10530 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
10540 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
10550 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
10560 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
10570 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
10580 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
10590 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
105a0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
105b0 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
105c0 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
105d0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
105e0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
105f0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
10600 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
10610 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
10620 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
10630 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
10640 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
10650 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
10660 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28       unlinkPage(
10670 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65  pPg);.      make
10680 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
10690 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
106a0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
106b0 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >nPage--;.    }.
106c0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
106d0 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61  ine memoryTrunca
106e0 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  te(p).#endif../*
106f0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
10700 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69  n a lock on a fi
10710 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  le.  Invoke the 
10720 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
10730 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   the lock.** is 
10740 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
10750 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74  ailable.  Repeat
10760 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
10770 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
10780 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
10790 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
107a0 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
107b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
107c0 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
107d0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
107e0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
107f0 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
10800 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
10810 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
10820 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
10830 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
10840 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41  rc;.  assert( PA
10850 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
10860 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
10870 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
10880 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
10890 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
108a0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
108b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
108c0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
108d0 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
108e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
108f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
10900 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
10910 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
10920 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
10930 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
10940 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
10950 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33  _BUSY && sqlite3
10960 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
10970 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
10980 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69  andler) );.    i
10990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
109a0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
109b0 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79  ->state = lockty
109c0 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pe;.    }.  }.  
109d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
109e0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
109f0 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
10a00 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
10a10 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
10a20 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
10a30 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
10a40 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
10a50 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
10a60 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
10a70 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
10a80 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
10a90 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
10aa0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
10ab0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10ac0 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
10ad0 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
10ae0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
10af0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10b00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
10b10 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
10b20 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
10b30 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
10b40 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
10b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10b60 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79  K;.  }.  rc = sy
10b70 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
10b80 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10ba0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
10bb0 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  /* Get an exclus
10bc0 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
10bd0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
10be0 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20  truncating. */. 
10bf0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
10c00 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
10c10 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
10c20 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10c30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
10c40 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72  urn rc;.  }..  r
10c50 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
10c60 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65  te(pPager, nPage
10c70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
10c80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
10c90 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
10ca0 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Page;.  }.  retu
10cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10cc0 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
10cd0 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
10ce0 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
10cf0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
10d00 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
10d10 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
10d20 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
10d30 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10d40 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
10d50 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
10d60 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
10d70 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
10d80 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
10d90 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
10da0 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
10db0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
10dc0 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
10dd0 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
10de0 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
10df0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10e00 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
10e10 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
10e20 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
10e30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
10e40 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
10e50 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
10e60 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
10e70 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
10e80 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
10e90 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
10ea0 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
10eb0 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
10ec0 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
10ed0 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
10ee0 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
10ef0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
10f00 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
10f10 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
10f20 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61  e3pager_close(Pa
10f30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10f40 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
10f50 78 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  xt;.#ifdef SQLIT
10f60 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
10f70 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20  MANAGEMENT.  /* 
10f80 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f  A malloc() canno
10f90 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65  t fail in sqlite
10fa0 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73  3ThreadData() as
10fb0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c   one or more cal
10fc0 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c  ls to .  ** mall
10fd0 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61  oc() must have a
10fe0 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65  lready been made
10ff0 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20   by this thread 
11000 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20  before it gets. 
11010 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e   ** to this poin
11020 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  t. This means th
11030 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73  e ThreadData mus
11040 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  t have been allo
11050 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20  cated already.  
11060 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61  ** so that Threa
11070 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e  dData.nAlloc can
11080 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
11090 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
110a0 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64   = sqlite3Thread
110b0 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74  Data();.  assert
110c0 28 20 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ( pPager );.  as
110d0 73 65 72 74 28 20 70 54 73 64 20 26 26 20 70 54  sert( pTsd && pT
110e0 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65  sd->nAlloc );.#e
110f0 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20  ndif..  switch( 
11100 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b  pPager->state ){
11110 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
11120 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61  RESERVED:.    ca
11130 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3a  se PAGER_SYNCED:
11140 20 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52   .    case PAGER
11150 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20  _EXCLUSIVE: {.  
11160 20 20 20 20 2f 2a 20 57 65 20 69 67 6e 6f 72 65      /* We ignore
11170 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 73 20 74   any IO errors t
11180 68 61 74 20 6f 63 63 75 72 20 64 75 72 69 6e 67  hat occur during
11190 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   the rollback.  
111a0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
111b0 2e 20 53 6f 20 64 69 73 61 62 6c 65 20 49 4f 20  . So disable IO 
111c0 65 72 72 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e  error simulation
111d0 20 73 6f 20 74 68 61 74 20 74 65 73 74 69 6e 67   so that testing
111e0 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20  .      ** works 
111f0 6d 6f 72 65 20 65 61 73 69 6c 79 2e 0a 20 20 20  more easily..   
11200 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 69 73 61     */.      disa
11210 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
11220 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 20  _errors();.     
11230 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
11240 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
11250 20 20 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d        enable_sim
11260 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
11270 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4d  ();.      if( !M
11280 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
11290 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
112a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
112b0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
112c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
112d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70  er->errCode || p
112e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
112f0 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  en==0 );.      b
11300 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11310 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52 45  case PAGER_SHARE
11320 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21  D: {.      if( !
11330 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
11340 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
11350 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
11360 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
11370 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11380 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
11390 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
113a0 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
113b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
113c0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
113d0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
113e0 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20  pNext){.#ifndef 
113f0 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 4d  NDEBUG.    if( M
11400 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
11410 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
11420 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
11430 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
11440 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
11450 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
11460 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11470 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
11480 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11490 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
114a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
114b0 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
114c0 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c  NextAll;.    sql
114d0 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
114e0 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53  }.  TRACE2("CLOS
114f0 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
11500 28 70 50 61 67 65 72 29 29 3b 0a 20 20 61 73 73  (pPager));.  ass
11510 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
11520 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d  Code || (pPager-
11530 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
11540 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  && pPager->stmtO
11550 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  pen==0) );.  if(
11560 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11570 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
11580 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
11590 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
115a0 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
115b0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
115c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
115d0 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  mtOpen ){.    sq
115e0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
115f0 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d  ager->stfd);.  }
11600 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
11610 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  e(&pPager->fd);.
11620 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
11630 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
11640 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
11650 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
11660 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
11670 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f  .  **   sqlite3O
11680 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
11690 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a  zFilename);.  **
116a0 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20   }.  */..#ifdef 
116b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
116c0 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
116d0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
116e0 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c  pager from the l
116f0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
11700 67 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  gers starting at
11710 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74   .  ** ThreadDat
11720 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f  a.pPager if memo
11730 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
11740 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20   enabled..  */. 
11750 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73   if( pPager==pTs
11760 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  d->pPager ){.   
11770 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20   pTsd->pPager = 
11780 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
11790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65   }else{.    Page
117a0 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72  r *pTmp;.    for
117b0 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50  (pTmp = pTsd->pP
117c0 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  ager; pTmp->pNex
117d0 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d  t!=pPager; pTmp=
117e0 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  pTmp->pNext){}. 
117f0 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d     pTmp->pNext =
11800 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
11810 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
11820 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
11830 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11840 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
11850 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
11860 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
11870 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
11880 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61  /.Pgno sqlite3pa
11890 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76  ger_pagenumber(v
118a0 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
118b0 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54  gHdr *p = DATA_T
118c0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
118d0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
118e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
118f0 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69  age_ref() functi
11900 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  on increments th
11910 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
11920 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a  t for a page..**
11930 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
11940 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
11950 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72   freelist (the r
11960 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
11970 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20  s zero) then.** 
11980 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
11990 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
119a0 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20  ** For non-test 
119b0 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
119c0 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74  f() is a macro t
119d0 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f  hat calls _page_
119e0 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20  ref().** online 
119f0 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
11a00 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20   count is zero. 
11a10 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d   For test system
11a20 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s, page_ref().**
11a30 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74   is a real funct
11a40 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63  ion so that we c
11a50 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e  an set breakpoin
11a60 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e  ts and trace it.
11a70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11a80 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20  _page_ref(PgHdr 
11a90 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
11aa0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
11ab0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20   /* The page is 
11ac0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
11ad0 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f   freelist.  Remo
11ae0 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ve it. */.    if
11af0 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67  ( pPg==pPg->pPag
11b00 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
11b10 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
11b20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
11b30 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ree;.      while
11b40 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
11b50 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
11b60 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20  xtFree; }.      
11b70 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
11b80 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
11b90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
11ba0 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
11bb0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
11bc0 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
11bd0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
11be0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11bf0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
11c00 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
11c10 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  xtFree;.    }.  
11c20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
11c30 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
11c40 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
11c50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
11c60 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65  PrevFree;.    }e
11c70 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
11c80 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
11c90 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
11ca0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
11cb0 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
11cc0 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b   }.  pPg->nRef++
11cd0 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
11ce0 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
11cf0 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63  E_DEBUG.  static
11d00 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50   void page_ref(P
11d10 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20  gHdr *pPg){.    
11d20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
11d30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f   ){.      _page_
11d40 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ref(pPg);.    }e
11d50 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
11d60 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45  nRef++;.      RE
11d70 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20  FINFO(pPg);.    
11d80 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  }.  }.#else.# de
11d90 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29  fine page_ref(P)
11da0 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30     ((P)->nRef==0
11db0 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76  ?_page_ref(P):(v
11dc0 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29  oid)(P)->nRef++)
11dd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
11de0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
11df0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
11e00 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e   a page.  The in
11e10 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a  put pointer is.*
11e20 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  * a reference to
11e30 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
11e40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
11e50 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44  ger_ref(void *pD
11e60 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
11e70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
11e80 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67  DR(pData);.  pag
11e90 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
11ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
11ec0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f  e journal.  In o
11ed0 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
11ee0 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
11ef0 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
11f00 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
11f10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
11f20 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
11f30 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
11f40 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20  f the.** disk.  
11f50 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
11f60 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69  o modify the ori
11f70 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
11f80 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a  ile until after.
11f90 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
11fa0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20  as been synced. 
11fb0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
11fc0 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64   database is mod
11fd0 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ified before.** 
11fe0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
11ff0 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65  ynced and a powe
12000 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
12010 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a  , the unsynced j
12020 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77  ournal.** data w
12030 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64  ould be lost and
12040 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61   we would be una
12050 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ble to completel
12060 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a  y rollback the.*
12070 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
12080 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  es.  Database co
12090 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f  rruption would o
120a0 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  ccur..** .** Thi
120b0 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75  s routine also u
120c0 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20  pdates the nRec 
120d0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61  field in the hea
120e0 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
120f0 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d  al..** (See comm
12100 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ents on the page
12110 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
12120 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
12130 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
12140 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63  ).** If the sync
12150 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74   mode is FULL, t
12160 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63  wo syncs will oc
12170 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20  cur.  First the 
12180 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  whole journal.**
12190 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e   is synced, then
121a0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
121b0 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e  is updated, then
121c0 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f   a second sync o
121d0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ccurs..**.** For
121e0 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
121f0 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20  ases, we do not 
12200 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61  care if we are a
12210 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  ble to rollback.
12220 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72  ** after a power
12230 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e   failure, so syn
12240 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
12250 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  This routine cle
12260 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ars the needSync
12270 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20   field of every 
12280 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c  page current hel
12290 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a  d in.** memory..
122a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
122b0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
122c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
122d0 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
122e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
122f0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
12300 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
12310 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
12320 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
12330 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
12340 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
12350 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
12360 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
12370 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
12380 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
12390 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
123a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
123b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
123c0 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  pen );.      /* 
123d0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
123e0 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f  >noSync ); // no
123f0 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65  Sync might be se
12400 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  t if synchronous
12410 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75  .      ** was tu
12420 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74  rned off after t
12430 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
12440 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63  as started.  Tic
12450 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e  ket #615 */.#ifn
12460 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20  def NDEBUG.     
12470 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   {.        /* Ma
12480 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67  ke sure the pPag
12490 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72  er->nRec counter
124a0 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20   we are keeping 
124b0 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a  agrees.        *
124c0 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20  * with the nRec 
124d0 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
124e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
124f0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
12500 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
12510 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20  64 jSz;.        
12520 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
12530 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
12540 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20  fd, &jSz);.     
12550 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
12560 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12570 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12580 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53  ->journalOff==jS
12590 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
125a0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
125b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
125c0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
125d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
125e0 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
125f0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
12600 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
12610 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
12620 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
12630 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
12640 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
12650 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
12660 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
12670 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
12680 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
12690 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
126a0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
126b0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
126c0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
126d0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
126e0 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22          TRACE2("
126f0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
12700 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
12710 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
12720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12730 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
12740 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  d, 0);.         
12750 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
12760 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
12770 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
12780 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
12790 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20  ger->jfd,.      
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
127c0 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
127d0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
127e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
127f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12800 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
12810 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
12820 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  fd, pPager->nRec
12830 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
12840 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
12850 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12860 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
12870 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
12880 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20  journalOff);.   
12890 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
128a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
128b0 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53  .      TRACE2("S
128c0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
128d0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
128e0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 72 63  ager));.      rc
128f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
12900 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
12910 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
12920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12930 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
12940 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
12950 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31  urnalStarted = 1
12960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
12970 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
12980 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20  ;..    /* Erase 
12990 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
129a0 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67  g from every pag
129b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
129c0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
129d0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
129e0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
129f0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
12a00 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
12a10 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
12a20 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70  nced = pPager->p
12a30 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  First;.  }..#ifn
12a40 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
12a50 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  If the Pager.nee
12a60 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c  dSync flag is cl
12a70 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48  ear then the PgH
12a80 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a  dr.needSync.  **
12a90 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20   flag must also 
12aa0 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c  be clear for all
12ab0 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20   pages.  Verify 
12ac0 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69  that this.  ** i
12ad0 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65  nvariant is true
12ae0 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20  ..  */.  else{. 
12af0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
12b00 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
12b10 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
12b20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
12b30 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
12b40 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
12b50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
12b60 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
12b70 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20  er->pFirst );.  
12b80 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
12b90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12ba0 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
12bb0 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
12bc0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
12bd0 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
12be0 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
12bf0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
12c00 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
12c10 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
12c20 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
12c30 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
12c40 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
12c50 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
12c60 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
12c70 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
12c80 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
12c90 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
12ca0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
12cb0 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
12cc0 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
12cd0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
12ce0 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
12cf0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
12d00 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
12d10 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
12d20 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
12d30 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
12d40 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
12d50 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
12d60 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
12d70 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
12d80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
12d90 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
12da0 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
12db0 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
12dc0 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
12dd0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
12de0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
12df0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
12e00 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
12e10 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
12e20 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
12e30 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
12e40 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
12e50 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
12e60 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
12e70 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
12e80 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
12e90 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
12ea0 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
12eb0 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
12ec0 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
12ed0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
12ee0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
12ef0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12f00 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
12f10 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
12f20 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
12f30 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
12f40 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
12f50 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
12f60 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
12f70 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
12f80 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
12f90 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
12fa0 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
12fb0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
12fc0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
12fd0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
12fe0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
12ff0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
13000 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
13010 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
13020 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
13030 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
13040 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
13050 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
13060 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
13070 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13080 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
13090 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c    }..  while( pL
130a0 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
130b0 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
130c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
130d0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
130e0 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67  ->fd, (pList->pg
130f0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
13100 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
13110 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13120 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20  n rc;.    /* If 
13130 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
13140 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
13150 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
13160 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
13170 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
13180 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
13190 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61   means sqlite3pa
131a0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77  ger_truncate() w
131b0 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
131c0 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
131d0 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
131e0 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
131f0 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
13200 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
13210 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
13220 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
13230 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
13240 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
13250 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
13260 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
13270 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48  DEC2(pPager, PGH
13280 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
13290 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
132a0 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  6);.      TRACE3
132b0 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
132c0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
132d0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
132e0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  gno);.      rc =
132f0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
13300 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
13310 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
13320 69 7a 65 29 3b 0a 20 20 20 20 20 20 54 45 53 54  ize);.      TEST
13330 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
13340 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  rite);.    }.#if
13350 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
13360 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43  else{.      TRAC
13370 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E3("NOSTORE %d p
13380 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
13390 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73  ID(pPager), pLis
133a0 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  t->pgno);.    }.
133b0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
133c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
133d0 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20     pList->dirty 
133e0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
133f0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
13400 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61     pList->pageHa
13410 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
13420 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64  ash(pList);.#end
13430 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  if.    pList = p
13440 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
13450 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13460 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
13470 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72  ollect every dir
13480 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64  ty page into a d
13490 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  irty list and.**
134a0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
134b0 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
134c0 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c   that list.  All
134d0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   pages are.** co
134e0 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  llected even if 
134f0 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
13500 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
13510 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65   PgHdr *pager_ge
13520 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
13530 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
13540 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
13550 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  r->pDirty;.}../*
13560 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
13570 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
13580 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
13590 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
135a0 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
135b0 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
135c0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
135d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
135e0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
135f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13600 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
13610 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
13620 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
13630 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
13640 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
13650 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
13660 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
13670 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
13680 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
13690 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
136a0 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
136b0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
136c0 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
136d0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
136e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
136f0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
13700 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
13710 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30  rnal) ) return 0
13720 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  ;.  if( sqlite3O
13730 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
13740 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  ck(pPager->fd) )
13750 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
13760 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
13770 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
13780 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13790 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
137a0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
137b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
137c0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
137d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
137e0 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
137f0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
13800 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
13810 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
13820 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
13830 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13840 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
13850 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
13860 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
13870 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
13880 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
13890 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
138a0 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
138b0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
138c0 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
138d0 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
138e0 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
138f0 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
13900 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
13910 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
13920 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
13930 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73  .  ** require us
13940 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
13950 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
13960 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
13970 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
13980 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ced;..  /* If we
13990 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
139a0 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
139b0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
139c0 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20  fsync().  ** on 
139d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
139e0 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
139f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
13a00 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65  his is a.  ** ve
13a10 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
13a20 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
13a30 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
13a40 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
13a50 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
13a60 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  helped..  */.  i
13a70 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61  f( pPg==0 && pPa
13a80 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73  ger->pFirst && s
13a90 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29  yncOk && !MEMDB)
13aa0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
13ab0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
13ac0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
13ad0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
13ae0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
13af0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
13b00 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sync ){.      /*
13b10 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
13b20 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
13b30 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
13b40 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
13b50 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
13b60 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
13b70 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
13b80 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
13b90 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72  .      ** header
13ba0 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
13bb0 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
13bc0 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
13bd0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  have.      ** al
13be0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
13bf0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
13c00 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
13c10 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20  header is.      
13c20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
13c30 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
13c40 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
13c50 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
13c60 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
13c70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13c80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
13c90 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
13ca0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
13cb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
13cc0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
13cd0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13ce0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13cf0 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
13d00 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  First;.  }.  if(
13d10 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pPg==0 ){.    r
13d20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13d30 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
13d40 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
13d50 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
13d60 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
13d70 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
13d80 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
13d90 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
13da0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
13db0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
13dc0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
13dd0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
13de0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  );.    pPg->dirt
13df0 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
13e00 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
13e10 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
13e20 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29  _pagelist( pPg )
13e30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
13e40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13e60 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
13e70 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
13e80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
13e90 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
13ea0 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
13eb0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
13ec0 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74   then.  ** set t
13ed0 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
13ee0 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
13ef0 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
13f00 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f  e.  ** sqlite_do
13f10 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  nt_rollback() op
13f20 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
13f30 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
13f40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
13f50 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
13f60 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
13f70 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
13f80 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
13f90 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ack.  ** might b
13fa0 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
13fb0 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
13fc0 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
13fd0 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
13fe0 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
13ff0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
14000 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
14010 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
14020 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d  s must.  ** be m
14030 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
14040 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
14050 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20  e on out..  */. 
14060 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
14070 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
14080 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
14090 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  llback = 1;.  }.
140a0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
140b0 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
140c0 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
140d0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
140e0 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67    */.  unlinkPag
140f0 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54 5f 49  e(pPg);.  TEST_I
14100 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66  NCR(pPager->nOvf
14110 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70  l);..  *ppPg = p
14120 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
14130 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14140 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14150 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65  s called to free
14160 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e   superfluous dyn
14170 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
14180 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c  ed memory.** hel
14190 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73  d by the pager s
141a0 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e  ystem. Memory in
141b0 20 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69   use by any SQLi
141c0 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74  te pager allocat
141d0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72  ed.** by the cur
141e0 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20  rent thread may 
141f0 62 65 20 73 71 6c 69 74 65 46 72 65 65 28 29 65  be sqliteFree()e
14200 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73  d..**.** nReq is
14210 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
14220 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
14230 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68  equired. Once th
14240 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62  is much has.** b
14250 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68  een released, th
14260 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
14270 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76  ns. A negative v
14280 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65  alue for nReq me
14290 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d  ans.** free as m
142a0 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
142b0 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75  ssible. The retu
142c0 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
142d0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a  total number .**
142e0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
142f0 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  ory released..*/
14300 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14310 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
14320 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69  AGEMENT.int sqli
14330 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61 73 65  te3pager_release
14340 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  _memory(int nReq
14350 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  ){.  const Threa
14360 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20  dData *pTsdro = 
14370 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
14380 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 50  aReadOnly();.  P
14390 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  ager *p;.  int n
143a0 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20  Released = 0;.  
143b0 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20  int i;..  /* If 
143c0 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  the the global m
143d0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68  utex is held, th
143e0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65  is subroutine be
143f0 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f  comes a.  ** o-o
14400 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66  p; zero bytes of
14410 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65   memory are free
14420 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  d.  This is beca
14430 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66  use.  ** some of
14440 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65   the code invoke
14450 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
14460 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a  on may also.  **
14470 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74   try to obtain t
14480 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74  he mutex, result
14490 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63  ing in a deadloc
144a0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  k..  */.  if( sq
144b0 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30  lite3OsInMutex(0
144c0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
144d0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74  0;.  }..  /* Out
144e0 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73  ermost loop runs
144f0 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f   for at most two
14500 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72   iterations. Fir
14510 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a  st iteration we.
14520 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64    ** try to find
14530 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e   memory that can
14540 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74   be released wit
14550 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79  hout calling fsy
14560 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a  nc(). Second.  *
14570 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69  * iteration (whi
14580 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20  ch only runs if 
14590 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64  the first failed
145a0 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79   to free nReq by
145b0 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f  tes of.  ** memo
145c0 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  ry) is permitted
145d0 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29   to call fsync()
145e0 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75  . This is of cou
145f0 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20  rse much more . 
14600 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20   ** expensive.. 
14610 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
14620 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20  <=1; i++){..    
14630 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
14640 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70  all the SQLite p
14650 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20  agers opened by 
14660 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
14670 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ad. */.    for(p
14680 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b  =pTsdro->pPager;
14690 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c   p && (nReq<0 ||
146a0 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
146b0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
146c0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
146d0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  .      int rc;..
146e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63        /* For eac
146f0 68 20 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20  h pager, try to 
14700 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67  free as many pag
14710 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28  es as possible (
14720 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a  without .      *
14730 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28  * calling fsync(
14740 29 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  ) if this is the
14750 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
14760 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
14770 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  t .      ** loop
14780 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
14790 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
147a0 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f  OK==(rc = pager_
147b0 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20 26 70  recycle(p, i, &p
147c0 50 67 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20  Pg)) && pPg) {. 
147d0 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20         /* We've 
147e0 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
147f0 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
14800 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
14810 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a   been .        *
14820 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
14830 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
14840 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
14850 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
14860 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73         ** (pFirs
14870 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20  tSynced). It is 
14880 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c  still in the all
14890 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69   pages (pAll) li
148a0 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  st. .        ** 
148b0 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  Remove it from t
148c0 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20  his list before 
148d0 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20  freeing..       
148e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
148f0 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
14900 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
14910 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
14920 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
14930 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
14940 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
14950 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
14960 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
14970 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
14980 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f  );.        page_
14990 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
149a0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
149b0 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e      if( pPg==p->
149c0 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
149d0 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67     p->pAll = pPg
149e0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
149f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14a00 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70       for( pTmp=p
14a10 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e  ->pAll; pTmp->pN
14a20 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d  extAll!=pPg; pTm
14a30 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p=pTmp->pNextAll
14a40 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70   ){}.          p
14a50 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  Tmp->pNextAll = 
14a60 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
14a70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14a80 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71   nReleased += sq
14a90 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50  liteAllocSize(pP
14aa0 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
14ab0 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
14ac0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
14ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14ae0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
14af0 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
14b00 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
14b10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14b20 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   or .        ** 
14b30 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72  journal in pager
14b40 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20  _recycle(). The 
14b50 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74  error is not ret
14b60 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20  urned to the .  
14b70 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
14b80 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
14b90 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
14ba0 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
14bb0 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
14bc0 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20     ** The error 
14bd0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
14be0 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72   to the user (or
14bf0 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63   users, in the c
14c00 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase .        ** 
14c10 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65  of a shared page
14c20 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20  r cache) of the 
14c30 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20  pager for which 
14c40 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65  the error occure
14c50 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
14c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
14c70 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
14c80 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  | rc==SQLITE_FUL
14c90 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  L );.        ass
14ca0 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50  ert( p->state>=P
14cb0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
14cc0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
14cd0 72 72 6f 72 28 70 2c 20 72 63 29 3b 0a 20 20 20  rror(p, rc);.   
14ce0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14cf0 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73    return nReleas
14d00 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ed;.}.#endif /* 
14d10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
14d20 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20  MORY_MANAGEMENT 
14d30 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  */../*.** Acquir
14d40 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
14d50 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
14d60 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
14d70 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
14d80 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
14d90 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
14da0 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
14db0 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
14dc0 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
14dd0 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  leased..**.** A 
14de0 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61  _get works for a
14df0 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
14e00 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
14e10 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
14e20 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
14e30 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
14e40 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
14e50 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
14e60 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
14e70 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
14e80 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
14e90 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
14ea0 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
14eb0 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
14ec0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
14ed0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
14ee0 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
14ef0 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
14f00 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
14f10 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
14f20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
14f30 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
14f40 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
14f50 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
14f60 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
14f70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
14f80 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
14f90 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
14fa0 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
14fb0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
14fc0 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29  e3pager_lookup()
14fd0 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
14fe0 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70  tine and _lookup
14ff0 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
15000 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
15010 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
15020 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
15030 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
15040 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
15050 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
15060 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
15070 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
15080 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a  reas _lookup().*
15090 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
150a0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
150b0 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
150c0 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
150d0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
150e0 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
150f0 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
15100 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
15110 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
15120 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b  ..** Since _look
15130 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
15140 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
15150 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
15160 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
15170 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
15180 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
15190 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50 61  r_get(Pager *pPa
151a0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
151b0 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a  void **ppPage){.
151c0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
151d0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
151e0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
151f0 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
15200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
15210 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
15220 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
15230 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
15240 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73   zero, is reques
15250 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
15260 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
15270 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c  GNO || pgno==0 |
15280 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
15290 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
152a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
152b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
152c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
152d0 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
152e0 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
152f0 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
15300 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15310 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
15320 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
15330 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
15340 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
15350 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
15360 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
15370 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
15380 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
15390 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
153a0 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
153b0 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
153c0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
153d0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
153e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
153f0 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20  ef==0 && !MEMDB 
15400 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
15410 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
15420 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
15430 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
15440 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
15450 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
15460 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15470 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15480 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
15490 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  er, rc);.      }
154a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
154b0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
154c0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
154d0 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
154e0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
154f0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
15500 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
15510 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
15520 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
15530 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
15540 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72    if( hasHotJour
15550 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  nal(pPager) ){. 
15560 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
15570 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
15580 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
15590 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
155a0 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
155b0 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
155c0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
155d0 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
155e0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
155f0 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58  the.       ** EX
15600 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
15610 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
15620 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
15630 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  open the.       
15640 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
15650 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
15660 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
15670 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
15680 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  e.       ** data
15690 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
156a0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
156b0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
156c0 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
156d0 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20      ** back..   
156e0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a      ** .       *
156f0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
15700 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
15710 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
15720 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
15730 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
15740 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
15750 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
15760 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
15770 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a  ail to.       **
15780 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e   obtain it's own
15790 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
157a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
157b0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  file..       */.
157c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
157d0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
157e0 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
157f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66  LOCK);.       if
15800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15810 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
15820 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
15830 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
15840 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
15850 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
15860 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
15870 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
15880 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
15890 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
158a0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
158b0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
158c0 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70  E;..       /* Op
158d0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
158e0 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e  or reading only.
158f0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
15900 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a  BUSY if.       *
15910 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  * we are unable 
15920 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
15930 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nal file. .     
15940 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54    **.       ** T
15950 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
15960 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
15970 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c   be locked itsel
15980 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a  f.  The.       *
15990 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
159a0 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
159b0 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
159c0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
159d0 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69  .       ** a wri
159e0 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72  te lock, so ther
159f0 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63  e is never any c
15a00 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20  hance of two or 
15a10 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70  more.       ** p
15a20 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67  rocesses opening
15a30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20   the journal at 
15a40 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
15a50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15a60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
15a70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65  enReadOnly(pPage
15a80 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50  r->zJournal, &pP
15a90 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
15aa0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15ab0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15ac0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
15ad0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
15ae0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
15af0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
15b00 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
15b10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15b20 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
15b30 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
15b40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
15b50 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   1;.       pPage
15b60 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
15b70 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  d = 0;.       pP
15b80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15b90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61   = 0;.       pPa
15ba0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
15bb0 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
15bc0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
15bd0 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c  0;..       /* Pl
15be0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
15bf0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
15c00 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
15c10 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a  e write.       *
15c20 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
15c30 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
15c40 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ck..       */.  
15c50 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
15c60 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
15c70 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
15c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15c90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
15ca0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
15cb0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d 0a  , rc);.       }.
15cc0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
15cd0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
15ce0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61  /* Search for pa
15cf0 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ge in cache */. 
15d00 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c     pPg = pager_l
15d10 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
15d20 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  no);.    if( MEM
15d30 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  DB && pPager->st
15d40 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
15d50 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
15d60 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
15d70 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
15d80 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
15d90 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
15da0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
15db0 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
15dc0 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
15dd0 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e  t h;.    TEST_IN
15de0 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
15df0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
15e00 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
15e10 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65  >mxPage || pPage
15e20 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20  r->pFirst==0 || 
15e30 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  MEMDB ){.      /
15e40 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
15e50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  age */.      pPg
15e60 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
15e70 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29  aw( sizeof(*pPg)
15e80 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
15e90 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ize.            
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
15ec0 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
15ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
15ef0 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67   MEMDB*sizeof(Pg
15f00 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20  History) );.    
15f10 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
15f20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15f30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15f40 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
15f50 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pPg, 0, sizeof
15f60 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69  (*pPg));.      i
15f70 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
15f80 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
15f90 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
15fa0 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66  ager), 0, sizeof
15fb0 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20  (PgHistory));.  
15fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
15fd0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
15fe0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
15ff0 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
16000 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67  pAll;.      pPag
16010 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
16020 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
16030 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
16040 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70   pPager->nPage>p
16050 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20  Pager->nMaxPage 
16060 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16070 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  t( pPager->nMaxP
16080 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50  age==(pPager->nP
16090 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  age-1) );.      
160a0 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61    pPager->nMaxPa
160b0 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ge++;.      }.  
160c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
160d0 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c  c = pager_recycl
160e0 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  e(pPager, 1, &pP
160f0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
16100 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16110 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16130 61 73 73 65 72 74 28 70 50 67 29 20 3b 0a 20 20  assert(pPg) ;.  
16140 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e    }.    pPg->pgn
16150 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66  o = pgno;.    if
16160 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
16170 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e  rnal && (int)pgn
16180 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  o<=pPager->origD
16190 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73  bSize ){.      s
161a0 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72  qlite3CheckMemor
161b0 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  y(pPager->aInJou
161c0 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20  rnal, pgno/8);. 
161d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
161e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
161f0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
16200 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
16210 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
16220 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
16230 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
16240 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
16250 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
16260 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
16270 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
16280 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
16290 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
162a0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
162b0 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
162c0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a  Pager->stmtSize.
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
162e0 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
162f0 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
16300 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a  pgno&7)))!=0 ){.
16310 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
16320 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
16330 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16340 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66     page_remove_f
16350 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  rom_stmt_list(pP
16360 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61  g);.    }.    ma
16370 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
16380 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
16390 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
163a0 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  );..    pPager->
163b0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nRef++;.    if( 
163c0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30  pPager->nExtra>0
163d0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
163e0 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
163f0 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
16400 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
16410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16420 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
16430 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16440 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
16450 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
16460 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67  .      rc = pPag
16470 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
16480 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16490 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75    }..    /* Popu
164a0 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77 69  late the page wi
164b0 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72 20  th data, either 
164c0 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  by reading from 
164d0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
164e0 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20   ** file, or by 
164f0 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69  setting the enti
16500 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e  re page to zero.
16510 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16520 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
16530 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3c 28  ecount(pPager)<(
16540 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44  int)pgno || MEMD
16550 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  B ){.      memse
16560 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
16570 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
16580 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
16590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
165a0 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
165b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
165c0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
165d0 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
165e0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
165f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
16600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16610 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
16620 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
16630 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
16640 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20  O_DATA(pPg),.   
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16660 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
16670 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
16680 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
16690 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E3("FETCH %d pag
166a0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
166b0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
166c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  gno);.      CODE
166d0 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C1(pPager, PGHDR
166e0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
166f0 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
16700 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16720 20 69 36 34 20 66 69 6c 65 53 69 7a 65 3b 0a 20   i64 fileSize;. 
16730 20 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d         int rc2 =
16740 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
16750 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
16760 66 69 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  fileSize);.     
16770 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
16780 54 45 5f 4f 4b 20 7c 7c 20 66 69 6c 65 53 69 7a  TE_OK || fileSiz
16790 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72 2d 3e  e>=pgno*pPager->
167a0 70 61 67 65 53 69 7a 65 20 29 7b 0a 09 20 20 2f  pageSize ){..  /
167b0 2a 20 41 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  * An IO error oc
167c0 63 75 72 65 64 20 69 6e 20 6f 6e 65 20 6f 66 20  cured in one of 
167d0 74 68 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  the the sqlite3O
167e0 73 53 65 65 6b 28 29 20 6f 72 0a 20 20 20 20 20  sSeek() or.     
167f0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f       ** sqlite3O
16800 73 52 65 61 64 28 29 20 63 61 6c 6c 73 20 61 62  sRead() calls ab
16810 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ove. */.        
16820 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
16830 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16840 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
16850 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
16870 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
16880 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16890 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64   clear_simulated
168a0 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20  _io_error();.   
168b0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
168c0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
168d0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
168e0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
168f0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
16900 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52         TEST_INCR
16910 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
16920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
16930 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20      /* Link the 
16940 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
16950 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  ge hash table */
16960 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68  .    h = pager_h
16970 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ash(pgno);.    p
16980 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
16990 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
169a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
169b0 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
169c0 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
169d0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
169e0 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
169f0 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
16a00 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
16a10 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
16a20 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
16a30 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
16a40 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
16a50 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
16a60 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
16a70 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
16a80 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
16a90 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
16aa0 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20   is in the page 
16ab0 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45  cache. */.    TE
16ac0 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
16ad0 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f  nHit);.    page_
16ae0 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
16af0 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f  *ppPage = PGHDR_
16b00 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
16b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16b20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
16b30 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
16b40 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
16b50 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
16b60 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
16b70 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
16b80 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
16b90 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
16ba0 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
16bb0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16bc0 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
16bd0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
16be0 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54  3pager_get().  T
16bf0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
16c00 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
16c10 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
16c20 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20  3pager_get() is 
16c30 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
16c40 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
16c50 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
16c60 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
16c70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
16c80 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
16c90 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
16ca0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
16cb0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
16cc0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
16cd0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
16ce0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
16cf0 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
16d00 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75  lite3pager_looku
16d10 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
16d20 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
16d30 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
16d40 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
16d50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
16d60 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  o!=0 );.  if( pP
16d70 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
16d80 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
16d90 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
16da0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16db0 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
16dc0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16dd0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
16de0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16df0 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
16e00 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
16e10 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
16e20 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
16e30 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
16e40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
16e50 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
16e60 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
16e70 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
16e80 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
16e90 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
16ea0 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
16eb0 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
16ec0 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
16ed0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
16ee0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
16ef0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16f00 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
16f10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
16f20 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70  er_unref(void *p
16f30 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
16f40 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65  pPg;..  /* Decre
16f50 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
16f60 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  ce count for thi
16f70 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50  s page.  */.  pP
16f80 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
16f90 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  R(pData);.  asse
16fa0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
16fb0 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
16fc0 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
16fd0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
16fe0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
16ff0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
17000 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
17010 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
17020 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
17030 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
17040 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
17050 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
17060 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
17070 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
17080 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
17090 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
170a0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
170b0 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
170c0 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
170d0 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
170e0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
170f0 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
17100 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
17110 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
17120 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
17130 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
17140 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
17150 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
17160 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
17170 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70  needSync==0 && p
17180 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
17190 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ced==0 ){.      
171a0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
171b0 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20  nced = pPg;.    
171c0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
171d0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
171e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
171f0 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
17200 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17210 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
17220 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
17230 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
17240 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
17250 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
17260 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
17270 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
17280 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
17290 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
172a0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
172b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
172c0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
172d0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
172e0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
172f0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
17300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
17320 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
17330 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
17340 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
17350 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
17360 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
17370 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17380 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
17390 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
173a0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
173b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
173c0 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
173d0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
173e0 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
173f0 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
17400 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
17410 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
17420 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
17430 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
17440 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
17450 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
17460 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
17470 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
17480 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
17490 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
174a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
174b0 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
174c0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
174d0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
174e0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
174f0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
17500 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
17510 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  unt(pPager);.  p
17520 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
17530 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
17540 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
17550 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
17560 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
17570 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  al==0 ){.    rc 
17580 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
17590 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
175a0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
175b0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
175c0 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
175d0 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ve(pPager->zJour
175e0 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
175f0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
17600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17610 20 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70      pPager->temp
17620 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  File);.  pPager-
17630 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
17640 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
17650 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
17660 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
17670 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
17680 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
17690 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
176a0 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
176b0 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
176c0 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  llSync(pPager->j
176d0 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
176e0 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  _fsync);.  sqlit
176f0 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
17700 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
17710 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
17720 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  .  sqlite3OsOpen
17730 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72  Directory(pPager
17740 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  ->jfd, pPager->z
17750 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50  Directory);.  pP
17760 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17770 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
17780 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
17790 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
177a0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
177b0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
177c0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
177d0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
177e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
177f0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
17800 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17810 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
17820 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
17830 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
17840 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
17850 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
17860 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
17870 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
17880 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17890 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
178a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
178b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
178c0 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28  ager_stmt_begin(
178d0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
178e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
178f0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
17900 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
17910 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
17920 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
17930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17940 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
17950 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
17960 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17970 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
17980 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
17990 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
179a0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
179b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
179c0 6e 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  nal = 0;.  if( r
179d0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
179e0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
179f0 73 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29  s was a malloc()
17a00 20 66 61 69 6c 75 72 65 2c 20 74 68 65 6e 20 77   failure, then w
17a10 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c  e will not be cl
17a20 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65 72 0a  osing the pager.
17a30 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20      ** file. So 
17a40 64 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e  delete any journ
17a50 61 6c 20 66 69 6c 65 20 77 65 20 6d 61 79 20 68  al file we may h
17a60 61 76 65 20 6a 75 73 74 20 63 72 65 61 74 65 64  ave just created
17a70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
17a80 20 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 20 77   ** the system w
17a90 69 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73 65 64  ill get confused
17aa0 2c 20 77 65 20 68 61 76 65 20 61 20 72 65 61 64  , we have a read
17ab0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c  -lock on the fil
17ac0 65 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d  e and a.    ** m
17ad0 79 73 74 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61  ysterious journa
17ae0 6c 20 68 61 73 20 61 70 70 65 61 72 65 64 20 69  l has appeared i
17af0 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
17b00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
17b10 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
17b20 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
17b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
17b40 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
17b50 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
17b60 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
17b70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
17b80 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  OCK;.  }.  retur
17b90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
17ba0 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
17bb0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
17bc0 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
17bd0 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
17be0 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
17bf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
17c00 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
17c10 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
17c20 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  t() is called..*
17c30 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
17c40 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69  ger_rollback() i
17c50 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
17c60 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63    sqlite3pager_c
17c70 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
17c80 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
17c90 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69  3pager_unref() i
17ca0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
17cb0 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
17cc0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
17cd0 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
17ce0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
17cf0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
17d00 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f   any open page o
17d10 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
17d20 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67  e file.  Nothing
17d30 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74   changes about t
17d40 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20  he page - it is 
17d50 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a  used merely to.*
17d60 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e  * acquire a poin
17d70 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
17d80 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
17d90 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65  s proof that the
17da0 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  re is.** already
17db0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
17dc0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
17dd0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70  .** The second p
17de0 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
17df0 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  es how much spac
17e00 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  e in bytes to re
17e10 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d  serve for a.** m
17e20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17e30 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73  le-name at the s
17e40 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
17e50 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63  nal when it is c
17e60 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  reated..**.** A 
17e70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
17e80 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
17e90 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
17ea0 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d  y file.  For tem
17eb0 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c  porary.** files,
17ec0 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
17ed0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
17ee0 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
17ef0 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  il there is an.*
17f00 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  * actual need to
17f10 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
17f20 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
17f30 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
17f40 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64  already reserved
17f50 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68   for writing, th
17f60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
17f70 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
17f80 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
17f90 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74  go ahead and get
17fa0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
17fb0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ck on the file.*
17fc0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e  * immediately in
17fd0 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67  stead of waiting
17fe0 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f   until we try to
17ff0 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
18000 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67  .  The.** exFlag
18010 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61   is ignored if a
18020 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
18030 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
18040 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
18050 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a  ger_begin(void *
18060 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46 6c 61  pData, int exFla
18070 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
18080 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
18090 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
180a0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
180b0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
180c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
180d0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
180e0 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
180f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
18100 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
18110 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
18120 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
18130 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
18140 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
18150 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
18160 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
18170 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
18180 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
18190 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
181a0 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
181b0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
181c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
181d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
181e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
181f0 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
18200 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18220 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
18230 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
18240 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
18250 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
18260 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
18270 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
18280 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
18290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
182a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
182b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
182c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
182d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
182e0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
182f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  e = 0;.      TRA
18300 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE2("TRANSACTION
18310 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18320 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
18330 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  if( pPager->useJ
18340 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65  ournal && !pPage
18350 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
18360 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
18370 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
18380 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
18390 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
183a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
183b0 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74  Make a page dirt
183c0 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74  y.  Set its dirt
183d0 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69  y flag and add i
183e0 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a  t to the dirty.*
183f0 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  * page list..*/.
18400 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
18410 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67  Dirty(PgHdr *pPg
18420 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
18430 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  rty==0 ){.    Pa
18440 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
18450 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
18460 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
18470 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
18480 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
18490 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
184a0 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
184b0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d   pPager->pDirty-
184c0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
184d0 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  g;.    }.    pPg
184e0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30  ->pPrevDirty = 0
184f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  ;.    pPager->pD
18500 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  irty = pPg;.  }.
18510 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
18520 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65  page clean.  Cle
18530 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74  ar its dirty bit
18540 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66   and remove it f
18550 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  rom the.** dirty
18560 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
18570 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
18580 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29  lean(PgHdr *pPg)
18590 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
185a0 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64  ty ){.    pPg->d
185b0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
185c0 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b  ( pPg->pDirty ){
185d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72  .      pPg->pDir
185e0 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
185f0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
18600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18610 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
18620 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
18630 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79  revDirty->pDirty
18640 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
18650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18660 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44   pPg->pPager->pD
18670 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
18680 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ty;.    }.  }.}.
18690 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
186a0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
186b0 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
186c0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
186d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
186e0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
186f0 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
18700 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
18710 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
18720 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
18730 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
18740 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
18750 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
18760 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
18770 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
18780 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
18790 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
187a0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
187b0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
187c0 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
187d0 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
187e0 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
187f0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
18800 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
18810 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
18820 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
18830 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
18840 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
18850 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
18860 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
18870 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
18880 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
18890 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
188a0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
188b0 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
188c0 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
188d0 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
188e0 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
188f0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
18900 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
18910 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
18920 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
18930 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
18940 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
18950 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
18960 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
18970 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
18980 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  o sqlite3pager_c
18990 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
189a0 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
189b0 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
189c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
189d0 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a  ger_write(void *
189e0 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
189f0 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
18a00 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
18a10 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
18a20 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
18a30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18a40 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
18a50 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
18a60 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
18a70 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
18a80 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
18a90 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
18aa0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
18ab0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
18ac0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
18ad0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
18ae0 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
18af0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
18b00 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
18b10 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
18b20 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
18b30 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
18b40 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
18b50 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
18b60 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
18b70 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
18b80 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
18b90 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
18ba0 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69  urnal && (pPg->i
18bb0 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d  nStmt || pPager-
18bc0 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
18bd0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
18be0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
18bf0 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
18c00 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
18c10 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
18c20 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
18c30 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
18c40 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
18c50 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
18c60 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
18c70 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
18c80 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
18c90 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
18ca0 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
18cb0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18cc0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
18cd0 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
18ce0 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
18cf0 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
18d00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
18d10 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
18d20 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
18d30 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
18d40 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 20  n(pData, 0);.   
18d50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18d60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
18d70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
18d80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18d90 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
18da0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
18db0 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
18dc0 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
18dd0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
18de0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
18df0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
18e00 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
18e10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18e30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
18e40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
18e50 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73  n || !pPager->us
18e60 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
18e70 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
18e80 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  he = 1;.  .    /
18e90 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
18ea0 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
18eb0 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
18ec0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
18ed0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
18ee0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
18ef0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
18f00 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
18f10 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
18f20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
18f30 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
18f40 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
18f50 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
18f60 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e      if( !pPg->in
18f70 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
18f80 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
18f90 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20  | MEMDB) ){.    
18fa0 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
18fb0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
18fc0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
18fd0 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a        int szPg;.
18fe0 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44          if( MEMD
18ff0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  B ){.          P
19000 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
19010 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
19020 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
19030 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
19040 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
19050 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
19060 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
19070 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  o);.          as
19080 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72  sert( pHist->pOr
19090 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ig==0 );.       
190a0 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20     pHist->pOrig 
190b0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
190c0 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  w( pPager->pageS
190d0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
190e0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
190f0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
19100 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
19110 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Orig, PGHDR_TO_D
19120 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
19130 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
19140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19160 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76    u32 cksum, sav
19170 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ed;.          ch
19180 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e  ar *pData2, *pEn
19190 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;.          /* 
191a0 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
191b0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
191c0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
191d0 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
191e0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
191f0 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
19200 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
19210 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
19220 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
19230 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
19240 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
19250 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
19260 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
19270 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  er) );.         
19280 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32   pData2 = CODEC2
19290 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
192a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
192b0 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
192c0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
192d0 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
192e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e  );.          pEn
192f0 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61  d = pData2 + pPa
19300 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
19310 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20           pData2 
19320 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  -= 4;.          
19330 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70  saved = *(u32*)p
19340 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70  End;.          p
19350 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63  ut32bits(pEnd, c
19360 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
19370 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e   szPg = pPager->
19380 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20  pageSize+8;.    
19390 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
193a0 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e  pData2, pPg->pgn
193b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
193c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
193d0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
193e0 44 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20  Data2, szPg);.  
193f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19400 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a  journalOff += sz
19410 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  Pg;.          TR
19420 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE4("JOURNAL %d
19430 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
19440 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
19450 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
19460 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
19470 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
19480 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
19490 20 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73   *(u32*)pEnd = s
194a0 61 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20  aved;...  /* An 
194b0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
194c0 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
194d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
194e0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  he .          **
194f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
19500 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
19510 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
19520 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ove..          *
19530 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
19540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19550 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
19560 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
19570 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
19580 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
19590 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
195a0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
195b0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
195c0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
195d0 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
195e0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
195f0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
19600 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
19610 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
19620 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nc;.          if
19630 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
19640 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Use ){.         
19650 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
19660 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
19670 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
19680 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &7);.           
19690 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
196a0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
196b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
196c0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
196d0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
196e0 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
196f0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
19700 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
19710 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  nc;.        TRAC
19720 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E4("APPEND %d pa
19730 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
19740 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
19750 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
19760 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
19770 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
19780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19790 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
197a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  c ){.        pPa
197b0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
197c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
197d0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
197e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 1;.    }.  .  
197f0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
19800 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
19810 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
19820 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
19830 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
19840 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
19850 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
19860 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
19870 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
19880 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
19890 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
198a0 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
198b0 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
198c0 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
198d0 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
198e0 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
198f0 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
19900 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
19910 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
19920 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
19930 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
19940 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
19950 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19960 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
19970 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
19980 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
19990 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  bSize );.      i
199a0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
199b0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
199c0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
199d0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
199e0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
199f0 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
19a00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  =0 );.        pH
19a10 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c  ist->pStmt = sql
19a20 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
19a30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
19a40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
19a50 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
19a60 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
19a70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48  Hist->pStmt, PGH
19a80 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
19a90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19aa0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
19ab0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54        TRACE3("ST
19ac0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
19ad0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
19ae0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
19af0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pgno);.      }el
19b00 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
19b10 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43   *pData2 = CODEC
19b20 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
19b30 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34   pPg->pgno, 7)-4
19b40 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
19b50 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d  its(pData2, pPg-
19b60 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
19b70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19b80 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ite(pPager->stfd
19b90 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
19ba0 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20  ->pageSize+4);. 
19bb0 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53         TRACE3("S
19bc0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
19bd0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
19be0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
19bf0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
19c00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19c10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
19c20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19c30 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
19c40 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
19c50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19c60 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
19c70 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
19c80 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
19c90 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
19ca0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
19cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
19cc0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
19cd0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
19ce0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
19cf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
19d00 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
19d10 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
19d20 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50  ->dbSize<(int)pP
19d30 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
19d40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
19d50 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  pPg->pgno;.    i
19d60 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
19d70 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
19d80 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
19d90 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
19da0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
19db0 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
19dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19dd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
19de0 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
19df0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
19e00 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
19e10 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
19e20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
19e30 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
19e40 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
19e50 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
19e60 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
19e70 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
19e80 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
19e90 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
19ea0 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
19eb0 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
19ec0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
19ed0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
19ee0 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
19ef0 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65  pPg->dirty;.}.#e
19f00 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
19f10 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
19f20 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
19f30 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
19f40 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
19f50 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
19f60 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
19f70 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
19f80 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  t sqlite3pager_o
19f90 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
19fa0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
19fb0 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
19fc0 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a  .  void *pPage;.
19fd0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
19fe0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
19ff0 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
1a000 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
1a010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a030 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1a040 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
1a050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a060 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
1a070 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
1a080 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1a090 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
1a0a0 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
1a0b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a0c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1a0d0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1a0e0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1a0f0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
1a100 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1a110 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
1a120 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
1a130 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63   page "pgno" bac
1a140 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
1a150 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
1a160 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
1a170 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
1a180 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
1a190 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
1a1a0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
1a1b0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
1a1c0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
1a1d0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1a1e0 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
1a1f0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
1a200 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
1a210 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
1a220 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
1a230 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
1a240 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
1a250 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
1a260 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
1a270 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
1a280 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
1a290 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
1a2a0 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
1a2b0 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
1a2c0 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
1a2d0 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
1a2e0 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
1a2f0 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
1a300 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1a310 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1a320 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
1a330 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
1a340 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
1a350 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
1a360 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
1a370 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
1a380 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
1a390 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
1a3a0 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
1a3b0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1a3c0 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
1a3d0 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
1a3e0 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
1a3f0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1a400 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
1a410 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
1a420 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
1a430 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1a440 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
1a450 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
1a460 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
1a470 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
1a480 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
1a490 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
1a4a0 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
1a4b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1a4c0 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
1a4d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1a4e0 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
1a4f0 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
1a500 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
1a510 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
1a520 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f  ause the page co
1a530 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63  ntains.** critic
1a540 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
1a550 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
1a560 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64  e it gets rolled
1a570 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a   back in spite.*
1a580 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f  * of the dont_ro
1a590 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
1a5a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1a5b0 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50  ger_dont_write(P
1a5c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1a5d0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
1a5e0 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d  r *pPg;..  if( M
1a5f0 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a  EMDB ) return;..
1a600 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
1a610 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1a620 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
1a630 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 6e  g!=0 );  /* We n
1a640 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f  ever call _dont_
1a650 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68 65  write unless the
1a660 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d 20   page is in mem 
1a670 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  */.  pPg->always
1a680 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
1a690 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26  if( pPg->dirty &
1a6a0 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  & !pPager->stmtI
1a6b0 6e 55 73 65 20 29 7b 0a 20 20 20 20 69 66 28 20  nUse ){.    if( 
1a6c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1a6d0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
1a6e0 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
1a6f0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
1a700 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1a710 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
1a720 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1a730 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
1a740 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
1a750 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
1a760 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
1a770 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1a780 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
1a790 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
1a7a0 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
1a7b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
1a7c0 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
1a7d0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1a7e0 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
1a7f0 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
1a800 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
1a810 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
1a820 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
1a830 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
1a840 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
1a850 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
1a860 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
1a870 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
1a880 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
1a890 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
1a8a0 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
1a8b0 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
1a8c0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1a8d0 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
1a8e0 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
1a8f0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1a900 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a910 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57    TRACE3("DONT_W
1a920 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
1a930 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47  %d\n", pgno, PAG
1a940 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1a950 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
1a960 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
1a970 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1a980 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
1a990 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1a9a0 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
1a9b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1a9c0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1a9d0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1a9e0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1a9f0 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
1aa00 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
1aa10 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
1aa20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1aa30 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1aa40 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
1aa50 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1aa60 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
1aa70 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
1aa80 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
1aa90 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
1aaa0 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nal..*/.void sql
1aab0 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
1aac0 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44  ollback(void *pD
1aad0 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
1aae0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1aaf0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
1ab00 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1ab10 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28  ->pPager;..  if(
1ab20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1ab30 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1ab40 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1ab50 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75  alOpen==0 ) retu
1ab60 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61  rn;.  if( pPg->a
1ab70 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1ab80 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1ab90 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42  ollback || MEMDB
1aba0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1abb0 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
1abc0 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1abd0 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1abe0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1abf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ac00 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
1ac10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1ac20 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
1ac30 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1ac40 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50  >pgno&7);.    pP
1ac50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1ac60 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1ac70 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1ac80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1ac90 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
1aca0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1acb0 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67  no&7);.      pag
1acc0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
1acd0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
1ace0 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
1acf0 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64  ROLLBACK page %d
1ad00 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
1ad10 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
1ad20 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66  ager));.  }.  if
1ad30 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1ad40 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53  Use && !pPg->inS
1ad50 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  tmt && (int)pPg-
1ad60 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
1ad70 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  tmtSize ){.    a
1ad80 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1ad90 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
1ada0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1adb0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
1adc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1add0 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
1ade0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1adf0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1ae00 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1ae10 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61  o&7);.    page_a
1ae20 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1ae30 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  pPg);.  }.}.../*
1ae40 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
1ae50 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1ae60 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
1ae70 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1ae80 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
1ae90 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
1aea0 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
1aeb0 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
1aec0 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
1aed0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1aee0 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
1aef0 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
1af00 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
1af10 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
1af20 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
1af30 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
1af40 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1af50 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1af60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1af70 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
1af80 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1af90 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
1afa0 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
1afb0 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
1afc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1afd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41  ERROR;.  }.  TRA
1afe0 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
1aff0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1b000 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
1b010 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61   ){.    pPg = pa
1b020 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1b030 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
1b040 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
1b050 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69  ){.      clearHi
1b060 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
1b070 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1b080 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
1b090 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
1b0a0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1b0b0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
1b0c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1b0d0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1b0e0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
1b0f0 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
1b100 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
1b110 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
1b120 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
1b130 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1b140 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  = 0;.#ifndef NDE
1b150 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  BUG.    for(pPg=
1b160 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
1b170 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
1b180 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
1b190 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1b1a0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1b1b0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1b1c0 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
1b1d0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
1b1e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b1f0 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
1b200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1b210 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
1b220 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1b230 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
1b240 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1b250 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
1b260 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
1b270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1b280 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69    if( pPager->di
1b290 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20  rtyCache==0 ){. 
1b2a0 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79     /* Exit early
1b2b0 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20   (without doing 
1b2c0 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69  the time-consumi
1b2d0 6e 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63  ng sqlite3OsSync
1b2e0 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a  () calls).    **
1b2f0 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62   if there have b
1b300 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
1b310 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b320 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
1b330 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
1b340 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Sync==0 );.    r
1b350 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
1b360 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
1b370 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1b380 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75  e = -1;.    retu
1b390 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1b3a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1b3b0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
1b3c0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1b3d0 73 79 6e 63 28 70 50 61 67 65 72 2c 20 30 2c 20  sync(pPager, 0, 
1b3e0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1b3f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1b400 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
1b410 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
1b420 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1b430 65 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  e = -1;.  }.  re
1b440 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b450 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
1b460 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
1b470 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
1b480 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1b490 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
1b4a0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
1b4b0 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
1b4c0 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
1b4d0 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
1b4e0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
1b4f0 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
1b500 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
1b510 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
1b520 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
1b530 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
1b540 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
1b550 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
1b560 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   (SQLITE_PROTOCO
1b570 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  L) or unless som
1b580 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
1b590 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
1b5a0 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
1b5b0 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
1b5c0 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
1b5d0 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
1b5e0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
1b5f0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
1b600 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
1b610 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
1b620 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
1b630 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
1b640 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
1b650 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1b660 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
1b670 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
1b680 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1b690 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1b6a0 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43   TRACE2("ROLLBAC
1b6b0 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
1b6c0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1b6d0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67   MEMDB ){.    Pg
1b6e0 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
1b6f0 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
1b700 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
1b710 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
1b720 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
1b730 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77   assert( !p->alw
1b740 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
1b750 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72       if( !p->dir
1b760 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
1b770 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
1b780 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
1b790 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
1b7a0 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  pOrig );.       
1b7b0 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
1b7c0 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
1b7d0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
1b7e0 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  )->pStmt );.    
1b7f0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1b800 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69      }..      pHi
1b810 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1b820 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
1b830 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
1b840 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
1b850 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
1b860 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
1b870 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
1b880 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1b890 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42     TRACE3("ROLLB
1b8a0 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25  ACK-PAGE %d of %
1b8b0 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50  d\n", p->pgno, P
1b8c0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1b8d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b8e0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 50 41        TRACE3("PA
1b8f0 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f  GE %d is clean o
1b900 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  n %d\n", p->pgno
1b910 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b920 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1b930 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70    clearHistory(p
1b940 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Hist);.      p->
1b950 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
1b960 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20   p->inJournal = 
1b970 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74  0;.      p->inSt
1b980 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  mt = 0;.      p-
1b990 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e  >pPrevStmt = p->
1b9a0 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
1b9b0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1b9c0 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
1b9d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
1b9e0 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f  einiter(PGHDR_TO
1b9f0 5f 44 41 54 41 28 70 29 2c 20 70 50 61 67 65 72  _DATA(p), pPager
1ba00 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1ba10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1ba20 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1ba30 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1ba40 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
1ba50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1ba60 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1ba70 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
1ba80 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
1ba90 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
1baa0 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
1bab0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1bac0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
1bad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bae0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
1baf0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1bb00 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
1bb10 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
1bb20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
1bb30 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1bb40 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1bb50 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ze = -1;.    ret
1bb60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
1bb70 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1bb80 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
1bb90 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
1bba0 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
1bbb0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1bbc0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
1bbd0 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
1bbe0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1bbf0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
1bc00 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1bc10 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1bc20 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
1bc30 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
1bc40 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
1bc50 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
1bc60 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
1bc70 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77   rc2 = pager_unw
1bc80 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
1bc90 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1bca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bcb0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
1bcc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1bcd0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1bce0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
1bcf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1bd00 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  = -1;..  /* If a
1bd10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
1bd20 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
1bd30 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
1bd40 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
1bd50 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  er.  ** cache. S
1bd60 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
1bd70 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
1bd80 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
1bd90 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73  error .  ** pers
1bda0 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72  istent..  */.  r
1bdb0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1bdc0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
1bdd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1bde0 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
1bdf0 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
1be00 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
1be10 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
1be20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1be30 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
1be40 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  itable..*/.int s
1be50 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72 65  qlite3pager_isre
1be60 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
1be70 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1be80 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
1be90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1bea0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1beb0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
1bec0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
1bed0 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61  /.int *sqlite3pa
1bee0 67 65 72 5f 73 74 61 74 73 28 50 61 67 65 72 20  ger_stats(Pager 
1bef0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
1bf00 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
1bf10 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[0] = pPager->n
1bf20 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50  Ref;.  a[1] = pP
1bf30 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61  ager->nPage;.  a
1bf40 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78  [2] = pPager->mx
1bf50 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  Page;.  a[3] = p
1bf60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1bf70 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
1bf80 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
1bf90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1bfa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1bfb0 45 53 54 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  EST.  a[6] = pPa
1bfc0 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
1bfd0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
1bfe0 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67  s;.  a[8] = pPag
1bff0 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39  er->nOvfl;.  a[9
1c000 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61  ] = pPager->nRea
1c010 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61  d;.  a[10] = pPa
1c020 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 23 65 6e  ger->nWrite;.#en
1c030 64 69 66 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a  dif.  return a;.
1c040 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1c050 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62   statement rollb
1c060 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a  ack point..**.**
1c070 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
1c080 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
1c090 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74  ith the transact
1c0a0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65  ion journal alre
1c0b0 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20  ady.** open.  A 
1c0c0 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  new statement jo
1c0d0 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64  urnal is created
1c0e0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1c0f0 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  d to rollback.**
1c100 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69   changes of a si
1c110 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  ngle SQL command
1c120 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72   within a larger
1c130 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
1c140 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1c150 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67  r_stmt_begin(Pag
1c160 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1c170 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54  nt rc;.  char zT
1c180 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  emp[SQLITE_TEMPN
1c190 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73  AME_SIZE];.  ass
1c1a0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74  ert( !pPager->st
1c1b0 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73  mtInUse );.  ass
1c1c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
1c1d0 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43  ize>=0 );.  TRAC
1c1e0 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25  E2("STMT-BEGIN %
1c1f0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1c200 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
1c210 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
1c220 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
1c230 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1c240 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
1c250 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74  >dbSize;.    ret
1c260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c270 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
1c280 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
1c290 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1c2a0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20  tAutoopen = 1;. 
1c2b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c2c0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
1c2d0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1c2e0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67  alOpen );.  pPag
1c2f0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71  er->aInStmt = sq
1c300 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
1c310 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
1c320 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1c330 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a  ->aInStmt==0 ){.
1c340 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
1c350 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
1c360 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a   SHARED_LOCK); *
1c370 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1c380 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
1c390 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1c3a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1c3b0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1c3c0 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d  fd, &pPager->stm
1c3d0 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
1c3e0 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
1c3f0 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73  gin_failed;.  as
1c400 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1c410 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65  mtJSize == pPage
1c420 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
1c430 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72  .#endif.  pPager
1c440 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50  ->stmtJSize = pP
1c450 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c460 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
1c470 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1c480 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  bSize;.  pPager-
1c490 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b  >stmtHdrOff = 0;
1c4a0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43  .  pPager->stmtC
1c4b0 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
1c4c0 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20  ksumInit;.  if( 
1c4d0 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65  !pPager->stmtOpe
1c4e0 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
1c4f0 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
1c500 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67  emp(zTemp, &pPag
1c510 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69  er->stfd);.    i
1c520 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
1c530 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
1c540 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1c550 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
1c560 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
1c570 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
1c580 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
1c590 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c5a0 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
1c5b0 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
1c5c0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1c5d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
1c5e0 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  e(pPager->aInStm
1c5f0 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
1c600 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  aInStmt = 0;.  }
1c610 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c620 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
1c630 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
1c640 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
1c650 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  tmt_commit(Pager
1c660 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
1c670 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1c680 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  se ){.    PgHdr 
1c690 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
1c6a0 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43    TRACE2("STMT-C
1c6b0 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
1c6c0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1c6d0 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
1c6e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
1c6f0 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66  Seek(pPager->stf
1c700 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20  d, 0);.      /* 
1c710 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
1c720 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
1c730 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  0); */.      sql
1c740 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d  iteFree( pPager-
1c750 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  >aInStmt );.    
1c760 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1c770 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
1c780 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
1c790 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
1c7a0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70  =pNext){.      p
1c7b0 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
1c7c0 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73  tStmt;.      ass
1c7d0 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74  ert( pPg->inStmt
1c7e0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
1c7f0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
1c800 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
1c810 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
1c820 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1c830 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1c840 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1c850 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1c860 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1c870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
1c880 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
1c890 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
1c8a0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1c8b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
1c8c0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
1c8d0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1c8e0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
1c8f0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
1c900 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
1c910 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
1c920 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
1c930 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1c940 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74  ** Rollback a st
1c950 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
1c960 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1c970 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  t_rollback(Pager
1c980 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1c990 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
1c9a0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1c9b0 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
1c9c0 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  -ROLLBACK %d\n",
1c9d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c9e0 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
1c9f0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
1ca00 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  *pPg;.      for(
1ca10 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
1ca20 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  t; pPg; pPg=pPg-
1ca30 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
1ca40 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1ca50 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1ca60 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1ca70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
1ca80 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
1ca90 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1caa0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1cab0 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d  Pg), pHist->pStm
1cac0 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t, pPager->pageS
1cad0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
1cae0 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
1caf0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
1cb00 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1cb10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1cb20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1cb30 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1cb40 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
1cb50 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  .      memoryTru
1cb60 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
1cb70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cb80 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1cb90 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1cba0 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
1cbb0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1cbc0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
1cbd0 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65  tmt_commit(pPage
1cbe0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1cbf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cc00 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
1cc10 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
1cc20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cc30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1cc40 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
1cc50 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1cc60 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
1cc70 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
1cc80 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  r_filename(Pager
1cc90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1cca0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
1ccb0 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
1ccc0 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
1ccd0 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
1cce0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
1ccf0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1cd00 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50  3pager_dirname(P
1cd10 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1cd20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1cd30 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
1cd40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1cd50 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
1cd60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1cd70 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
1cd80 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a   *sqlite3pager_j
1cd90 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
1cda0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1cdb0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
1cdc0 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rnal;.}../*.** R
1cdd0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73  eturn true if fs
1cde0 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20  ync() calls are 
1cdf0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69  disabled for thi
1ce00 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  s pager.  Return
1ce10 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79   FALSE.** if fsy
1ce20 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74  nc()s are execut
1ce30 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a  ed normally..*/.
1ce40 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1ce50 5f 6e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  _nosync(Pager *p
1ce60 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1ce70 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
1ce80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1ce90 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73  e codec for this
1cea0 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73   pager.*/.void s
1ceb0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
1cec0 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  codec(.  Pager *
1ced0 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
1cee0 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
1cef0 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
1cf00 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
1cf10 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
1cf20 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
1cf30 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
1cf40 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
1cf50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1cf60 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1cf70 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
1cf80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cf90 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
1cfa0 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
1cfb0 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
1cfc0 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
1cfd0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
1cfe0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1cff0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1d000 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
1d010 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
1d020 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1d030 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nter;.  int rc;.
1d040 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20  .  /* Open page 
1d050 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1d060 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1d070 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1d080 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c  r_get(pPager, 1,
1d090 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
1d0a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1d0b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
1d0c0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1d0d0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69  rite(pPage);.  i
1d0e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d0f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
1d100 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72   /* Read the cur
1d110 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79  rent value at by
1d120 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48  te 24. */.  pPgH
1d130 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  dr = DATA_TO_PGH
1d140 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61  DR(pPage);.  cha
1d150 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65  nge_counter = re
1d160 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
1d170 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20  Hdr, 24);..  /* 
1d180 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1d190 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1d1a0 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1d1b0 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1d1c0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
1d1d0 2b 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  +;.  put32bits((
1d1e0 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f  (char*)PGHDR_TO_
1d1f0 44 41 54 41 28 70 50 67 48 64 72 29 29 2b 32 34  DATA(pPgHdr))+24
1d200 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1d210 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
1d220 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
1d230 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nce. */.  sqlite
1d240 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
1d250 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ge);.  return SQ
1d260 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1d270 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
1d280 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1d290 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
1d2a0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1d2b0 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
1d2c0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1d2d0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1d2e0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1d2f0 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
1d300 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1d310 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
1d320 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
1d330 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
1d340 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
1d350 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
1d360 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1d370 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
1d380 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
1d390 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1d3a0 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
1d3b0 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
1d3c0 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
1d3d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1d3e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d3f0 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
1d400 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
1d410 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
1d420 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1d430 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
1d440 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d450 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
1d460 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
1d470 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
1d480 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
1d490 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
1d4a0 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
1d4b0 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
1d4c0 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
1d4d0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67  to an sqlite3pag
1d4e0 65 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a  er_sync() call..
1d4f0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1d500 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
1d510 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
1d520 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
1d530 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
1d540 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
1d550 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
1d560 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1d570 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
1d580 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67  e3pager_sync(Pag
1d590 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
1d5a0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
1d5b0 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20   Pgno nTrunc){. 
1d5c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d5d0 5f 4f 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28 22  _OK;..  TRACE4("
1d5e0 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
1d5f0 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
1d600 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20  s nTrunc=%d\n", 
1d610 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
1d620 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
1d630 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f  r, nTrunc);..  /
1d640 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1d650 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
1d660 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
1d670 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
1d680 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
1d690 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
1d6a0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
1d6b0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
1d6c0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1d6d0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
1d6e0 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26  NCED && !MEMDB &
1d6f0 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  & pPager->dirtyC
1d700 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64  ache ){.    PgHd
1d710 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65  r *pPg;.    asse
1d720 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1d730 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
1d740 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
1d750 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1d760 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1d770 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1d780 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
1d790 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
1d7a0 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
1d7b0 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1d7c0 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
1d7d0 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
1d7e0 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
1d7f0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
1d800 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
1d810 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
1d820 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
1d830 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
1d840 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
1d850 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
1d860 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
1d870 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
1d880 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1d890 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
1d8a0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
1d8b0 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
1d8c0 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
1d8d0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
1d8e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1d8f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d900 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1d910 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d920 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1d930 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63        if( nTrunc
1d940 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
1d950 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
1d960 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
1d970 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
1d980 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
1d990 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ges.        ** b
1d9a0 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
1d9b0 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
1d9c0 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
1d9d0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
1d9e0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
1d9f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1da00 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20      Pgno i;.    
1da10 20 20 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b      void *pPage;
1da20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b  .        int iSk
1da30 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
1da40 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  NO(pPager);.    
1da50 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e      for( i=nTrun
1da60 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  c+1; i<=pPager->
1da70 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20  origDbSize; i++ 
1da80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1da90 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f   !(pPager->aInJo
1daa0 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c  urnal[i/8] & (1<
1dab0 3c 28 69 26 37 29 29 29 20 26 26 20 69 21 3d 69  <(i&7))) && i!=i
1dac0 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
1dad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1dae0 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
1daf0 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , i, &pPage);.  
1db00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1db10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1db20 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1db30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1db40 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1db50 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
1db60 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
1db70 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
1db80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1db90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dba0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1dbb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1dbc0 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a       } .      }.
1dbd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
1dbe0 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  = writeMasterJou
1dbf0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
1dc00 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
1dc10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dc20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1dc30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
1dc40 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1dc50 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1dc60 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1dc70 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
1dc80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1dc90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1dca0 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21  .    if( nTrunc!
1dcb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1dcc0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72   sqlite3pager_tr
1dcd0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
1dce0 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  Trunc);.      if
1dcf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1dd00 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1dd10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1dd20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
1dd30 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1dd40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dd50 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
1dd60 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
1dd70 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
1dd80 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1dd90 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1dda0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1ddb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1ddc0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20  to sync_exit;.. 
1ddd0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
1dde0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1ddf0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1de00 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
1de10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1de20 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
1de30 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
1de40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1de50 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
1de60 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20  }else if( MEMDB 
1de70 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  && nTrunc!=0 ){.
1de80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1de90 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1dea0 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
1deb0 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
1dec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ded0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1dee0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
1def0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
1df00 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
1df10 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69   pData to locati
1df20 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
1df30 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile. .**.** Ther
1df40 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
1df50 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63  erences to the c
1df60 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f  urrent page pgno
1df70 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67  . If current pag
1df80 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74  e.** pgno is not
1df90 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1dfa0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1dfb0 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74  , it is not writ
1dfc0 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20  ten there by.** 
1dfd0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
1dfe0 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65   The same applie
1dff0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44  s to the page pD
1e000 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e  ata refers to on
1e010 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69   entry to.** thi
1e020 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1e030 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
1e040 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20  he page refered 
1e050 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61  to by pData rema
1e060 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
1e070 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
1e080 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
1e090 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28  ith page pData (
1e0a0 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
1e0b0 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
1e0c0 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
1e0d0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
1e0e0 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
1e0f0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1e100 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
1e110 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
1e120 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
1e130 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1e140 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
1e150 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
1e160 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
1e170 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1e180 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
1e190 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
1e1a0 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
1e1b0 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
1e1c0 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
1e1d0 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
1e1e0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
1e1f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1e200 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e  s active)..*/.in
1e210 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d  t sqlite3pager_m
1e220 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
1e230 50 61 67 65 72 2c 20 76 6f 69 64 20 2a 70 44 61  Pager, void *pDa
1e240 74 61 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  ta, Pgno pgno){.
1e250 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
1e260 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
1e270 74 61 29 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta);.  PgHdr *pP
1e280 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a  gOld; .  int h;.
1e290 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
1e2a0 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  gno = 0;..  asse
1e2b0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
1e2c0 29 3b 0a 0a 20 20 54 52 41 43 45 35 28 22 4d 4f  );..  TRACE5("MO
1e2d0 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
1e2e0 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
1e2f0 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
1e300 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1e310 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1e320 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
1e330 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d  no);..  if( pPg-
1e340 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1e350 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
1e360 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  pPg->pgno;.    a
1e370 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1e380 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
1e390 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20  ert( pPg->dirty 
1e3a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e3b0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1e3c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  );.  }..  /* Unl
1e3d0 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
1e3e0 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a  s hash-chain */.
1e3f0 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
1e400 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
1e410 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
1e420 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
1e430 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
1e440 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
1e450 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
1e460 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  's hash chain. A
1e470 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
1e480 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
1e490 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
1e4a0 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
1e4b0 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
1e4c0 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
1e4d0 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
1e4e0 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
1e4f0 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
1e500 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
1e510 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1e520 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
1e530 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gOld ){.    asse
1e540 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66  rt( pPgOld->nRef
1e550 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  ==0 );.    unlin
1e560 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
1e570 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  r, pPgOld);.    
1e580 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64  makeClean(pPgOld
1e590 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f 6c  );.    if( pPgOl
1e5a0 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  d->needSync ){. 
1e5b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1e5c0 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  Old->inJournal )
1e5d0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
1e5e0 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
1e5f0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1e600 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
1e610 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1e620 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ync );.    }.  }
1e630 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68  ..  /* Change th
1e640 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1e650 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74  r pPg and insert
1e660 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   it into the new
1e670 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a   hash-chain. */.
1e680 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
1e690 6e 6f 3b 0a 20 20 68 20 3d 20 70 61 67 65 72 5f  no;.  h = pager_
1e6a0 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 69 66  hash(pgno);.  if
1e6b0 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
1e6c0 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  h] ){.    assert
1e6d0 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
1e6e0 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  h]->pPrevHash==0
1e6f0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1e700 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1e710 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  ash = pPg;.  }. 
1e720 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
1e730 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
1e740 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48  h];.  pPager->aH
1e750 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
1e760 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
1e770 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79   0;..  makeDirty
1e780 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
1e790 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1e7a0 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
1e7b0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
1e7c0 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
1e7d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1e7e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1e7f0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
1e800 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
1e810 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
1e820 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
1e830 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
1e840 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
1e850 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
1e860 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
1e870 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
1e880 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
1e890 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a     ** Pager.aInJ
1e8a0 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62  ournal bit has b
1e8b0 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
1e8c0 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
1e8d0 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20  ed by loading.  
1e8e0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e    ** the page in
1e8f0 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
1e900 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
1e910 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
1e920 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  c flag..    **. 
1e930 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
1e940 33 70 61 67 65 72 5f 67 65 74 28 29 20 63 61 6c  3pager_get() cal
1e950 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
1e960 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
1e970 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
1e980 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
1e990 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1e9a0 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
1e9b0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1e9c0 76 6f 69 64 20 2a 70 4e 65 65 64 53 79 6e 63 3b  void *pNeedSync;
1e9d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e9e0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
1e9f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ea00 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
1ea10 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
1ea20 20 26 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20   &pNeedSync);.  
1ea30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ea40 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1ea50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
1ea60 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44  dSync = 1;.    D
1ea70 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
1ea80 65 64 53 79 6e 63 29 2d 3e 6e 65 65 64 53 79 6e  edSync)->needSyn
1ea90 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f  c = 1;.    DATA_
1eaa0 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1eab0 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  nc)->inJournal =
1eac0 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74   1;.    makeDirt
1ead0 79 28 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  y(DATA_TO_PGHDR(
1eae0 70 4e 65 65 64 53 79 6e 63 29 29 3b 0a 20 20 20  pNeedSync));.   
1eaf0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1eb00 72 65 66 28 70 4e 65 65 64 53 79 6e 63 29 3b 0a  ref(pNeedSync);.
1eb10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1eb20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1eb30 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
1eb40 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1eb50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1eb60 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
1eb70 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
1eb80 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ate of the file 
1eb90 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76  lock for the giv
1eba0 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65  en pager..** The
1ebb0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1ebc0 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c   one of NO_LOCK,
1ebd0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
1ebe0 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SERVED_LOCK,.** 
1ebf0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72  PENDING_LOCK, or
1ec00 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
1ec10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1ec20 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50  ager_lockstate(P
1ec30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ec40 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
1ec50 73 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65  sLockState(pPage
1ec60 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66  r->fd);.}.#endif
1ec70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ec80 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
1ec90 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61  t a listing of a
1eca0 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61  ll referenced pa
1ecb0 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65  ges and their re
1ecc0 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  f count..*/.void
1ecd0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
1ece0 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61  fdump(Pager *pPa
1ecf0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
1ed00 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  Pg;.  for(pPg=pP
1ed10 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
1ed20 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
1ed30 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  ll){.    if( pPg
1ed40 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74  ->nRef<=0 ) cont
1ed50 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  inue;.    sqlite
1ed60 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41  3DebugPrintf("PA
1ed70 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e  GE %3d addr=%p n
1ed80 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
1ed90 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47     pPg->pgno, PG
1eda0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1edb0 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
1edc0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64  }.}.#endif..#end
1edd0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1ede0 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a              T_DISKIO */.