/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 3114c819a6cb86a2499396819c5fd6f4f8165546:


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 37  : pager.c,v 1.27
0350: 35 20 32 30 30 36 2f 31 31 2f 30 36 20 32 31 3a  5 2006/11/06 21:
0360: 32 30 3a 32 36 20 64 72 68 20 45 78 70 20 24 0a  20:26 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 2a 2f 0a 20 20 75 33 32 20 6e 6f 74  ges */.  u32 not
1c40: 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
1c50: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1c60: 72 20 73 70 61 63 65 20 2a 2f 0a 23 69 66 64 65  r space */.#ifde
1c70: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1c80: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
1c90: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ash;.#endif.  /*
1ca0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1cb0: 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  e bytes of page 
1cc0: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
1cd0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
1ce0: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
1cf0: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
1d00: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
1d10: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
1d20: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
1d30: 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73  ory only databas
1d40: 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e  e, some extra in
1d50: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63  formation is rec
1d60: 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65  orded about.** e
1d70: 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74  ach page so that
1d80: 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20   changes can be 
1d90: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a  rolled back.  (J
1da0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
1db0: 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72   not.** used for
1dc0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1dd0: 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c  ases.)  The foll
1de0: 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  owing informatio
1df0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  n is added to.**
1e00: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
1e10: 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f  y EXTRA block fo
1e20: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
1e30: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bases..**.** Thi
1e40: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f  s information co
1e50: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64  uld have been ad
1e60: 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ded directly to 
1e70: 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74  the PgHdr struct
1e80: 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e  ure..** But then
1e90: 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75   it would take u
1ea0: 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74  p an extra 8 byt
1eb0: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e  es of storage on
1ec0: 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20   every PgHdr.** 
1ed0: 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61  even for disk-ba
1ee0: 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  sed databases.  
1ef0: 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74  Splitting it out
1f00: 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20   saves 8 bytes. 
1f10: 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
1f20: 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e   a savings of 0.
1f30: 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72  8% but those per
1f40: 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e  centages add up.
1f50: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1f60: 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48  ct PgHistory PgH
1f70: 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50  istory;.struct P
1f80: 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20  gHistory {.  u8 
1f90: 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f  *pOrig;     /* O
1fa0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78  riginal page tex
1fb0: 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74  t.  Restore to t
1fc0: 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f  his on a full ro
1fd0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a  llback */.  u8 *
1fe0: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65  pStmt;     /* Te
1ff0: 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20  xt as it was at 
2000: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
2020: 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  tement */.};../*
2030: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
2040: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
2050: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
2060: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
2070: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2080: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
2090: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  C1(P,D,N,X) if( 
20a0: 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20  P->xCodec!=0 ){ 
20b0: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
20c0: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d  decArg,D,N,X); }
20d0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20e0: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
20f0: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f  *)(P->xCodec!=0?
2100: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
2110: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29  decArg,D,N,X):D)
2120: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
2130: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
2140: 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64   /* NO-OP */.# d
2150: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
2160: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29  ,N,X) ((char*)D)
2170: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
2180: 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72  onvert a pointer
2190: 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f   to a PgHdr into
21a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
21b0: 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61  s data.** and ba
21c0: 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65  ck again..*/.#de
21d0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41  fine PGHDR_TO_DA
21e0: 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28  TA(P)  ((void*)(
21f0: 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e  &(P)[1])).#defin
2200: 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  e DATA_TO_PGHDR(
2210: 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29 28  D)  (&((PgHdr*)(
2220: 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65  D))[-1]).#define
2230: 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28   PGHDR_TO_EXTRA(
2240: 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28  G,P) ((void*)&((
2250: 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29 29  char*)(&(G)[1]))
2260: 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d 29  [(P)->pageSize])
2270: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2280: 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c  O_HIST(P,PGR)  \
2290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50  .            ((P
22a0: 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61  gHistory*)&((cha
22b0: 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50  r*)(&(P)[1]))[(P
22c0: 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28 50  GR)->pageSize+(P
22d0: 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f  GR)->nExtra])../
22e0: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
22f0: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
2300: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2310: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2320: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72  ..**.** Pager.er
2330: 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74  rCode may be set
2340: 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   to SQLITE_IOERR
2350: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
2360: 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  , SQLITE_PROTOCO
2370: 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46  L.** or SQLITE_F
2380: 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66  ULL. Once one of
2390: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
23a0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20   errors occurs, 
23b0: 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61  it persists.** a
23c0: 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  nd is returned a
23d0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
23e0: 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65  every major page
23f0: 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65  r API call.  The
2400: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
2410: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
2420: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
2430: 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f  t. It persists o
2440: 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  nly until the.**
2450: 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c   next successful
2460: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72   rollback is per
2470: 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61  formed on the pa
2480: 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c  ger cache. Also,
2490: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
24a0: 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20  does not affect 
24b0: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
24c0: 5f 67 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  _get() and sqlit
24d0: 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29  e3pager_lookup()
24e0: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
24f0: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
2500: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
2510: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
2520: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65  .  u8 journalOpe
2530: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2540: 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2550: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
2560: 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  rs is valid */. 
2570: 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74   u8 journalStart
2580: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
2590: 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f  True if header o
25a0: 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  f journal is syn
25b0: 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ced */.  u8 useJ
25c0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
25d0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
25e0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
25f0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
2600: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2620: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2630: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2640: 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70  s */.  u8 stmtOp
2650: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2660: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2670: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2680: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
2690: 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65  /.  u8 stmtInUse
26a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26b0: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
26c0: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  n a statement su
26d0: 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  btransaction */.
26e0: 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65    u8 stmtAutoope
26f0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
2700: 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e   Open stmt journ
2710: 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75  al when main jou
2720: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f  rnal is opened*/
2730: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2750: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
2760: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
2770: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
2780: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2790: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
27a0: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
27b0: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
27c0: 73 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 5f  ss */.  u8 full_
27d0: 66 73 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  fsync;          
27e0: 20 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c      /* Use F_FUL
27f0: 4c 46 53 59 4e 43 20 77 68 65 6e 20 61 76 61 69  LFSYNC when avai
2800: 6c 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74  lable */.  u8 st
2810: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2820: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
2830: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
2840: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
2850: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2860: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2870: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
2880: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2890: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
28a0: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
28b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
28c0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
28d0: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
28e0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
28f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2900: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2910: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2920: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2930: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2940: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2950: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
2960: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
2970: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
2980: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
2990: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
29a0: 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70  back() for all p
29b0: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d  ages */.  u8 mem
29c0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
29d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
29e0: 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c   inhibit all fil
29f0: 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65  e I/O */.  u8 se
2a00: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2a10: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2a20: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
2a30: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2a40: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   jrnl */.  int e
2a50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
2a60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2a70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
2a80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
2a90: 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  t dbSize;       
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ab0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ac0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
2ad0: 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20  t origDbSize;   
2ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
2af0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
2b00: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f  urrent change */
2b10: 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b  .  int stmtSize;
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b30: 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61  * Size of databa
2b40: 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74  se (in pages) at
2b50: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
2b60: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2b90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
2ba0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
2bb0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
2bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
2bd0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
2be0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
2bf0: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74  hecksum */.  int
2c00: 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20   stmtNRec;      
2c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c20: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
2c30: 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c   stmt subjournal
2c40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c60: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
2c70: 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68  ny bytes to each
2c80: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2c90: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
2ca0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2cb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2cc0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
2cd0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cf0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2d00: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2d10: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50  s */.  int nMaxP
2d20: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2d30: 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72     /* High water
2d40: 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a   mark of nPage *
2d50: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  /* Number of in-
2d80: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74  memory pages wit
2d90: 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a  h PgHdr.nRef>0 *
2da0: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2dd0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
2de0: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
2df0: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e10: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2e20: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2e30: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2e40: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e60: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2e70: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2e80: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
2e90: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
2ea0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2eb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ec0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
2ed0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2ee0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2ef0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
2f10: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
2f20: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
2f30: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
2f40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2f50: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a  .  OsFile *fd, *
2f60: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  jfd;           /
2f70: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2f80: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
2f90: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
2fa0: 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20 20   OsFile *stfd;  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fc0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2fd0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
2fe0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20  t subjournal*/. 
2ff0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
3000: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
3010: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
3020: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
3030: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
3040: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
3050: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
3060: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
3070: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
3080: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
3090: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
30a0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
30b0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
30c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30d0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
30e0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
30f0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
3100: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3110: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
3120: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
3130: 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  nal */.  PgHdr *
3140: 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20  pDirty;         
3150: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3160: 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
3170: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
3180: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3190: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
31a0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
31b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
31c0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31e0: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
31f0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
3200: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
3210: 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20  stmtHdrOff;     
3220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3230: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3240: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
3250: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  tement */.  i64 
3260: 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20  stmtCksum;      
3270: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
3280: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
3290: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
32a0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69  */.  i64 stmtJSi
32b0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
32c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
32d0: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
32e0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63  n() */.  int sec
32f0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
3300: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
3310: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
3320: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23  ng rollback */.#
3330: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3340: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
3350: 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20  iss, nOvfl;     
3360: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d  /* Cache hits, m
3370: 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20  issing, and LRU 
3380: 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 69  overflows */.  i
3390: 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65 3b  nt nRead,nWrite;
33a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
33b0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
33c0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
33d0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  dif.  void (*xDe
33e0: 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 2c  structor)(void*,
33f0: 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  int); /* Call th
3400: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
3410: 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f  freeing pages */
3420: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
3430: 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b  ter)(void*,int);
3440: 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20     /* Call this 
3450: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
3460: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
3470: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
3480: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3490: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
34a0: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
34b0: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
34c0: 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20  id *pCodecArg;  
34d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
34e0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
34f0: 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 69 6e 74  Codec() */.  int
3500: 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20   nHash;         
3510: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
3520: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
3530: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  sh table */.  Pg
3540: 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20  Hdr **aHash;    
3550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
3560: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
3570: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
3580: 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Hdr */.#ifdef SQ
3590: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
35a0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
35b0: 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20  Pager *pNext;   
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
35d0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
35e0: 67 65 72 73 20 69 6e 20 74 68 69 73 20 74 68 72  gers in this thr
35f0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ead */.#endif.};
3600: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
3610: 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65  E_TEST is define
3620: 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  d then increment
3630: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 67 69   the variable gi
3640: 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72  ven in.** the ar
3650: 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66  gument.*/.#ifdef
3660: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64   SQLITE_TEST.# d
3670: 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28  efine TEST_INCR(
3680: 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20  x)  x++.#else.# 
3690: 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52  define TEST_INCR
36a0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
36b0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
36c0: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
36d0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
36e0: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
36f0: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
3700: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
3710: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
3720: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
3730: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
3740: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
3750: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
3760: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
3770: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
3780: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
3790: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
37a0: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
37b0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
37c0: 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74  s begin.** writt
37d0: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
37e0: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
37f0: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
3800: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
3810: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
3820: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
3830: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
3840: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
3850: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
3860: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
3870: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
3880: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
3890: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
38a0: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
38b0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
38c0: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
38d0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
38e0: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
38f0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
3900: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
3910: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
3920: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
3930: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
3940: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
3950: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
3960: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
3970: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
3980: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
3990: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
39a0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
39b0: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
39c0: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
39d0: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
39e0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
39f0: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
3a00: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
3a10: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3a20: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
3a30: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
3a40: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
3a50: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
3a60: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
3a70: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
3a80: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
3a90: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
3aa0: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
3ab0: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
3ac0: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
3ad0: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
3ae0: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
3af0: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
3b00: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
3b10: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
3b20: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
3b30: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
3b40: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
3b50: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
3b60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
3b70: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
3b80: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
3b90: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
3ba0: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
3bb0: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
3bc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
3bd0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
3be0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
3bf0: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
3c00: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
3c10: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
3c20: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
3c30: 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
3c40: 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70  er and of each p
3c50: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
3c60: 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  al is determined
3c70: 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f  .** by the follo
3c80: 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  wing macros..*/.
3c90: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3ca0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
3cb0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
3cc0: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
3cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
3ce0: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
3cf0: 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75  pager. In the fu
3d00: 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64  ture, this could
3d10: 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f   be.** set to so
3d20: 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  me value read fr
3d30: 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74  om the disk cont
3d40: 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f  roller. The impo
3d50: 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74  rtant.** charact
3d60: 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20  eristic is that 
3d70: 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73  it is the same s
3d80: 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65  ize as a disk se
3d90: 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ctor..*/.#define
3da0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
3db0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
3dc0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
3dd0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
3de0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
3df0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
3e00: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
3e10: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
3e20: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
3e30: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
3e40: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
3e50: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
3e60: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
3e70: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
3e80: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
3e90: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
3ea0: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
3eb0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
3ec0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
3ed0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
3ee0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
3ef0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
3f00: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
3f10: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
3f20: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
3f30: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
3f40: 73 69 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73  size of a disk s
3f50: 65 63 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  ector.*/.#define
3f60: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
3f70: 5a 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61  ZE 512../*.** Pa
3f80: 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f  ge number PAGER_
3f90: 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72  MJ_PGNO is never
3fa0: 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69   used in an SQLi
3fb0: 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20  te database (it 
3fc0: 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66  is.** reserved f
3fd0: 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e  or working aroun
3fe0: 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69  d a windows/posi
3ff0: 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74  x incompatibilit
4000: 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65  y). It is.** use
4010: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
4020: 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74   to signify that
4030: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
4040: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
4050: 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65  le .** is devote
4060: 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d  d to storing a m
4070: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
4080: 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e  me - there are n
4090: 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a  o more pages to.
40a0: 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65  ** roll back. Se
40b0: 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66  e comments for f
40c0: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73  unction writeMas
40d0: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
40e0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20   details..*/./* 
40f0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
4100: 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e  _PGNO(x) (PENDIN
4110: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
4120: 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69  eSize)) */.#defi
4130: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
4140: 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59  (x) ((PENDING_BY
4150: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
4160: 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  e))+1)../*.** Th
4170: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
4180: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
4190: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
41a0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
41b0: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
41c0: 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65  ./*.** Enable re
41d0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72  ference count tr
41e0: 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75  acking (for debu
41f0: 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a  gging) here:.*/.
4200: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4210: 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  ST.  int pager3_
4220: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
4230: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
4240: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
4250: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
4260: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
4270: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
4280: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4290: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
42a0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
42b0: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
42c0: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20  NT: %4d addr=%p 
42d0: 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  nRef=%d\n",.    
42e0: 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44     p->pgno, PGHD
42f0: 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d  R_TO_DATA(p), p-
4300: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
4310: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
4320: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
4330: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
4340: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
4350: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
4360: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
4370: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
4380: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  O(X).#endif.../*
4390: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
43a0: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
43b0: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e   hash table to N
43c0: 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70  .  N must be a p
43d0: 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a  ower.** of two..
43e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
43f0: 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
4400: 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50  _table(Pager *pP
4410: 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  ager, int N){.  
4420: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a  PgHdr **aHash, *
4430: 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e  pPg;.  assert( N
4440: 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d  >0 && (N&(N-1))=
4450: 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20  =0 );.  aHash = 
4460: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
4470: 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e  zeof(aHash[0])*N
4480: 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d   );.  if( aHash=
4490: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  =0 ){.    /* Fai
44a0: 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69  lure to rehash i
44b0: 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20  s not an error. 
44c0: 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65   It is only a pe
44d0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a  rformance hit. *
44e0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
44f0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
4500: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
4510: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
4520: 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   N;.  pPager->aH
4530: 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66  ash = aHash;.  f
4540: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
4550: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
4560: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
4570: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28    int h;.    if(
4580: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
4590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
45a0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
45b0: 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
45c0: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  sh==0 );.      c
45d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
45e0: 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f     h = pPg->pgno
45f0: 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50   & (N-1);.    pP
4600: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61  g->pNextHash = a
4610: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28  Hash[h];.    if(
4620: 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20   aHash[h] ){.   
4630: 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72     aHash[h]->pPr
4640: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
4650: 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d    }.    aHash[h]
4660: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d   = pPg;.    pPg-
4670: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
4680: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
4690: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
46a0: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
46b0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
46c0: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
46d0: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
46e0: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
46f0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4700: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
4710: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
4720: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4730: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4740: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
4750: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
4760: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
4770: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
4780: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
4790: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
47a0: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
47b0: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
47c0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
47d0: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
47e0: 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20   sizeof(ac));.  
47f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4800: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
4810: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4820: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4830: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
4840: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
4860: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4870: 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20  r into a string 
4880: 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e  buffer in big-en
4890: 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e  dian byte order.
48a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
48b0: 70 75 74 33 32 62 69 74 73 28 63 68 61 72 20 2a  put32bits(char *
48c0: 61 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  ac, u32 val){.  
48d0: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
48e0: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
48f0: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
4900: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
4910: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
4920: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
4930: 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
4940: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4950: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
4960: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4970: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
4980: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
4990: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
49a0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
49b0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
49c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
49d0: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
49e0: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
49f0: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
4a00: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
4a10: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
4a20: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
4a30: 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   ac, 4);.}../*.*
4a40: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
4a50: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
4a60: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
4a70: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
4a80: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
4a90: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
4aa0: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
4ab0: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
4ac0: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
4ad0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4ae0: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
4af0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
4b00: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
4b10: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
4b20: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4b30: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4b40: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
4b50: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
4b60: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
4b70: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
4b80: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
4b90: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a  ithin the pager.
4ba0: 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72  ** code. The fir
4bb0: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
4bc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4bd0: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
4be0: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74   the.** second t
4bf0: 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
4c00: 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
4c10: 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
4c20: 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20  I function. .** 
4c30: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
4c40: 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
4c50: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4c60: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
4c70: 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
4c80: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4c90: 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f  ent is SQLITE_IO
4ca0: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
4cb0: 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52  UPT or SQLITE_PR
4cc0: 4f 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65  OTOCOL,.** the e
4cd0: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
4ce0: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
4cf0: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4d00: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
4d10: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
4d20: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
4d30: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
4d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4d50: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
4d60: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
4d70: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
4d80: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
4d90: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
4da0: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
4db0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
4dc0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
4dd0: 0a 20 20 69 66 28 20 0a 20 20 20 20 72 63 32 3d  .  if( .    rc2=
4de0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
4df0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
4e00: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
4e10: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
4e20: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4e30: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29  ITE_PROTOCOL.  )
4e40: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
4e50: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
4e60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4e70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
4e80: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
4e90: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
4ea0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
4eb0: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
4ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
4ed0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
4ee0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75  Hdr *pPage){.  u
4ef0: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
4f00: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
4f10: 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28   char *pData = (
4f20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
4f30: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
4f40: 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  age);.  for(i=0;
4f50: 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72   i<pPage->pPager
4f60: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29  ->pageSize; i++)
4f70: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
4f80: 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a  sh+i)^pData[i];.
4f90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
4fa0: 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  h;.}../*.** The 
4fb0: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
4fc0: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
4fd0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
4fe0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
4ff0: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
5000: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
5010: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
5020: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
5030: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
5040: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
5050: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
5060: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
5070: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
5080: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
5090: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
50a0: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
50b0: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
50c0: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
50d0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
50e0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
50f0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
5100: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
5110: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
5120: 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69  MEMDB || pPg->di
5130: 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50  rty || .      pP
5140: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
5150: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
5160: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
5170: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
5180: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
5190: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
51a0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
51b0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
51c0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
51d0: 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74  pen..** The mast
51e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
51f0: 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f  name is read fro
5200: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
5210: 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72   file and .** wr
5220: 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
5230: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
5240: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20  sqliteMalloc(). 
5250: 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20  *pzMaster is.** 
5260: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  set to point at 
5270: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  the memory and S
5280: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
5290: 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
52a0: 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65  st.** sqliteFree
52b0: 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a  () *pzMaster..**
52c0: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
52d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
52e0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70  me is present *p
52f0: 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74  zMaster is set t
5300: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
5310: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5320: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5330: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f  dMasterJournal(O
5340: 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  sFile *pJrnl, ch
5350: 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a  ar **pzMaster){.
5360: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
5370: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
5380: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
5390: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
53a0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
53b0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
53c0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
53d0: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d  eader */..  *pzM
53e0: 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63  aster = 0;..  rc
53f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
5400: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
5410: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5420: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
5430: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5440: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5450: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
5460: 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  6);.  if( rc!=SQ
5470: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5480: 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65   rc;. .  rc = re
5490: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
54a0: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
54b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
54c0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
54d0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
54e0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  , &cksum);.  if(
54f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5510: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5520: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
5530: 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   8);.  if( rc!=S
5540: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
5550: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
5560: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
5570: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5580: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
5590: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65  pJrnl, szJ-16-le
55a0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
55b0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
55c0: 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65   rc;..  *pzMaste
55d0: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
55e0: 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b  teMalloc(len+1);
55f0: 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65  .  if( !*pzMaste
5600: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
5610: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5620: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
5630: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70  OsRead(pJrnl, *p
5640: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
5650: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5660: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
5670: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
5680: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
5690: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   0;.    return r
56a0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
56b0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
56c0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
56d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
56e0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
56f0: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
5700: 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73  cksum -= (*pzMas
5710: 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69  ter)[i];.  }.  i
5720: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
5730: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
5740: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
5750: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
5760: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
5770: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
5780: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
5790: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
57a0: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
57b0: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
57c0: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
57d0: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
57e0: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
57f0: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
5800: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
5810: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
5820: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
5830: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
5840: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
5850: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d  zMaster = 0;.  }
5860: 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61  else{.    (*pzMa
5870: 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ster)[len] = '\0
5880: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
5890: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
58a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
58b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
58c0: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
58d0: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
58e0: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
58f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
5900: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
5910: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
5920: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
5930: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
5940: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
5950: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
5960: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
5970: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
5980: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
5990: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
59a0: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
59d0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
59e0: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
59f0: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
5a00: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
5a10: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
5a20: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5a30: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
5a40: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
5a50: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ** .*/.static in
5a60: 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  t seekJournalHdr
5a70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
5a80: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
5a90: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
5aa0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5ab0: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
5ac0: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
5ad0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5ae0: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
5af0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5b00: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
5b10: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
5b20: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5b30: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
5b40: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
5b50: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
5b60: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
5b70: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
5b80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5b90: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72  ff = offset;.  r
5ba0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53  eturn sqlite3OsS
5bb0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
5bc0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5bd0: 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Off);.}../*.** T
5be0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5bf0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
5c00: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
5c10: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
5c20: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
5c30: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
5c40: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
5c50: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
5c60: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
5c70: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
5c80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
5c90: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
5ca0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
5cb0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
5cc0: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
5cd0: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
5ce0: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
5cf0: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
5d00: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
5d10: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
5d20: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
5d30: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
5d40: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
5d50: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
5d60: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
5d70: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
5d80: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
5d90: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
5da0: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
5db0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
5dc0: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
5dd0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
5de0: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
5df0: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
5e00: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
5e10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5e20: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
5e30: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5e40: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
5e50: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5e60: 69 63 29 2b 31 36 5d 3b 0a 0a 20 20 69 6e 74 20  ic)+16];..  int 
5e70: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
5e80: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
5e90: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5ea0: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
5eb0: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
5ec0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5ed0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
5ee0: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
5ef0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
5f00: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
5f10: 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20  ournalHdr;.  }. 
5f20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5f30: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
5f40: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a  DR_SZ(pPager);..
5f50: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20    /* FIX ME: .  
5f60: 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  **.  ** Possibly
5f70: 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74   for a pager not
5f80: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
5f90: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61  , the journal ma
5fa0: 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20  gic should not. 
5fb0: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75   ** be written u
5fc0: 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c  ntil nRec is fil
5fd0: 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f  led in as part o
5fe0: 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e  f next syncJourn
5ff0: 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  al(). .  **.  **
6000: 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20   Actually maybe 
6010: 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
6020: 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20  l header should 
6030: 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  be delayed until
6040: 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74   that.  ** point
6050: 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  . Think about th
6060: 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  is..  */.  memcp
6070: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
6080: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6090: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
60a0: 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20  ;.  /* The nRec 
60b0: 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46  Field. 0xFFFFFFF
60c0: 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f  F for no-sync jo
60d0: 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74  urnals. */.  put
60e0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
60f0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6100: 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
6110: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
6120: 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54  fff : 0);.  /* T
6130: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
6140: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
6150: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61   */ .  sqlite3Ra
6160: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
6170: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6180: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
6190: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
61a0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
61b0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
61c0: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
61d0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
61e0: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
61f0: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
6200: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6210: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6220: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
6230: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
6240: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
6250: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
6260: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
6270: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6280: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6290: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
62a0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
62b0: 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
62c0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
62d0: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
62e0: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
62f0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
6300: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
6310: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
6320: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
6330: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
6340: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6350: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
6360: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6370: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
6380: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6390: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
63a0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
63b0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
63c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a  >journalOff-1);.
63d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
63e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
63f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6400: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6410: 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20  "\000", 1);.    
6420: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6430: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
6440: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
6450: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
6460: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
6470: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6480: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
6490: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
64a0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
64b0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
64c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
64d0: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
64e0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
64f0: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6500: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6510: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6520: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6530: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
6540: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
6550: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
6560: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
6570: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
6580: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
6590: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
65a0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
65b0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
65c0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
65d0: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
65e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
65f0: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6600: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6610: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6620: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
6630: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6640: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
6650: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6660: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
6670: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
6680: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6690: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
66a0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
66b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
66c0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
66d0: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
66e0: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
66f0: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6700: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6710: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6720: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
6730: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
6740: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
6750: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
6760: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
6770: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
6780: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
6790: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
67a0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
67b0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
67c0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
67d0: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
67e0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
67f0: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
6800: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6810: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6820: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6830: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
6840: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
6850: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6860: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
6870: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6880: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6890: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
68a0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
68b0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
68c0: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
68d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
68e0: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
68f0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
6900: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6910: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
6920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6930: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6940: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6950: 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a  r->jfd, pNRec);.
6960: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6970: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
6980: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
6990: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
69a0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
69b0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
69c0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
69d0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
69e0: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
69f0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6a00: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
6a10: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
6a20: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
6a30: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
6a40: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
6a50: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
6a60: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
6a70: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
6a80: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
6a90: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
6aa0: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
6ab0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
6ac0: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
6ad0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
6ae0: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
6af0: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
6b00: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
6b10: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
6b20: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
6b30: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
6b40: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
6b50: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
6b60: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20  ager->jfd, (u32 
6b70: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
6b80: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
6b90: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6ba0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6bb0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
6bc0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
6bd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
6be0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
6bf0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6c00: 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Off);.  return r
6c10: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
6c20: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
6c30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6c40: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
6c50: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
6c60: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
6c70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
6c80: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
6c90: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
6ca0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
6cb0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
6cc0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
6cd0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
6ce0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
6cf0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
6d00: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
6d10: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
6d20: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
6d30: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
6d40: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
6d50: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
6d60: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
6d70: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
6d80: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
6d90: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
6da0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
6db0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
6dc0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
6dd0: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
6de0: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
6df0: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
6e00: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
6e10: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
6e20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
6e30: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
6e40: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
6e50: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
6e60: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
6e70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
6e80: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
6e90: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
6ea0: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
6eb0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
6ec0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
6ed0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
6ee0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
6ef0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
6f00: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
6f10: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
6f20: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
6f30: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
6f40: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
6f50: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
6f60: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6f70: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
6f80: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
6f90: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
6fa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6fb0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
6fc0: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
6fd0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
6fe0: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
6ff0: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
7000: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
7010: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
7020: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
7030: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
7040: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
7050: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
7060: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
7070: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7080: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
7090: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
70a0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
70b0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
70c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
70d0: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
70e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
70f0: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
7100: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
7110: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
7120: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7130: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
7140: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
7150: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
7160: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
7170: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
7180: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
7190: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
71a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
71b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
71c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
71d0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
71e0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
71f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7200: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7210: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
7220: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
7230: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
7240: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
7250: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
7260: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
7270: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
7280: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7290: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
72a0: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
72b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
72c0: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
72d0: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
72e0: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74  r->noSync;.  ret
72f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7300: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
7310: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
7320: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
7330: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
7340: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
7350: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
7360: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
7370: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
7380: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
7390: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
73a0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
73b0: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
73c0: 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67  s the sqlite3pag
73d0: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29  er_stmt_commit()
73e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20  .** routine run 
73f0: 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20  MUCH faster for 
7400: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
7410: 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20  where there are 
7420: 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e  many.** pages in
7430: 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79   memory but only
7440: 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68   a few are in th
7450: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
7460: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
7470: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
7480: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
7490: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
74a0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
74b0: 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
74c0: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
74d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
74e0: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
74f0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d   pPg->pNextStmt=
7500: 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72  =0 );.  pPg->pPr
7510: 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  evStmt = 0;.  if
7520: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
7530: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
7540: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
7550: 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
7560: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
7570: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70  ager->pStmt;.  p
7580: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
7590: 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d  Pg;.  pPg->inStm
75a0: 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20  t = 1;.}.static 
75b0: 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65  void page_remove
75c0: 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
75d0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
75e0: 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  f( !pPg->inStmt 
75f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
7600: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29  pPg->pPrevStmt )
7610: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7620: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
7630: 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  extStmt==pPg );.
7640: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
7650: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  mt->pNextStmt = 
7660: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
7670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
7680: 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
7690: 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  ->pStmt==pPg );.
76a0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
76b0: 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  >pStmt = pPg->pN
76c0: 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69  extStmt;.  }.  i
76d0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  f( pPg->pNextStm
76e0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
76f0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
7700: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20  >pPrevStmt==pPg 
7710: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
7720: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
7730: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d   = pPg->pPrevStm
7740: 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  t;.  }.  pPg->pN
7750: 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  extStmt = 0;.  p
7760: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
7770: 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  0;.  pPg->inStmt
7780: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   = 0;.}../*.** F
7790: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
77a0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
77b0: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
77c0: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
77d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
77e0: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
77f0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
7800: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
7810: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
7820: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
7830: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  o){.  PgHdr *p;.
7840: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
7850: 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ash==0 ) return 
7860: 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d  0;.  p = pPager-
7870: 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70  >aHash[pgno & (p
7880: 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
7890: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
78a0: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
78b0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
78c0: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
78d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
78e0: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
78f0: 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ase and clear th
7900: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
7910: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
7920: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
7930: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
7940: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
7950: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
7960: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
7970: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
7980: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
7990: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
79a0: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
79b0: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
79c0: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
79d0: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
79e0: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
79f0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7a00: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
7a10: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
7a20: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  Pg, *pNext;.  if
7a30: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
7a40: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
7a50: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7a60: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
7a70: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
7a80: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
7a90: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
7aa0: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
7ab0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
7ac0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
7ad0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
7ae0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
7af0: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
7b00: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48   0;.  pPager->nH
7b10: 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ash = 0;.  sqlit
7b20: 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  eFree(pPager->aH
7b30: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
7b40: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61  nPage = 0;.  pPa
7b50: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a  ger->aHash = 0;.
7b60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7b70: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
7b80: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7b90: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
7ba0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7bb0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7bc0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7bd0: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
7be0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
7bf0: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
7c00: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
7c10: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
7c20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7c30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
7c40: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
7c50: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7c60: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7c70: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7c80: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7c90: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
7ca0: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
7cb0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7cc0: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7cd0: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
7ce0: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
7cf0: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7d00: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7d10: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
7d20: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
7d30: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
7d40: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
7d50: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
7d60: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
7d70: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
7d80: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
7d90: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
7da0: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
7db0: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
7dc0: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
7dd0: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
7de0: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
7df0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
7e00: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
7e10: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
7e20: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
7e30: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
7e40: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
7e50: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
7e60: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
7e70: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
7e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7e90: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
7ea0: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
7eb0: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
7ec0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
7ed0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
7ee0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
7ef0: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
7f00: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
7f10: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
7f20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7f30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7f40: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7f50: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
7f60: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
7f70: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
7f80: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
7f90: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
7fa0: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
7fb0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
7fc0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
7fd0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
7fe0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
7ff0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
8000: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
8010: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
8020: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
8030: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
8040: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
8050: 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  nc = 0;.#ifdef S
8060: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
8070: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
8080: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
8090: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
80a0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
80b0: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
80c0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
80d0: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
80e0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
80f0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
8100: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8110: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
8120: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
8130: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
8140: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75  ==0 || pPager->u
8150: 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  seJournal==0 );.
8160: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
8170: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
8180: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
8190: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
81a0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
81b0: 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f  RED;.  pPager->o
81c0: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
81d0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
81e0: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
81f0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
8200: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
8210: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
8220: 3e 70 46 69 72 73 74 3b 0a 20 20 72 65 74 75 72  >pFirst;.  retur
8230: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
8240: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
8250: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  n a checksum for
8260: 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74   the page of dat
8270: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  a..**.** This is
8280: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
8290: 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61  ksum.  It is rea
82a0: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
82b0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
82c0: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
82d0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75   and the page nu
82e0: 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69  mber.  We experi
82f0: 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  mented with.** a
8300: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
8310: 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75   entire data, bu
8320: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
8330: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
8340: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
8350: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8360: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
8370: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
8380: 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ata and.** the c
8390: 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
83a0: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
83b0: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
83c0: 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  .  If journal.**
83d0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
83e0: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
83f0: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
8400: 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61  ost likely scena
8410: 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f  rio.** is that o
8420: 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
8430: 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
8440: 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
8450: 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63  d.  It is.** muc
8460: 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
8470: 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
8480: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
8490: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
84a0: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
84b0: 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
84c0: 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
84d0: 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
84e0: 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
84f0: 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
8500: 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
8510: 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
8520: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a  corruption..**.*
8530: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69  * FIX ME:  Consi
8540: 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79  der adding every
8550: 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62   200th (or so) b
8560: 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  yte of the data 
8570: 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  to the.** checks
8580: 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66  um.  That way if
8590: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73   a single page s
85a0: 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64  pans 3 or more d
85b0: 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a  isk sectors and.
85c0: 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64  ** only the midd
85d0: 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72  le sector is cor
85e0: 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74  rupt, we will st
85f0: 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f  ill have a reaso
8600: 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20  nable.** chance 
8610: 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63  of failing the c
8620: 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73  hecksum and thus
8630: 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70   detecting the p
8640: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  roblem..*/.stati
8650: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
8660: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
8670: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
8680: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
8690: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
86a0: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
86b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
86c0: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
86d0: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
86e0: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
86f0: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
8700: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
8710: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
8720: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
8730: 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
8740: 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  PgHdr*);../*.** 
8750: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
8760: 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ge from the jour
8770: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  nal file opened 
8780: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
8790: 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79  or.** jfd.  Play
87a0: 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61  back this one pa
87b0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65  ge..**.** If use
87c0: 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e  Cksum==0 it mean
87d0: 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64  s this journal d
87e0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63  oes not use chec
87f0: 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d  ksums.  Checksum
8800: 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65  s.** are not use
8810: 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a  d in statement j
8820: 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20  ournals because 
8830: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8840: 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65  ls do not.** nee
8850: 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77  d to survive pow
8860: 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a  er failures..*/.
8870: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8880: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
8890: 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
88a0: 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69  , OsFile *jfd, i
88b0: 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20  nt useCksum){.  
88c0: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
88d0: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
88e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
88f0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
8900: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
8910: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
8920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8930: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
8940: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
8950: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
8960: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
8970: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
8980: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
8990: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
89a0: 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45   u8 aData[SQLITE
89b0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b  _MAX_PAGE_SIZE];
89c0: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
89d0: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
89e0: 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73  .  /* useCksum s
89f0: 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f  hould be true fo
8a00: 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  r the main journ
8a10: 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  al and false for
8a20: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
8a30: 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66  journals.  Verif
8a40: 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61  y that this is a
8a50: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
8a60: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66   */.  assert( jf
8a70: 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f  d == (useCksum ?
8a80: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
8a90: 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a  Pager->stfd) );.
8aa0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
8ab0: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
8ac0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8ad0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8ae0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8af0: 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61  OsRead(jfd, &aDa
8b00: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
8b10: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
8b20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8b30: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
8b40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
8b50: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8b60: 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69   + 4;..  /* Sani
8b70: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
8b80: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
8b90: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
8ba0: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
8bb0: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
8bc0: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
8bd0: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
8be0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
8bf0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
8c00: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
8c10: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
8c20: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
8c30: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
8c40: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
8c50: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
8c60: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
8c70: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
8c80: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
8c90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
8ca0: 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
8cb0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
8cc0: 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
8cd0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
8ce0: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75   }.  if( pgno>(u
8cf0: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
8d00: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
8d10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d20: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73    }.  if( useCks
8d30: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  um ){.    rc = r
8d40: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
8d50: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
8d60: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
8d70: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
8d80: 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
8d90: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
8da0: 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21  (pPager, aData)!
8db0: 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
8dc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
8dd0: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
8de0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8df0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
8e00: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
8e10: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
8e20: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
8e30: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
8e40: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
8e50: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
8e60: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
8e70: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
8e80: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
8e90: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
8ea0: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
8eb0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
8ec0: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
8ed0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
8ee0: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
8ef0: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
8f00: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
8f10: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
8f20: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
8f30: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
8f40: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
8f50: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
8f60: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
8f70: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
8f80: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
8f90: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
8fa0: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
8fb0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
8fc0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
8fd0: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
8fe0: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
8ff0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
9000: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
9010: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
9020: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
9030: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
9040: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
9050: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
9060: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
9070: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
9080: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
9090: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
90a0: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
90b0: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
90c0: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
90d0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
90e0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
90f0: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
9100: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
9110: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
9120: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
9130: 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72  re in the main r
9140: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
9150: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
9160: 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c  , if a full ROLL
9170: 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65  BACK occurs afte
9180: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  r the statement.
9190: 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68    ** rollback th
91a0: 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  e full ROLLBACK 
91b0: 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65  will not restore
91c0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73   the page to its
91d0: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63   original.  ** c
91e0: 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e  ontent.  Two con
91f0: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  ditions must be 
9200: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
9210: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
9220: 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28  se.  ** files. (
9230: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
9240: 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20  must be locked. 
9250: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
9260: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  t the original. 
9270: 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74   ** page content
9280: 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   is in the main 
9290: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
92a0: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
92b0: 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63  is not in.  ** c
92c0: 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20  ache or else it 
92d0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
92e0: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20  dSync==0..  */. 
92f0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
9300: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
9310: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9320: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9330: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
9340: 50 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45  Pg!=0 );.  TRACE
9350: 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  3("PLAYBACK %d p
9360: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
9370: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
9380: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9390: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
93a0: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
93b0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
93c0: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
93d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
93e0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
93f0: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
9400: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9410: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9420: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9430: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9440: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
9450: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9460: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9470: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
9480: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
9490: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
94a0: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
94b0: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
94c0: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
94d0: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
94e0: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
94f0: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
9500: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
9510: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
9520: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
9530: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
9540: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
9550: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
9560: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
9570: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
9580: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
9590: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
95a0: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
95b0: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
95c0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
95d0: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
95e0: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
95f0: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
9600: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
9610: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50  g->nRef==0 || pP
9620: 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f  g->pgno==1 ); */
9630: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48  .    pData = PGH
9640: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
9650: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
9660: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
9670: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9680: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
9690: 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a  structor ){  /**
96a0: 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c  * FIX ME:  Shoul
96b0: 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69  d this be xReini
96c0: 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50  t? ***/.      pP
96d0: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
96e0: 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  r(pData, pPager-
96f0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9700: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
9710: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
9720: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
9730: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
9740: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
9750: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
9760: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
9770: 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   3);.  }.  retur
9780: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
9790: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
97a0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
97b0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
97c0: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
97d0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
97e0: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
97f0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9800: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
9810: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
9820: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
9830: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
9840: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
9850: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
9860: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
9870: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
9880: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
9890: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
98a0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
98b0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
98c0: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
98d0: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
98e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
98f0: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
9900: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
9910: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
9920: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
9930: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
9940: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
9950: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
9960: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
9970: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
9980: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
9990: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
99a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
99b0: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63  ager_delmaster(c
99c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
99d0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
99e0: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
99f0: 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a   = 0;.  OsFile *
9a00: 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68  master = 0;.  ch
9a10: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
9a20: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
9a30: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
9a40: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
9a50: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
9a60: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
9a70: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
9a80: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
9a90: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
9aa0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
9ab0: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
9ac0: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
9ad0: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
9ae0: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
9af0: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
9b00: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
9b10: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
9b20: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
9b30: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
9b40: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
9b50: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
9b60: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
9b70: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9b80: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
9b90: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9ba0: 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73 74 65  OsFileSize(maste
9bb0: 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
9bc0: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
9bd0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
9be0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
9bf0: 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
9c00: 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
9c10: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
9c20: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
9c30: 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  tr = 0;..    /* 
9c40: 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
9c50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9c60: 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
9c70: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20  btained from.   
9c80: 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63   ** sqliteMalloc
9c90: 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
9ca0: 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
9cb0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
9cc0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
9cd0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
9ce0: 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
9cf0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  urnal);.    if( 
9d00: 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
9d10: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
9d20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9d30: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
9d40: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
9d50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
9d60: 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74  ad(master, zMast
9d70: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
9d80: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
9d90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9da0: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
9db0: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
9dc0: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
9dd0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
9de0: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
9df0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
9e00: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
9e10: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9e20: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f  OsFileExists(zJo
9e30: 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  urnal) ){.      
9e40: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
9e50: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
9e60: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
9e70: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
9e80: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
9e90: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
9ea0: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
9eb0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9ec0: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
9ed0: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
9ee0: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
9ef0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9f00: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
9f10: 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20  .        OsFile 
9f20: 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  *journal = 0;.  
9f30: 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20        int c;..  
9f40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9f50: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
9f60: 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72  (zJournal, &jour
9f70: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
9f80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9f90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
9fa0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
9fb0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
9fc0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
9fd0: 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e  terJournal(journ
9fe0: 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29  al, &zMasterPtr)
9ff0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a000: 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61  3OsClose(&journa
a010: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
a020: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a030: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
a040: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
a050: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
a060: 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
a070: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
a080: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
a090: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73  r)==0;.        s
a0a0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
a0b0: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69  rPtr);.        i
a0c0: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
a0d0: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
a0e0: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
a0f0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
a100: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
a110: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
a120: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
a130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a140: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
a150: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
a160: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
a170: 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73  }.  .  sqlite3Os
a180: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
a190: 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
a1a0: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
a1b0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
a1c0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a  iteFree(zMasterJ
a1d0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
a1e0: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
a1f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
a200: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
a210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
a230: 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
a240: 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69  e cache agree wi
a250: 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
a260: 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  sk.  In other wo
a270: 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74  rds,.** reread t
a280: 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74  he disk to reset
a290: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
a2a0: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
a2b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a2c0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f  alled after a ro
a2d0: 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20  llback in which 
a2e0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74  some of the dirt
a2f0: 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73  y cache.** pages
a300: 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20   had never been 
a310: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64  written out to d
a320: 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  isk.  We need to
a330: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a   roll back the.*
a340: 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20  * cache content 
a350: 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20  and the easiest 
a360: 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69  way to do that i
a370: 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  s to reread the 
a380: 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62  old content.** b
a390: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ack from the dis
a3a0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
a3b0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
a3c0: 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
a3d0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
a3e0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
a3f0: 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50  ITE_OK;.  for(pP
a400: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
a410: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
a420: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61  extAll){.    cha
a430: 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41  r zBuf[SQLITE_MA
a440: 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20  X_PAGE_SIZE];.  
a450: 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74    if( !pPg->dirt
a460: 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
a470: 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
a480: 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
a490: 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
a4a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a4b0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
a4c0: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
a4d0: 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e 70  ize*(i64)(pPg->p
a4e0: 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 69  gno-1));.      i
a4f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a500: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
a510: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
a520: 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
a530: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a540: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a550: 20 20 54 52 41 43 45 33 28 22 52 45 46 45 54 43    TRACE3("REFETC
a560: 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
a570: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
a580: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
a590: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
a5a0: 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31  ak;.      CODEC1
a5b0: 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70  (pPager, zBuf, p
a5c0: 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20  Pg->pgno, 2);.  
a5d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
a5e0: 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70  emset(zBuf, 0, p
a5f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
a600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a610: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
a620: 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48  memcmp(zBuf, PGH
a630: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
a640: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a650: 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  e) ){.      memc
a660: 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
a670: 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61  (pPg), zBuf, pPa
a680: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a690: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
a6a0: 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
a6b0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
a6c0: 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54  Reiniter(PGHDR_T
a6d0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
a6e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a6f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a700: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
a710: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
a720: 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
a730: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
a740: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
a750: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
a760: 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
a770: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
a780: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
a790: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
a7a0: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
a7b0: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
a7c0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 44    }.  pPager->pD
a7d0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75  irty = 0;.  retu
a7e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a7f0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
a800: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
a810: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
a820: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
a830: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  .** indicated..*
a840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
a850: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
a860: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
a870: 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
a880: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
a890: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
a8a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
a8b0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
a8c0: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
a8d0: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
a8e0: 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nPage);.}../*.**
a8f0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
a900: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
a910: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
a920: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
a930: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
a940: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
a950: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
a960: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
a970: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
a980: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
a990: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
a9a0: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
a9b0: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
a9c0: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
a9d0: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
a9e0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
a9f0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
aa00: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
aa10: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
aa20: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
aa30: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
aa40: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
aa50: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
aa60: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
aa70: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
aa80: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
aa90: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
aaa0: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
aab0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
aac0: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
aad0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
aae0: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
aaf0: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
ab00: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
ab10: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
ab20: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
ab30: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
ab40: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
ab50: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
ab60: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
ab70: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
ab80: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
ab90: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
aba0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
abb0: 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20  .**       name. 
abc0: 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62   The value may b
abd0: 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65  e zero (indicate
abe0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
abf0: 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  o master.**     
ac00: 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20    journal.).**  
ac10: 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20  (6)  N bytes of 
ac20: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ac30: 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61  al name.  The na
ac40: 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74  me will be nul-t
ac50: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20  erminated.**    
ac60: 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20     and might be 
ac70: 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65  shorter than the
ac80: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
ac90: 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69   (5).  If the fi
aca0: 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  rst byte.**     
acb0: 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73    of the name is
acc0: 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65   \000 then there
acd0: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   is no master jo
ace0: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74  urnal.  The mast
acf0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
ad00: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72  nal name is stor
ad10: 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
ad20: 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (7)  Zero or mo
ad30: 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
ad40: 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
ad50: 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
ad60: 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
ad70: 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
ad80: 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
ad90: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
ada0: 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
adb0: 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
adc0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
add0: 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
ade0: 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
adf0: 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69  an the first 6 i
ae00: 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
ae10: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
ae20: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
ae30: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37  nstance of the 7
ae40: 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
ae50: 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
ae60: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
ae70: 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
ae80: 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
ae90: 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
aea0: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
aeb0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
aec0: 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
aed0: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
aee0: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
aef0: 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
af00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
af10: 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
af20: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
af30: 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
af40: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
af50: 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
af60: 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
af70: 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
af80: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
af90: 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
afa0: 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
afb0: 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
afc0: 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
afd0: 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
afe0: 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
aff0: 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
b000: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
b010: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
b020: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
b030: 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
b040: 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
b050: 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
b060: 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
b070: 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
b080: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
b090: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
b0a0: 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
b0b0: 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
b0c0: 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
b0d0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
b0e0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
b0f0: 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
b100: 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
b110: 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
b120: 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
b130: 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
b140: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
b150: 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
b160: 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
b170: 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
b180: 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
b190: 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
b1a0: 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
b1b0: 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
b1c0: 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
b1d0: 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
b1e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
b1f0: 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
b200: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
b210: 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
b220: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
b230: 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
b240: 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
b250: 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
b260: 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
b270: 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
b280: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b290: 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
b2a0: 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
b2b0: 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
b2c0: 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
b2d0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
b2e0: 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
b2f0: 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
b300: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
b310: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
b320: 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
b330: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
b340: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
b350: 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
b360: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
b370: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
b380: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b390: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
b3a0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
b3b0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
b3c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b3d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b3e0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
b3f0: 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
b400: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b410: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
b420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
b430: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b450: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b460: 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
b470: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b480: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
b490: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
b4a0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4c0: 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
b4d0: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
b4e0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
b4f0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
b500: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
b510: 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
b520: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
b530: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
b540: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
b550: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
b560: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
b570: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
b580: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
b590: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
b5a0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
b5b0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
b5c0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
b5d0: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
b5e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b5f0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
b600: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
b610: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
b620: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
b630: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
b640: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
b650: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
b660: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
b670: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
b680: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
b690: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
b6a0: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
b6b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
b6c0: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
b6d0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
b6e0: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
b6f0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
b700: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
b710: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
b720: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
b730: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
b740: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
b750: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
b760: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
b770: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
b780: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
b790: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
b7a0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
b7b0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
b7c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
b7d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b7e0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b7f0: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
b800: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
b810: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
b820: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
b830: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
b840: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
b850: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
b860: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
b870: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
b880: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
b890: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
b8a0: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
b8b0: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
b8c0: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
b8d0: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
b8e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
b8f0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
b900: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
b910: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
b920: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b930: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
b940: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
b950: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
b960: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
b970: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
b980: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
b990: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
b9a0: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
b9b0: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
b9c0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
b9d0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
b9e0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
b9f0: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
ba00: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
ba10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ba20: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
ba30: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
ba40: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
ba50: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
ba60: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
ba70: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
ba80: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
ba90: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
baa0: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
bab0: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
bac0: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
bad0: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
bae0: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
baf0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
bb00: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
bb10: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
bb20: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
bb30: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
bb40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
bb50: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
bb60: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
bb70: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
bb80: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
bb90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
bba0: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
bbb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bbc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
bbd0: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
bbe0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
bbf0: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
bc00: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
bc10: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
bc20: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
bc30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
bc40: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
bc50: 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
bc60: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
bc70: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
bc80: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
bc90: 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20  le back to it's 
bca0: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
bcb0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
bcc0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
bcd0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
bce0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
bcf0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
bd00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
bd10: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
bd20: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
bd30: 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50  gDbSize==0 || pP
bd40: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
bd50: 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20  ==mxPg );.      
bd60: 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
bd70: 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
bd80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
bd90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bda0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
bdb0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
bdc0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
bdd0: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
bde0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
bdf0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
be00: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
be10: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
be20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
be30: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
be40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
be50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
be60: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
be70: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
be80: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
be90: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
bea0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
beb0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
bec0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
bed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
bee0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
bef0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bf00: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
bf10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bf20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf30: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
bf40: 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
bf50: 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
bf60: 6c 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  l, then the data
bf70: 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a  base.          *
bf80: 2a 20 69 73 20 70 72 6f 62 61 62 6c 79 20 6e 6f  * is probably no
bf90: 74 20 72 65 63 6f 76 65 72 61 62 6c 65 2e 20 20  t recoverable.  
bfa0: 52 65 74 75 72 6e 20 43 4f 52 52 55 50 54 2e 0a  Return CORRUPT..
bfb0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
bfc0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
bfd0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
bfe0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
bff0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
c000: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c010: 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
c020: 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
c030: 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
c040: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
c050: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
c060: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
c070: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
c080: 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72   }.  if( zMaster
c090: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
c0a0: 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
c0b0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
c0c0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
c0d0: 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20  eturn true,.    
c0e0: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
c0f0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
c100: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c110: 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
c120: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c130: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
c140: 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
c150: 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  r(zMaster);.    
c160: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
c170: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a  (zMaster);.  }..
c180: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
c190: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
c1a0: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
c1b0: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
c1c0: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
c1d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
c1e0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
c1f0: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
c200: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
c210: 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ZE.  ** value. R
c220: 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
c230: 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
c240: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
c250: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   */.  pPager->se
c260: 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52  ctorSize = PAGER
c270: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
c280: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c290: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
c2a0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
c2b0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  al..**.** This i
c2c0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61  s similar to pla
c2d0: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72  ying back the tr
c2e0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
c2f0: 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20  l but with.** a 
c300: 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73  few extra twists
c310: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
c320: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
c330: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
c340: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
c350: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20  start of.**     
c360: 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e      the statemen
c370: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  t is stored in p
c380: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c  Pager->stmtSize,
c390: 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20   not in the.**  
c3a0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66         journal f
c3b0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a  ile itself..**.*
c3c0: 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64  *    (2)  In add
c3d0: 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67  ition to playing
c3e0: 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d   back the statem
c3f0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  ent journal, als
c400: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
c410: 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
c420: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
c430: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
c440: 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
c450: 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
c460: 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->stmtJSize..*/.
c470: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
c480: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50  _stmt_playback(P
c490: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
c4a0: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
c4b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
c4c0: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
c4d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68  urnal */.  i64 h
c4e0: 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
c4f0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
c500: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
c510: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
c520: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
c530: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
c540: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
c550: 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
c560: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23  r->journalOff;.#
c570: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20  ifndef NDEBUG . 
c580: 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a   {.    i64 os_sz
c590: 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  J;.    rc = sqli
c5a0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
c5b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73  ager->jfd, &os_s
c5c0: 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  zJ);.    if( rc!
c5d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
c5e0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65  urn rc;.    asse
c5f0: 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20  rt( szJ==os_szJ 
c600: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
c610: 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74   /* Set hdrOff t
c620: 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20  o be the offset 
c630: 74 6f 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  to the first jou
c640: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
c650: 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 73 74  ten.  ** this st
c660: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
c670: 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20  ion, or the end 
c680: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e  of the file if n
c690: 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68  o journal.  ** h
c6a0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
c6b0: 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66  n..  */.  hdrOff
c6c0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48   = pPager->stmtH
c6d0: 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  drOff;.  assert(
c6e0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
c6f0: 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a  c || !hdrOff );.
c700: 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b    if( !hdrOff ){
c710: 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a  .    hdrOff = sz
c720: 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  J;.  }.  .  /* T
c730: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
c740: 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
c750: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
c760: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
c770: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
c780: 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
c790: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
c7a0: 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
c7b0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
c7c0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
c7d0: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
c7e0: 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46  tmtSize;..  /* F
c7f0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
c800: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
c810: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
c820: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
c830: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c840: 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
c850: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
c860: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
c870: 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64  eek(pPager->stfd
c880: 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  , 0);.  nRec = p
c890: 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
c8a0: 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
c8b0: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
c8c0: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
c8d0: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
c8e0: 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
c8f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
c900: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
c910: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c920: 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
c930: 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
c940: 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
c950: 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
c960: 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
c970: 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
c980: 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
c990: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52  .  */.  for(i=nR
c9a0: 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ec-1; i>=0; i--)
c9b0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
c9c0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
c9d0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
c9e0: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
c9f0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
ca00: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
ca10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ca20: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
ca30: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
ca40: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
ca50: 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
ca60: 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
ca70: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
ca80: 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
ca90: 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
caa0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
cab0: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
cac0: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
cad0: 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
cae0: 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
caf0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
cb00: 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
cb10: 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
cb20: 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
cb30: 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
cb40: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
cb50: 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
cb60: 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
cb70: 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
cb80: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
cb90: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
cba0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
cbb0: 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
cbc0: 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
cbd0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
cbe0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
cbf0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
cc00: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74  >jfd, pPager->st
cc10: 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
cc20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cc30: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74  .    goto end_st
cc40: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
cc50: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
cc60: 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  alOff = pPager->
cc70: 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61  stmtJSize;.  pPa
cc80: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d  ger->cksumInit =
cc90: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
cca0: 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 4a 4f  um;.  assert( JO
ccb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ccc0: 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e 70 61  ger)<(pPager->pa
ccd0: 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77  geSize+8) );.  w
cce0: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
ccf0: 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72  urnalOff <= (hdr
cd00: 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70 61 67  Off-(pPager->pag
cd10: 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20  eSize+8)) ){.   
cd20: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
cd30: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
cd40: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
cd50: 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 1);.    asser
cd60: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
cd70: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
cd80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
cd90: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
cda0: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  back;.  }..  whi
cdb0: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
cdc0: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a  nalOff < szJ ){.
cdd0: 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20      u32 nJRec;  
cde0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cdf0: 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
ce00: 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
ce10: 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
ce20: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
ce30: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  ager, szJ, &nJRe
ce40: 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
ce50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ce60: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
ce70: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
ce80: 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
ce90: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
cea0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ck;.    }.    if
ceb0: 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20  ( nJRec==0 ){.  
cec0: 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a      nJRec = (szJ
ced0: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
cee0: 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72  alOff) / (pPager
cef0: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20  ->pageSize+8);. 
cf00: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e     }.    for(i=n
cf10: 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20  JRec-1; i>=0 && 
cf20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cf30: 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a  ff < szJ; i--){.
cf40: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
cf50: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
cf60: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
cf70: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
cf80: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
cf90: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
cfa0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
cfb0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
cfc0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
cfd0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
cfe0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
cff0: 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
d000: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
d010: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ( rc==SQLITE_OK)
d020: 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   {.    pPager->j
d030: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
d040: 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
d050: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
d060: 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
d070: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d080: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
d090: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
d0a0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
d0b0: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
d0c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
d0d0: 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69  ager_set_cachesi
d0e0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
d0f0: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
d100: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
d110: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
d120: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
d130: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
d140: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
d150: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
d160: 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
d170: 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
d180: 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
d190: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
d1a0: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
d1b0: 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
d1c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
d1d0: 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
d1e0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
d1f0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
d200: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
d210: 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
d220: 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
d230: 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
d240: 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
d250: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
d260: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d270: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
d280: 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
d290: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
d2a0: 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
d2b0: 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
d2c0: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
d2d0: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
d2f0: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
d300: 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
d310: 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
d320: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d330: 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
d340: 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
d350: 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
d360: 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
d370: 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
d380: 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
d390: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
d3a0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d3c0: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
d3d0: 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
d3e0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
d3f0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d400: 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
d410: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
d420: 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
d430: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
d440: 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
d450: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
d460: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
d470: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
d480: 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
d490: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
d4a0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
d4b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d4c0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
d4d0: 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
d4e0: 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
d4f0: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
d500: 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
d510: 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
d520: 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
d540: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
d550: 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
d560: 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
d570: 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
d580: 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
d590: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
d5a0: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
d5b0: 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
d5d0: 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
d5e0: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
d5f0: 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
d600: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
d610: 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
d620: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
d630: 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
d640: 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
d650: 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
d660: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d670: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
d680: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
d690: 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65  er_set_safety_le
d6a0: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
d6b0: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
d6c0: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
d6d0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
d6e0: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
d6f0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
d700: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
d710: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
d720: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
d730: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
d740: 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c  ull_fsync = full
d750: 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50  _fsync;.  if( pP
d760: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
d770: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
d780: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
d790: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
d7a0: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
d7b0: 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
d7c0: 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
d7d0: 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
d7e0: 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
d7f0: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
d800: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
d810: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
d820: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
d830: 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
d840: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
d850: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
d860: 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
d870: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
d880: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
d890: 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
d8a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
d8b0: 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a 2a 20  e into zFile.** 
d8c0: 28 7a 46 69 6c 65 20 6d 75 73 74 20 62 65 20 61  (zFile must be a
d8d0: 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54  t least SQLITE_T
d8e0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74  EMPNAME_SIZE byt
d8f0: 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65  es long.)  Write
d900: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
d910: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
d920: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
d930: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
d940: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
d950: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
d960: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   fail..**.** The
d970: 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
d980: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
d990: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
d9a0: 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63   when it is.** c
d9b0: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
d9c0: 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65   int sqlite3page
d9d0: 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20  r_opentemp(char 
d9e0: 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a  *zFile, OsFile *
d9f0: 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74  *pFd){.  int cnt
da00: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
da10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
da20: 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
da30: 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
da40: 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
da50: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
da60: 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
da70: 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b    do{.    cnt--;
da80: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65  .    sqlite3OsTe
da90: 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65  mpFileName(zFile
daa0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
dab0: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
dac0: 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31  ve(zFile, pFd, 1
dad0: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74  );.  }while( cnt
dae0: 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  >0 && rc!=SQLITE
daf0: 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
db00: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74  E_NOMEM );.  ret
db10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
db20: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
db30: 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
db40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
db50: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
db60: 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
db70: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
db80: 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
db90: 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
dba0: 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
dbb0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
dbc0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ll to sqlite3pag
dbd0: 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20  er_get() and is 
dbe0: 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
dbf0: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
dc00: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
dc10: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70  d using sqlite3p
dc20: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a  ager_unref()..**
dc30: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
dc40: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
dc50: 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
dc60: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
dc70: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
dc80: 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
dc90: 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
dca0: 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
dcb0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
dcc0: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
dcd0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
dce0: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
dcf0: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
dd00: 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
dd10: 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
dd20: 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
dd30: 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
dd40: 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
dd50: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
dd60: 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
dd70: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
dd80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
dd90: 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20  r_open(.  Pager 
dda0: 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
ddb0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
ddc0: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
ddd0: 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
dde0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
ddf0: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
de00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
de10: 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
de20: 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
de30: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
de40: 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
de50: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
de60: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
de70: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
de80: 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
de90: 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
dea0: 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a   */.){.  Pager *
deb0: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 63 68  pPager = 0;.  ch
dec0: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
ded0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d  e = 0;.  int nam
dee0: 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70 69 6c  eLen;  /* Compil
def0: 65 72 20 69 73 20 77 72 6f 6e 67 2e 20 54 68 69  er is wrong. Thi
df00: 73 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  s is always init
df10: 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75  ialized before u
df20: 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a  se */.  OsFile *
df30: 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fd;.  int rc = S
df40: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
df50: 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  i;.  int tempFil
df60: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d  e = 0;.  int mem
df70: 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
df80: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e  adOnly = 0;.  in
df90: 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
dfa0: 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
dfb0: 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a  IT_JOURNAL)==0;.
dfc0: 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
dfd0: 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
dfe0: 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
dff0: 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  0;.  char zTemp[
e000: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
e010: 53 49 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51  SIZE];.#ifdef SQ
e020: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
e030: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
e040: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61  /* A malloc() ca
e050: 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c  nnot fail in sql
e060: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
e070: 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   as one or more 
e080: 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d  calls to .  ** m
e090: 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76  alloc() must hav
e0a0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d  e already been m
e0b0: 61 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65  ade by this thre
e0c0: 61 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74  ad before it get
e0d0: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70  s.  ** to this p
e0e0: 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73  oint. This means
e0f0: 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20   the ThreadData 
e100: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61  must have been a
e110: 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79  llocated already
e120: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68  .  ** so that Th
e130: 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20  readData.nAlloc 
e140: 63 61 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77  can be set. It w
e150: 6f 75 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20  ould be nice to 
e160: 61 73 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74  assert.  ** that
e170: 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
e180: 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  oc is non-zero, 
e190: 62 75 74 20 61 6c 61 73 20 74 68 69 73 20 62 72  but alas this br
e1a0: 65 61 6b 73 20 74 65 73 74 20 63 61 73 65 73 20  eaks test cases 
e1b0: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  .  ** written to
e1c0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65   invoke the page
e1d0: 72 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f  r directly..  */
e1e0: 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  .  ThreadData *p
e1f0: 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  Tsd = sqlite3Thr
e200: 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73  eadData();.  ass
e210: 65 72 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e  ert( pTsd );.#en
e220: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 6d 61 6c  dif..  /* If mal
e230: 6c 6f 63 28 29 20 68 61 73 20 61 6c 72 65 61 64  loc() has alread
e240: 79 20 66 61 69 6c 65 64 20 72 65 74 75 72 6e 20  y failed return 
e250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 42 65  SQLITE_NOMEM. Be
e260: 66 6f 72 65 20 65 76 65 6e 0a 20 20 2a 2a 20 74  fore even.  ** t
e270: 65 73 74 69 6e 67 20 66 6f 72 20 74 68 69 73 2c  esting for this,
e280: 20 73 65 74 20 2a 70 70 50 61 67 65 72 20 74 6f   set *ppPager to
e290: 20 4e 55 4c 4c 20 73 6f 20 74 68 65 20 63 61 6c   NULL so the cal
e2a0: 6c 65 72 20 6b 6e 6f 77 73 20 74 68 65 20 70 61  ler knows the pa
e2b0: 67 65 72 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ger.  ** structu
e2c0: 72 65 20 77 61 73 20 6e 65 76 65 72 20 61 6c 6c  re was never all
e2d0: 6f 63 61 74 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  ocated. .  */.  
e2e0: 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20  *ppPager = 0;.  
e2f0: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
e300: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
e310: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e320: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
e330: 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f  et(&fd, 0, sizeo
e340: 66 28 66 64 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70  f(fd));..  /* Op
e350: 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
e360: 65 20 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50  e and set zFullP
e370: 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74  athname to point
e380: 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a   at malloc()ed .
e390: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74    ** memory cont
e3a0: 61 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c  aining the compl
e3b0: 65 74 65 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e  ete filename (i.
e3c0: 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e. including the
e3d0: 20 64 69 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a   directory)..  *
e3e0: 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
e3f0: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
e400: 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ] ){.#ifndef SQL
e410: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
e420: 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  B.    if( strcmp
e430: 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d  (zFilename,":mem
e440: 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ory:")==0 ){.   
e450: 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
e460: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
e470: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
e480: 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  ("");.    }else.
e490: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
e4a0: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
e4b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
e4c0: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
e4d0: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  me);.      if( z
e4e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
e4f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e500: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
e510: 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ite(zFullPathnam
e520: 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c  e, &fd, &readOnl
e530: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
e540: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
e550: 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
e560: 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
e570: 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65   &fd);.    zFile
e580: 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  name = zTemp;.  
e590: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
e5a0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
e5b0: 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  athname(zFilenam
e5c0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
e5d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e5e0: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
e5f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
e600: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   Allocate the Pa
e610: 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 20 41  ger structure. A
e620: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 61  s part of the sa
e630: 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61  me allocation, a
e640: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61  llocate.  ** spa
e650: 63 65 20 66 6f 72 20 74 68 65 20 66 75 6c 6c 20  ce for the full 
e660: 70 61 74 68 73 20 6f 66 20 74 68 65 20 66 69 6c  paths of the fil
e670: 65 2c 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  e, directory and
e680: 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28   journal .  ** (
e690: 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c  Pager.zFilename,
e6a0: 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72   Pager.zDirector
e6b0: 79 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  y and Pager.zJou
e6c0: 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  rnal)..  */.  if
e6d0: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
e6e0: 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d  ){.    nameLen =
e6f0: 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74   strlen(zFullPat
e700: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 67  hname);.    pPag
e710: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
e720: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  c( sizeof(*pPage
e730: 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b  r) + nameLen*3 +
e740: 20 33 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   30 );.  }..  /*
e750: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
e760: 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  ured in either o
e770: 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
e780: 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65 6d  ve, free the mem
e790: 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  ory .  ** pointe
e7a0: 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74  d to by zFullPat
e7b0: 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65 20  hname, free the 
e7c0: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
e7d0: 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a 20  and close the . 
e7e0: 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65 20   ** file. Since 
e7f0: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
e800: 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65   allocated there
e810: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73   is no need to s
e820: 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67  et .  ** any Pag
e830: 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61  er.errMask varia
e840: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bles..  */.  if(
e850: 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46 75   !pPager || !zFu
e860: 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 72 63  llPathname || rc
e870: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e880: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
e890: 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  e(&fd);.    sqli
e8a0: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
e8b0: 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  name);.    sqlit
e8c0: 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
e8d0: 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d     return ((rc==
e8e0: 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54  SQLITE_OK)?SQLIT
e8f0: 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d  E_NOMEM:rc);.  }
e900: 0a 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e  ..  TRACE3("OPEN
e910: 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
e920: 41 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75  ANDLEID(fd), zFu
e930: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70  llPathname);.  p
e940: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
e950: 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
e960: 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
e970: 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
e980: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
e990: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50  nameLen+1];.  pP
e9a0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
e9b0: 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
e9c0: 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  tory[nameLen+1];
e9d0: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
e9e0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75  ->zFilename, zFu
e9f0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
ea00: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  trcpy(pPager->zD
ea10: 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50  irectory, zFullP
ea20: 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72  athname);..  for
ea30: 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20  (i=nameLen; i>0 
ea40: 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
ea50: 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
ea60: 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
ea70: 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
ea80: 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
ea90: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
eaa0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c  ->zJournal, zFul
eab0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71  lPathname);.  sq
eac0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
ead0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  thname);.  strcp
eae0: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
eaf0: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
eb00: 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61  journal");.  pPa
eb10: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
eb20: 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
eb30: 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
eb40: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
eb50: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
eb60: 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
eb70: 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
eb80: 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
eb90: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
eba0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
ebb0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
ebc0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
ebd0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
ebe0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
ebf0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
ec00: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
ec10: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ec20: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
ec30: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f  T_PAGE_SIZE;.  /
ec40: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
ec50: 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
ec60: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
ec70: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
ec80: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
ec90: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
eca0: 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 20  ->nMaxPage = 0; 
ecb0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
ecc0: 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 61 73 73  age = 100;.  ass
ecd0: 65 72 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43  ert( PAGER_UNLOC
ece0: 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61  K==0 );.  /* pPa
ecf0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
ed00: 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
ed10: 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
ed20: 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
ed30: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
ed40: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
ed50: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
ed60: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
ed70: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
ed80: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  ;.  /* pPager->n
ed90: 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a  eedSync = 0; */.
eda0: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
edb0: 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
edc0: 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
edd0: 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  al;.  pPager->fu
ede0: 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72  llSync = (pPager
edf0: 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20  ->noSync?0:1);. 
ee00: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
ee10: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
ee20: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
ee30: 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
ee40: 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
ee50: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
ee60: 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45  ->nExtra = FORCE
ee70: 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72  _ALIGNMENT(nExtr
ee80: 61 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  a);.  pPager->se
ee90: 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52  ctorSize = PAGER
eea0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
eeb0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
eec0: 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
eed0: 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
eee0: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
eef0: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
ef00: 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61  sh)); */.  *ppPa
ef10: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69  ger = pPager;.#i
ef20: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ef30: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
ef40: 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 70  MENT.  pPager->p
ef50: 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61  Next = pTsd->pPa
ef60: 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61  ger;.  pTsd->pPa
ef70: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65  ger = pPager;.#e
ef80: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
ef90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
efa0: 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
efb0: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
efc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
efd0: 70 61 67 65 72 5f 73 65 74 5f 62 75 73 79 68 61  pager_set_busyha
efe0: 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61  ndler(Pager *pPa
eff0: 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72  ger, BusyHandler
f000: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b   *pBusyHandler){
f010: 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
f020: 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48  Handler = pBusyH
f030: 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  andler;.}../*.**
f040: 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63   Set the destruc
f050: 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  tor for this pag
f060: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
f070: 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  , the destructor
f080: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68   is called.** wh
f090: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
f0a0: 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70   count on each p
f0b0: 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f  age reaches zero
f0c0: 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  .  The destructo
f0d0: 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  r can.** be used
f0e0: 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66   to clean up inf
f0f0: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
f100: 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70  extra segment ap
f110: 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70  pended to each p
f120: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  age..**.** The d
f130: 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74  estructor is not
f140: 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73   called as a res
f150: 75 6c 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  ult sqlite3pager
f160: 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44  _close().  .** D
f170: 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f  estructors are o
f180: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
f190: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
f1a0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
f1b0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73  te3pager_set_des
f1c0: 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70  tructor(Pager *p
f1d0: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44  Pager, void (*xD
f1e0: 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  esc)(void*,int))
f1f0: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
f200: 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
f210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
f220: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
f230: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
f240: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
f250: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
f260: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
f270: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
f280: 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
f290: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
f2a0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
f2b0: 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
f2c0: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
f2d0: 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
f2e0: 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
f2f0: 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
f300: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
f310: 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
f320: 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
f330: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
f340: 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
f350: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
f360: 67 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72  ger_set_reiniter
f370: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
f380: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
f390: 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  void*,int)){.  p
f3a0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
f3b0: 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
f3c0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67  *.** Set the pag
f3d0: 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e 20  e size.  Return 
f3e0: 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20 49  the new size.  I
f3f0: 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
f400: 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69  w page.** size i
f410: 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  s inappropriate,
f420: 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
f430: 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
f440: 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e  s selected.** an
f450: 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  d returned..*/.i
f460: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
f470: 73 65 74 5f 70 61 67 65 73 69 7a 65 28 50 61 67  set_pagesize(Pag
f480: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
f490: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73  pageSize){.  ass
f4a0: 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35  ert( pageSize>=5
f4b0: 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
f4c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
f4d0: 53 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70  SIZE );.  if( !p
f4e0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
f4f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
f500: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
f510: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
f520: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
f530: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
f540: 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
f550: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
f560: 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
f570: 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
f580: 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
f590: 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
f5a0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
f5b0: 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
f5c0: 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
f5d0: 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
f5e0: 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
f5f0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
f600: 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
f610: 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
f620: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
f630: 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
f640: 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
f650: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
f660: 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
f670: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
f680: 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
f690: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
f6a0: 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
f6b0: 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
f6c0: 74 3b 0a 76 6f 69 64 20 63 6c 65 61 72 5f 73 69  t;.void clear_si
f6d0: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f6e0: 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  (){.  sqlite3_io
f6f0: 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20 30 3b 0a  _error_hit = 0;.
f700: 7d 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  }.void disable_s
f710: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
f720: 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
f730: 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
f740: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
f750: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
f760: 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
f770: 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
f780: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
f790: 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
f7a0: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
f7b0: 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
f7c0: 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
f7d0: 66 69 6e 65 20 63 6c 65 61 72 5f 73 69 6d 75 6c  fine clear_simul
f7e0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 0a  ated_io_error().
f7f0: 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
f800: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
f810: 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
f820: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
f830: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
f840: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
f850: 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
f860: 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
f870: 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
f880: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
f890: 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
f8a0: 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20  s to. .**.** No 
f8b0: 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69  error checking i
f8c0: 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69  s done. The rati
f8d0: 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73  onal for this is
f8e0: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
f8f0: 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63  ion .** may be c
f900: 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68  alled even if th
f910: 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
f920: 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e  exist or contain
f930: 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a   a header. In .*
f940: 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71  * these cases sq
f950: 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69  lite3OsRead() wi
f960: 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  ll return an err
f970: 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65  or, to which the
f980: 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73   correct .** res
f990: 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f  ponse is to zero
f9a0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70   the memory at p
f9b0: 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  Dest and continu
f9c0: 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72  e.  A real IO er
f9d0: 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65  ror .** will pre
f9e0: 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e  sumably recur an
f9f0: 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c  d be picked up l
fa00: 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e  ater (Todo: Thin
fa10: 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a  k about this)..*
fa20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
fa30: 65 72 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64  er_read_filehead
fa40: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
fa50: 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
fa60: 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
fa70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
fa80: 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
fa90: 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
faa0: 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
fab0: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
fac0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
fad0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
fae0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
faf0: 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  0);.    enable_s
fb00: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
fb10: 72 73 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  rs();.    rc = s
fb20: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
fb30: 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
fb40: 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  N);.    if( rc==
fb50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
fb60: 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
fb70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
fb80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
fb90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fba0: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
fbb0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
fbc0: 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
fbd0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
fbe0: 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a  th.** pPager. .*
fbf0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44  *.** If the PEND
fc00: 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e  ING_BYTE lies on
fc10: 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74   the page direct
fc20: 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  ly after the end
fc30: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c   of the.** file,
fc40: 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
fc50: 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66  his page part of
fc60: 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46   the file too. F
fc70: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
fc80: 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69  * PENDING_BYTE i
fc90: 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65  s byte 4096 (the
fca0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70   first byte of p
fcb0: 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73  age 5) and the s
fcc0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ize of the.** fi
fcd0: 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73  le is 4096 bytes
fce0: 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 5 is returned 
fcf0: 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f  instead of 4..*/
fd00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
fd10: 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65  r_pagecount(Page
fd20: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
fd30: 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  4 n;.  int rc;. 
fd40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
fd50: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
fd60: 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b  er->dbSize>=0 ){
fd70: 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d  .    n = pPager-
fd80: 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73  >dbSize;.  } els
fd90: 65 20 7b 0a 20 20 20 20 69 66 28 20 28 72 63 20  e {.    if( (rc 
fda0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
fdb0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
fdc0: 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  &n))!=SQLITE_OK 
fdd0: 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
fde0: 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
fdf0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
fe00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fe10: 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d  n>0 && n<pPager-
fe20: 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
fe30: 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65     n = 1;.    }e
fe40: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20  lse{.      n /= 
fe50: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
fe60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fe70: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
fe80: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
fe90: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
fea0: 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  ize = n;.    }. 
feb0: 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e   }.  if( n==(PEN
fec0: 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
fed0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20  ->pageSize) ){. 
fee0: 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65     n++;.  }.  re
fef0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e  turn n;.}...#ifn
ff00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ff10: 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43  MEMORYDB./*.** C
ff20: 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79  lear a PgHistory
ff30: 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63   block.*/.static
ff40: 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f   void clearHisto
ff50: 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48  ry(PgHistory *pH
ff60: 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72  ist){.  sqliteFr
ff70: 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29  ee(pHist->pOrig)
ff80: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
ff90: 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
ffa0: 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30  pHist->pOrig = 0
ffb0: 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  ;.  pHist->pStmt
ffc0: 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64   = 0;.}.#else.#d
ffd0: 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f  efine clearHisto
ffe0: 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry(x).#endif../*
fff0: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
10000 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
10010 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
10020 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a  l(Pager*);../*.*
10030 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
10040 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
10050 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20  n. Also set the 
10060 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30  page number to 0
10070 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20   to indicate.** 
10080 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
10090 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79   not part of any
100a0 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69   hash chain. Thi
100b0 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
100c0 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c  cause the.** sql
100d0 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61  ite3pager_movepa
100e0 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e  ge() routine can
100f0 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e   leave a page in
10100 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72   the .** pNextFr
10110 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73  ee/pPrevFree lis
10120 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
10130 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
10140 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69  -chain..*/.stati
10150 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73  c void unlinkHas
10160 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50  hChain(Pager *pP
10170 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
10180 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67  ){.  if( pPg->pg
10190 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  no==0 ){.    ass
101a0 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
101b0 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  ash==0 && pPg->p
101c0 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
101d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
101e0 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
101f0 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
10200 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
10210 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
10220 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  vHash;.  }.  if(
10230 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
10240 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
10250 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67  Pager->aHash[pPg
10260 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
10270 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67  ->nHash-1)]!=pPg
10280 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
10290 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73  evHash->pNextHas
102a0 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  h = pPg->pNextHa
102b0 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sh;.  }else{.   
102c0 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67   int h = pPg->pg
102d0 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
102e0 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67  ash-1);.    pPag
102f0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
10300 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
10310 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
10320 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f  {.    clearHisto
10330 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ry(PGHDR_TO_HIST
10340 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a  (pPg, pPager));.
10350 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20    }.  pPg->pgno 
10360 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78  = 0;.  pPg->pNex
10370 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  tHash = pPg->pPr
10380 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f  evHash = 0;.}../
10390 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61  *.** Unlink a pa
103a0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
103b0 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
103c0 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65  of all pages whe
103d0 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61  re nRef==0).** a
103e0 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  nd from its hash
103f0 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
10400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10410 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64   unlinkPage(PgHd
10420 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
10430 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
10440 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65  pPager;..  /* Ke
10450 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e  ep the pFirstSyn
10460 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ced pointer poin
10470 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73  ting at the firs
10480 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70  t synchronized p
10490 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  age */.  if( pPg
104a0 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
104b0 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67  Synced ){.    Pg
104c0 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
104d0 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69  extFree;.    whi
104e0 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
104f0 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
10500 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
10510 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
10520 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
10530 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
10540 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
10550 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
10560 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
10570 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
10580 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
10590 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  xtFree;.  }else{
105a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
105b0 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67  ger->pFirst==pPg
105c0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
105d0 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
105e0 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69  extFree;.  }.  i
105f0 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
10600 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  e ){.    pPg->pN
10610 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
10620 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
10630 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
10640 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10650 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
10660 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
10670 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
10680 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ee;.  }.  pPg->p
10690 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
106a0 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a  pPrevFree = 0;..
106b0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
106c0 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
106d0 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  able */.  unlink
106e0 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
106f0 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64  , pPg);.}..#ifnd
10700 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
10710 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68  EMORYDB./*.** Th
10720 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
10730 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ed to truncate a
10740 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
10750 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a  base.  Delete.**
10760 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65   all pages whose
10770 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20   pgno is larger 
10780 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
10790 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66  ize and is unref
107a0 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65  erenced..** Refe
107b0 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72  renced pages lar
107c0 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
107d0 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f  >dbSize are zero
107e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
107f0 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74  id memoryTruncat
10800 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
10810 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
10820 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a    PgHdr **ppPg;.
10830 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70    int dbSize = p
10840 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
10850 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72    ppPg = &pPager
10860 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28  ->pAll;.  while(
10870 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d   (pPg = *ppPg)!=
10880 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  0 ){.    if( pPg
10890 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29  ->pgno<=dbSize )
108a0 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  {.      ppPg = &
108b0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
108c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67     }else if( pPg
108d0 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
108e0 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
108f0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
10900 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10910 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  );.      ppPg = 
10920 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
10930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10940 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e   *ppPg = pPg->pN
10950 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e  extAll;.      un
10960 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
10970 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
10980 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Pg);.      sqlit
10990 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  eFree(pPg);.    
109a0 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d    pPager->nPage-
109b0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  -;.    }.  }.}.#
109c0 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d  else.#define mem
109d0 6f 72 79 54 72 75 6e 63 61 74 65 28 70 29 0a 23  oryTruncate(p).#
109e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  endif../*.** Try
109f0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
10a00 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e  k on a file.  In
10a10 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61  voke the busy ca
10a20 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
10a30 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ck.** is current
10a40 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
10a50 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20  .  Repeat until 
10a60 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
10a70 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c  k returns.** fal
10a80 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
10a90 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
10aa0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
10ab0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
10ac0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
10ad0 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
10ae0 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
10af0 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
10b00 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
10b10 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
10b20 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
10b30 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
10b40 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
10b50 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
10b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
10b70 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
10b80 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
10b90 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
10ba0 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
10bb0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
10bc0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
10bd0 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
10be0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10bf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
10c00 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
10c10 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
10c20 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
10c30 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
10c40 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
10c50 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  & sqlite3InvokeB
10c60 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
10c70 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r->pBusyHandler)
10c80 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
10c90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10ca0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
10cb0 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
10cc0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10cd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
10ce0 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
10cf0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
10d00 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e  pages specified.
10d10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
10d20 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
10d30 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
10d40 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
10d50 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67  rc;.  sqlite3pag
10d60 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
10d70 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
10d80 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
10d90 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
10da0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74  errCode;.    ret
10db0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
10dc0 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e  ( nPage>=(unsign
10dd0 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
10de0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10df0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10e00 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
10e10 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
10e20 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
10e30 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
10e40 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
10e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10e60 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
10e70 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
10e80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10e90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10ea0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
10eb0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
10ec0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
10ed0 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
10ee0 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ing. */.  rc = p
10ef0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
10f00 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
10f10 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  IVE_LOCK);.  if(
10f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10f30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10f40 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67  .  }..  rc = pag
10f50 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
10f60 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66  er, nPage);.  if
10f70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10f80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
10f90 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
10fa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
10fc0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
10fd0 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
10fe0 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
10ff0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
11000 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
11010 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
11020 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
11030 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
11040 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
11050 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
11060 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
11070 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
11080 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
11090 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
110a0 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
110b0 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
110c0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
110d0 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
110e0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
110f0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
11100 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
11110 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
11120 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
11130 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
11140 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
11150 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
11160 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
11170 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
11180 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
11190 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
111a0 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
111b0 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
111c0 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
111d0 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
111e0 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
111f0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
11200 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
11210 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
11220 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  _close(Pager *pP
11230 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11240 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 23 69 66  pPg, *pNext;.#if
11250 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11260 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
11270 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  ENT.  /* A mallo
11280 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  c() cannot fail 
11290 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  in sqlite3Thread
112a0 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72  Data() as one or
112b0 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a   more calls to .
112c0 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75    ** malloc() mu
112d0 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
112e0 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69  been made by thi
112f0 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20  s thread before 
11300 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20  it gets.  ** to 
11310 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73  this point. This
11320 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61   means the Threa
11330 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20  dData must have 
11340 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
11350 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74  lready.  ** so t
11360 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
11370 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74  Alloc can be set
11380 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44  ..  */.  ThreadD
11390 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69  ata *pTsd = sqli
113a0 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b  te3ThreadData();
113b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
113c0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
113d0 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c  Tsd && pTsd->nAl
113e0 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  loc );.#endif.. 
113f0 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d   switch( pPager-
11400 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  >state ){.    ca
11410 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  se PAGER_RESERVE
11420 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  D:.    case PAGE
11430 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63  R_SYNCED: .    c
11440 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ase PAGER_EXCLUS
11450 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IVE: {.      /* 
11460 57 65 20 69 67 6e 6f 72 65 20 61 6e 79 20 49 4f  We ignore any IO
11470 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f 63 63   errors that occ
11480 75 72 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  ur during the ro
11490 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20  llback.      ** 
114a0 6f 70 65 72 61 74 69 6f 6e 2e 20 53 6f 20 64 69  operation. So di
114b0 73 61 62 6c 65 20 49 4f 20 65 72 72 6f 72 20 73  sable IO error s
114c0 69 6d 75 6c 61 74 69 6f 6e 20 73 6f 20 74 68 61  imulation so tha
114d0 74 20 74 65 73 74 69 6e 67 0a 20 20 20 20 20 20  t testing.      
114e0 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72 65 20 65 61  ** works more ea
114f0 73 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  sily..      */. 
11500 20 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d       disable_sim
11510 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
11520 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
11530 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
11540 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 65  pPager);.      e
11550 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
11560 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
11570 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
11580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11590 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
115a0 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
115b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
115c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
115d0 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Code || pPager->
115e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
115f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11600 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 41     }.    case PA
11610 47 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20  GER_SHARED: {.  
11620 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
11630 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11640 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
11650 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
11660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11670 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
11680 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
11690 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
116a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
116b0 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50    }.  }.  for(pP
116c0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
116d0 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
116e0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
116f0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
11700 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
11710 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
11720 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
11730 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
11740 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73  rt( !pPg->always
11750 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
11760 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
11770 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
11780 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
11790 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a  >pStmt );.    }.
117a0 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 78 74  #endif.    pNext
117b0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
117c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
117d0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52 41  (pPg);.  }.  TRA
117e0 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE2("CLOSE %d\n"
117f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
11800 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
11810 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
11820 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
11830 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67  lOpen==0 && pPag
11840 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29  er->stmtOpen==0)
11850 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
11860 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
11870 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
11880 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
11890 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
118a0 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
118b0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
118c0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
118d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
118e0 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73  Close(&pPager->s
118f0 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  tfd);.  }.  sqli
11900 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
11910 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65  er->fd);.  /* Te
11920 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
11930 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
11940 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
11950 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
11960 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
11970 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
11980 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
11990 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
119a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
119b0 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
119c0 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65  NAGEMENT.  /* Re
119d0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 66  move the pager f
119e0 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  rom the linked l
119f0 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 73 74  ist of pagers st
11a00 61 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20  arting at .  ** 
11a10 54 68 72 65 61 64 44 61 74 61 2e 70 50 61 67 65  ThreadData.pPage
11a20 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61  r if memory-mana
11a30 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65  gement is enable
11a40 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
11a50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67  ager==pTsd->pPag
11a60 65 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e  er ){.    pTsd->
11a70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d  pPager = pPager-
11a80 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
11a90 0a 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70  .    Pager *pTmp
11aa0 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d  ;.    for(pTmp =
11ab0 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70   pTsd->pPager; p
11ac0 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67  Tmp->pNext!=pPag
11ad0 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  er; pTmp=pTmp->p
11ae0 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70  Next){}.    pTmp
11af0 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72  ->pNext = pPager
11b00 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e  ->pNext;.  }.#en
11b10 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65  dif.  sqliteFree
11b20 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
11b30 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
11b40 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
11b50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11b60 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
11b70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
11b80 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
11b90 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
11ba0 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  te3pager_pagenum
11bb0 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ber(void *pData)
11bc0 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44  {.  PgHdr *p = D
11bd0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
11be0 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ta);.  return p-
11bf0 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pgno;.}../*.** 
11c00 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
11c10 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
11c20 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
11c30 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
11c40 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
11c50 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
11c60 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
11c70 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
11c80 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
11c90 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
11ca0 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
11cb0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
11cc0 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
11cd0 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
11ce0 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
11cf0 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
11d00 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
11d10 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
11d20 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
11d30 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
11d40 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
11d50 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
11d60 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
11d70 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
11d80 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
11d90 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
11da0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
11db0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
11dc0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
11dd0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
11de0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
11df0 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
11e00 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d     if( pPg==pPg-
11e10 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
11e20 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ynced ){.      P
11e30 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
11e40 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
11e50 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
11e60 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
11e70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
11e80 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
11e90 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
11ea0 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   p;.    }.    if
11eb0 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
11ec0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
11ed0 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
11ee0 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
11ef0 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
11f00 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
11f10 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
11f20 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
11f30 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
11f40 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
11f50 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
11f60 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
11f70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
11f80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11f90 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61  pPg->pPager->pLa
11fa0 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
11fb0 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ree;.    }.    p
11fc0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66  Pg->pPager->nRef
11fd0 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e  ++;.  }.  pPg->n
11fe0 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref++;.  REFINFO
11ff0 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20  (pPg);.}.#ifdef 
12000 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
12010 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
12020 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
12030 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
12040 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
12050 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
12060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12070 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
12080 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
12090 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
120a0 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
120b0 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
120c0 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
120d0 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
120e0 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
120f0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
12100 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
12110 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
12120 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
12130 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
12140 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
12150 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
12160 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69  te3pager_ref(voi
12170 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
12180 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
12190 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
121a0 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
121b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
121c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
121d0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
121e0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
121f0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
12200 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
12210 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
12220 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
12230 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
12240 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
12250 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
12260 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
12270 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
12280 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
12290 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
122a0 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
122b0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
122c0 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
122d0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
122e0 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
122f0 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
12300 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
12310 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
12320 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
12330 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
12340 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
12350 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
12360 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
12370 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
12380 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
12390 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
123a0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
123b0 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
123c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
123d0 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
123e0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
123f0 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
12400 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
12410 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
12420 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
12430 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
12440 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
12450 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
12460 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
12470 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
12480 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
12490 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
124a0 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
124b0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
124c0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
124d0 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
124e0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
124f0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
12500 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
12510 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
12520 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
12530 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
12540 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
12550 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
12560 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12570 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
12580 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
12590 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
125a0 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
125b0 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
125c0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
125d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
125e0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
125f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12600 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
12610 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
12620 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
12630 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
12640 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
12650 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
12660 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
12670 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
12680 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
12690 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
126a0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
126b0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
126c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
126d0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
126e0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
126f0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
12700 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
12710 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
12720 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
12730 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
12740 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
12750 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
12760 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
12770 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
12780 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
12790 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
127a0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
127b0 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
127c0 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
127d0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
127e0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
127f0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
12800 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
12810 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
12820 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
12830 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12840 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
12850 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
12860 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
12870 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
12880 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12890 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
128a0 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
128b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  }.#endif.      {
128c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
128d0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
128e0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
128f0 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
12900 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
12910 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
12920 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
12930 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
12940 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
12950 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
12960 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
12970 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
12980 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
12990 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
129a0 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
129b0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
129c0 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20  lback. .        
129d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
129e0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
129f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  ){.          TRA
12a00 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
12a10 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
12a20 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
12a30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12a40 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
12a50 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
12a60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
12a70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
12a90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
12aa0 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20  k(pPager->jfd,. 
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
12ad0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
12ae0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
12af0 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69  gic));.        i
12b00 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
12b10 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
12b20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
12b30 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
12b40 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
12b50 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12b60 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  rc;..        rc 
12b70 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
12b80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
12b90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
12ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12bb0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
12bd0 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
12be0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
12bf0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
12c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12c10 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
12c20 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
12c30 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  fsync);.      if
12c40 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
12c50 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
12c60 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
12c70 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
12c80 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
12c90 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
12ca0 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
12cb0 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
12cc0 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
12cd0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
12ce0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
12cf0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
12d00 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
12d10 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
12d20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
12d30 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
12d40 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  er->pFirst;.  }.
12d50 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
12d60 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65    /* If the Page
12d70 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
12d80 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68  is clear then th
12d90 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
12da0 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20  .  ** flag must 
12db0 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f  also be clear fo
12dc0 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65  r all pages.  Ve
12dd0 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20  rify that this. 
12de0 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73   ** invariant is
12df0 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c   true..  */.  el
12e00 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  se{.    for(pPg=
12e10 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
12e20 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
12e30 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73  tAll){.      ass
12e40 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
12e50 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  nc==0 );.    }. 
12e60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12e70 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
12e80 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  =pPager->pFirst 
12e90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
12ea0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12eb0 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c  *.** Merge two l
12ec0 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f  ists of pages co
12ed0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
12ee0 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72  y and in pgno or
12ef0 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62  der..** Do not b
12f00 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70  oth fixing the p
12f10 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
12f20 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  rs..*/.static Pg
12f30 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c  Hdr *merge_pagel
12f40 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50  ist(PgHdr *pA, P
12f50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48  gHdr *pB){.  PgH
12f60 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69  dr result, *pTai
12f70 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65  l;.  pTail = &re
12f80 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  sult;.  while( p
12f90 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69  A && pB ){.    i
12fa0 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e  f( pA->pgno<pB->
12fb0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54  pgno ){.      pT
12fc0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41  ail->pDirty = pA
12fd0 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
12fe0 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70  pA;.      pA = p
12ff0 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  A->pDirty;.    }
13000 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69  else{.      pTai
13010 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
13020 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42        pTail = pB
13030 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d  ;.      pB = pB-
13040 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
13050 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20   }.  if( pA ){. 
13060 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13070 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69   = pA;.  }else i
13080 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61  f( pB ){.    pTa
13090 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
130a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
130b0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ail->pDirty = 0;
130c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
130d0 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a  sult.pDirty;.}..
130e0 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c  /*.** Sort the l
130f0 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
13100 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
13110 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20  by pgno.  Pages 
13120 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  are.** connected
13130 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74   by pDirty point
13140 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44  ers.  The pPrevD
13150 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72  irty pointers ar
13160 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62  e.** corrupted b
13170 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a  y this sort..*/.
13180 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
13190 55 43 4b 45 54 20 32 35 0a 73 74 61 74 69 63 20  UCKET 25.static 
131a0 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65  PgHdr *sort_page
131b0 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29  list(PgHdr *pIn)
131c0 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53  {.  PgHdr *a[N_S
131d0 4f 52 54 5f 42 55 43 4b 45 54 5d 2c 20 2a 70 3b  ORT_BUCKET], *p;
131e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73  .  int i;.  mems
131f0 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(a, 0, sizeof(
13200 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  a));.  while( pI
13210 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e  n ){.    p = pIn
13220 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70  ;.    pIn = p->p
13230 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
13240 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f  irty = 0;.    fo
13250 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f  r(i=0; i<N_SORT_
13260 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a  BUCKET-1; i++){.
13270 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d        if( a[i]==
13280 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69  0 ){.        a[i
13290 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62  ] = p;.        b
132a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
132b0 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d  e{.        p = m
132c0 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
132d0 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  i], p);.        
132e0 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  a[i] = 0;.      
132f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13300 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  i==N_SORT_BUCKET
13310 2d 31 20 29 7b 0a 20 20 20 20 20 20 61 5b 69 5d  -1 ){.      a[i]
13320 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
13330 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20  t(a[i], p);.    
13340 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d  }.  }.  p = a[0]
13350 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e  ;.  for(i=1; i<N
13360 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b  _SORT_BUCKET; i+
13370 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67  +){.    p = merg
13380 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b  e_pagelist(p, a[
13390 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  i]);.  }.  retur
133a0 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
133b0 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
133c0 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
133d0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
133e0 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
133f0 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
13400 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
13410 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
13420 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20  e file and mark 
13430 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63  them all.** as c
13440 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
13450 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
13460 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
13470 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
13480 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
13490 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
134a0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
134b0 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
134c0 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
134d0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
134e0 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
134f0 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
13500 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
13510 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
13520 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
13530 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
13540 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
13550 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
13560 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
13570 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
13580 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
13590 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
135a0 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
135b0 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
135c0 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
135d0 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
135e0 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
135f0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
13600 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
13610 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
13620 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
13630 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
13640 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
13650 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
13660 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
13670 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
13680 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
13690 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
136a0 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
136b0 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
136c0 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
136d0 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
136e0 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
136f0 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
13700 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
13710 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
13720 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
13730 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
13740 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
13750 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
13760 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
13770 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
13780 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
13790 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
137a0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
137b0 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
137c0 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
137d0 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
137e0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
137f0 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
13800 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
13810 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
13820 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
13830 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
13840 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
13850 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
13860 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
13870 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
13880 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13890 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
138a0 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72  }..  pList = sor
138b0 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74  t_pagelist(pList
138c0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
138d0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
138e0 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
138f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13900 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
13910 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
13920 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
13930 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
13940 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
13950 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  rc;.    /* If th
13960 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
13970 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
13980 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
13990 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
139a0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
139b0 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
139c0 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67 65  eans sqlite3page
139d0 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61 73  r_truncate() was
139e0 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
139f0 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
13a00 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
13a10 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
13a20 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
13a30 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
13a40 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
13a50 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  the file..    */
13a60 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
13a70 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
13a80 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Size ){.      ch
13a90 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45  ar *pData = CODE
13aa0 43 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C2(pPager, PGHDR
13ab0 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
13ac0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
13ad0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  ;.      TRACE3("
13ae0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
13af0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13b00 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
13b10 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o);.      rc = s
13b20 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
13b30 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
13b40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
13b50 65 29 3b 0a 20 20 20 20 20 20 54 45 53 54 5f 49  e);.      TEST_I
13b60 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69  NCR(pPager->nWri
13b70 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  te);.    }.#ifnd
13b80 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
13b90 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33  se{.      TRACE3
13ba0 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
13bb0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
13bc0 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d  (pPager), pList-
13bd0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65  >pgno);.    }.#e
13be0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20  ndif.    if( rc 
13bf0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13c00 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20   pList->dirty = 
13c10 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
13c20 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
13c30 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
13c40 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
13c50 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
13c60 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
13c70 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
13c80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13c90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c  OK;.}../*.** Col
13ca0 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79  lect every dirty
13cb0 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72   page into a dir
13cc0 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72  ty list and.** r
13cd0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
13ce0 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
13cf0 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70  hat list.  All p
13d00 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c  ages are.** coll
13d10 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68  ected even if th
13d20 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  ey are still in 
13d30 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  use..*/.static P
13d40 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f  gHdr *pager_get_
13d50 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
13d60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
13d70 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
13d80 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pDirty;.}../*.*
13d90 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
13da0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
13db0 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67  journal on the g
13dc0 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41  iven pager..** A
13dd0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
13de0 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  one that needs t
13df0 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
13e00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
13e10 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
13e20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13e30 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
13e40 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
13e50 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
13e60 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
13e70 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
13e80 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
13e90 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
13ea0 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74  same name.  Just
13eb0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
13ec0 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
13ed0 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
13ee0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
13ef0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
13f00 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74  useJournal ) ret
13f10 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
13f20 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
13f30 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
13f40 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  al) ) return 0;.
13f50 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43    if( sqlite3OsC
13f60 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
13f70 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72  (pPager->fd) ) r
13f80 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
13f90 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
13fa0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30  count(pPager)==0
13fb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
13fc0 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
13fd0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72  zJournal);.    r
13fe0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
13ff0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
14000 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
14010 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
14020 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
14030 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
14040 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d. .**.** This r
14050 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72  outine may retur
14060 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  n SQLITE_IOERR, 
14070 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53  SQLITE_FULL or S
14080 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a  QLITE_OK. It .**
14090 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68   does not set th
140a0 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  e pPager->errCod
140b0 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
140c0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
140d0 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70  recycle(Pager *p
140e0 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f  Pager, int syncO
140f0 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29  k, PgHdr **ppPg)
14100 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
14110 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20    *ppPg = 0;..  
14120 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
14130 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
14140 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
14150 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
14160 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74   ** require us t
14170 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  o do an fsync() 
14180 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  on the journal..
14190 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61    */.  pPg = pPa
141a0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
141b0 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  d;..  /* If we c
141c0 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
141d0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
141e0 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
141f0 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68  ync().  ** on th
14200 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
14210 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
14220 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
14230 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79  s is a.  ** very
14240 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
14250 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
14260 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
14270 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a  ut sometimes.  *
14280 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
14290 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lped..  */.  if(
142a0 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65   pPg==0 && pPage
142b0 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e  r->pFirst && syn
142c0 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a  cOk && !MEMDB){.
142d0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
142e0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
142f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
14300 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14310 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
14320 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
14330 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  nc ){.      /* I
14340 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
14350 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
14360 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
14370 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
14380 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
14390 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
143a0 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
143b0 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  ying a journal. 
143c0 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74       ** header t
143d0 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
143e0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
143f0 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
14400 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ve.      ** alre
14410 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
14420 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
14430 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
14440 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ader is.      **
14450 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
14460 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
14470 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
14480 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
14490 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
144a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
144b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
144c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
144d0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
144e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
144f0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
14500 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14510 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
14520 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
14530 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rst;.  }.  if( p
14540 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Pg==0 ){.    ret
14550 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14560 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
14570 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
14580 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
14590 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
145a0 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
145b0 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69   dirty..  */.  i
145c0 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
145d0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
145e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
145f0 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
14600 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
14610 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
14620 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
14630 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  irty = 0;.    rc
14640 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
14650 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
14660 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
14680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
14690 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
146a0 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
146b0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
146c0 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
146d0 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
146e0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
146f0 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  hen.  ** set the
14700 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f   global alwaysRo
14710 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75  llback flag, thu
14720 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a  s disabling the.
14730 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74    ** sqlite_dont
14740 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69  _rollback() opti
14750 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  mization for the
14760 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72   rest of this tr
14770 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
14780 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  It is necessary 
14790 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75  to do this becau
147a0 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b  se the page mark
147b0 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
147c0 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  k.  ** might be 
147d0 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61  reloaded at a la
147e0 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20  ter time but at 
147f0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f  that point we wo
14800 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  n't remember.  *
14810 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61  * that is was ma
14820 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
14830 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  ack.  This means
14840 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
14850 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72  must.  ** be mar
14860 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
14870 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20  lback from here 
14880 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  on out..  */.  i
14890 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
148a0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70 50  llback ){.    pP
148b0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
148c0 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  back = 1;.  }.. 
148d0 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f   /* Unlink the o
148e0 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ld page from the
148f0 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74   free list and t
14900 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20  he hash table.  
14910 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28  */.  unlinkPage(
14920 70 50 67 29 3b 0a 20 20 54 45 53 54 5f 49 4e 43  pPg);.  TEST_INC
14930 52 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 29  R(pPager->nOvfl)
14940 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67  ;..  *ppPg = pPg
14950 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14960 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
14970 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14980 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73  called to free s
14990 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d  uperfluous dynam
149a0 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
149b0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20   memory.** held 
149c0 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73  by the pager sys
149d0 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75  tem. Memory in u
149e0 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65  se by any SQLite
149f0 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64   pager allocated
14a00 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65  .** by the curre
14a10 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65  nt thread may be
14a20 20 73 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e   sqliteFree()ed.
14a30 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74  .**.** nReq is t
14a40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
14a50 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71  es of memory req
14a60 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73  uired. Once this
14a70 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65   much has.** bee
14a80 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20  n released, the 
14a90 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
14aa0 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c  . A negative val
14ab0 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e  ue for nReq mean
14ac0 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63  s.** free as muc
14ad0 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
14ae0 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e  ible. The return
14af0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f   value is the to
14b00 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  tal number .** o
14b10 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  f bytes of memor
14b20 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23  y released..*/.#
14b30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
14b40 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
14b50 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65  EMENT.int sqlite
14b60 33 70 61 67 65 72 5f 72 65 6c 65 61 73 65 5f 6d  3pager_release_m
14b70 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b  emory(int nReq){
14b80 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44  .  const ThreadD
14b90 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71  ata *pTsdro = sq
14ba0 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52  lite3ThreadDataR
14bb0 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 50 61 67  eadOnly();.  Pag
14bc0 65 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 52 65  er *p;.  int nRe
14bd0 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e  leased = 0;.  in
14be0 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t i;..  /* If th
14bf0 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  e the global mut
14c00 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68 69 73  ex is held, this
14c10 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 6f   subroutine beco
14c20 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b  mes a.  ** o-op;
14c30 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66 20 6d   zero bytes of m
14c40 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65 64 2e  emory are freed.
14c50 20 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73    This is becaus
14c60 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74  e.  ** some of t
14c70 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65 64 20  he code invoked 
14c80 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
14c90 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a 20 74   may also.  ** t
14ca0 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ry to obtain the
14cb0 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74 69 6e   mutex, resultin
14cc0 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63 6b 2e  g in a deadlock.
14cd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
14ce0 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30 29 20  te3OsInMutex(0) 
14cf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
14d00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65 72  .  }..  /* Outer
14d10 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66  most loop runs f
14d20 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 69  or at most two i
14d30 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72 73 74  terations. First
14d40 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a 20 20   iteration we.  
14d50 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64 20 6d  ** try to find m
14d60 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20 62  emory that can b
14d70 65 20 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f  e released witho
14d80 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63  ut calling fsync
14d90 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20  (). Second.  ** 
14da0 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69 63 68  iteration (which
14db0 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20 74 68   only runs if th
14dc0 65 20 66 69 72 73 74 20 66 61 69 6c 65 64 20 74  e first failed t
14dd0 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79 74 65  o free nReq byte
14de0 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  s of.  ** memory
14df0 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74  ) is permitted t
14e00 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20  o call fsync(). 
14e10 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75 72 73  This is of cours
14e20 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a  e much more .  *
14e30 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a  * expensive..  *
14e40 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  /.  for(i=0; i<=
14e50 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a  1; i++){..    /*
14e60 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
14e70 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70 61 67  l the SQLite pag
14e80 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ers opened by th
14e90 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
14ea0 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70  . */.    for(p=p
14eb0 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 20 70  Tsdro->pPager; p
14ec0 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e   && (nReq<0 || n
14ed0 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20  Released<nReq); 
14ee0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
14ef0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
14f00 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20       int rc;..  
14f10 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20      /* For each 
14f20 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72  pager, try to fr
14f30 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73  ee as many pages
14f40 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69   as possible (wi
14f50 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20  thout .      ** 
14f60 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20  calling fsync() 
14f70 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
14f80 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
14f90 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  f the outermost 
14fa0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e  .      ** loop).
14fb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14fc0 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b  while( SQLITE_OK
14fd0 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f 72 65  ==(rc = pager_re
14fe0 63 79 63 6c 65 28 70 2c 20 69 2c 20 26 70 50 67  cycle(p, i, &pPg
14ff0 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20  )) && pPg) {.   
15000 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f       /* We've fo
15010 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72  und a page to fr
15020 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  ee. At this poin
15030 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  t the page has b
15040 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  een .        ** 
15050 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
15060 20 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65   page hash-table
15070 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  , free-list and 
15080 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20  synced-list .   
15090 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53       ** (pFirstS
150a0 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74  ynced). It is st
150b0 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70  ill in the all p
150c0 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74  ages (pAll) list
150d0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65  . .        ** Re
150e0 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69  move it from thi
150f0 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72  s list before fr
15100 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  eeing..        *
15110 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64  *.        ** Tod
15120 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61 67  o: Check the Pag
15130 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f  er.pStmt list to
15140 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   make sure this 
15150 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20  is Ok. It .     
15160 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69     ** probably i
15170 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20  s though..      
15180 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48    */.        PgH
15190 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20  dr *pTmp;.      
151a0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b    assert( pPg );
151b0 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 72 65  .        page_re
151c0 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
151d0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
151e0 20 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e 70 41    if( pPg==p->pA
151f0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
15200 20 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e   p->pAll = pPg->
15210 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
15220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15230 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 2d 3e     for( pTmp=p->
15240 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  pAll; pTmp->pNex
15250 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d  tAll!=pPg; pTmp=
15260 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29  pTmp->pNextAll )
15270 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d  {}.          pTm
15280 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  p->pNextAll = pP
15290 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
152a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
152b0 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69  Released += sqli
152c0 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29  teAllocSize(pPg)
152d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
152e0 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
152f0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
15300 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15310 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72         /* An err
15320 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  or occured whils
15330 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
15340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
15350 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  r .        ** jo
15360 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72  urnal in pager_r
15370 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72  ecycle(). The er
15380 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72  ror is not retur
15390 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20  ned to the .    
153a0 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66      ** caller of
153b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
153c0 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65  Instead, set the
153d0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
153e0 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ariable..       
153f0 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69   ** The error wi
15400 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
15410 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75  o the user (or u
15420 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73  sers, in the cas
15430 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  e .        ** of
15440 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20   a shared pager 
15450 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61  cache) of the pa
15460 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ger for which th
15470 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e  e error occured.
15480 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
15490 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 26      assert( (rc&
154a0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
154b0 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ERR || rc==SQLIT
154c0 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  E_FULL );.      
154d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61    assert( p->sta
154e0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
154f0 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61  ED );.        pa
15500 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63 29  ger_error(p, rc)
15510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15520 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52    }..  return nR
15530 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69  eleased;.}.#endi
15540 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
15550 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
15560 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  MENT */../*.** A
15570 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
15580 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
15590 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
155a0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
155b0 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
155c0 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
155d0 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
155e0 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
155f0 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
15600 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
15610 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20  ** A _get works 
15620 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
15630 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
15640 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
15650 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
15660 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
15670 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
15680 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
15690 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
156a0 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
156b0 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
156c0 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
156d0 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
156e0 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
156f0 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
15700 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
15710 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
15720 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
15730 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
15740 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
15750 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
15760 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
15770 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
15780 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
15790 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
157a0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
157b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
157c0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
157d0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
157e0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
157f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
15800 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
15810 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c  s routine and _l
15820 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
15830 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
15840 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
15850 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
15860 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
15870 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
15880 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
15890 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
158a0 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
158b0 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75  n whereas _looku
158c0 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
158d0 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
158e0 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
158f0 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
15900 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
15910 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
15920 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
15930 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
15940 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
15950 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
15960 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20  _lookup() never 
15970 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
15980 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
15990 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
159a0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
159b0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
159c0 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72  3pager_get(Pager
159d0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
159e0 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61  gno, void **ppPa
159f0 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ge){.  PgHdr *pP
15a00 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
15a10 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
15a20 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
15a30 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
15a40 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
15a50 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
15a60 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
15a70 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72  s, or zero, is r
15a80 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
15a90 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
15aa0 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
15ab0 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
15ac0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
15ad0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
15ae0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
15af0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
15b00 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
15b10 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
15b20 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
15b30 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
15b40 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70  Pager!=0 );.  *p
15b50 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  pPage = 0;.  if(
15b60 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
15b70 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
15b80 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
15b90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
15ba0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
15bb0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
15bc0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
15bd0 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
15be0 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
15bf0 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
15c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
15c10 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
15c20 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d  r->nRef==0 && !M
15c30 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66 28 20  EMDB ){.    if( 
15c40 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
15c50 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ock ){.      rc 
15c60 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
15c70 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
15c80 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
15c90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15ca0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
15cb0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
15cc0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
15cd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
15ce0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
15cf0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
15d00 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
15d10 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
15d20 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
15d30 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
15d40 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
15d50 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
15d60 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
15d70 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48 6f  */.    if( hasHo
15d80 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
15d90 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 20 47 65   ){.       /* Ge
15da0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
15db0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
15dc0 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
15dd0 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
15de0 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
15df0 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
15e00 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
15e10 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
15e20 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
15e30 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
15e40 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
15e50 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
15e60 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
15e70 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
15e80 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
15e90 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
15ea0 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
15eb0 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  at the.       **
15ec0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
15ed0 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
15ee0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
15ef0 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
15f00 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b   .       ** back
15f10 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  ..       ** .   
15f20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
15f30 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
15f40 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
15f50 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
15f60 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73 65  the.       ** se
15f70 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
15f80 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
15f90 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
15fa0 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
15fb0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
15fc0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
15fd0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15fe0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
15ff0 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
16000 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
16010 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
16020 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
16030 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16050 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
16060 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
16070 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
16080 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
16090 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
160a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
160b0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
160c0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d 0a  , rc);.       }.
160d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
160e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
160f0 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20  LUSIVE;..       
16100 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
16110 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
16120 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
16130 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
16140 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e      ** we are un
16150 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  able to open the
16160 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
16170 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
16180 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
16190 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
161a0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
161b0 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
161c0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
161d0 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
161e0 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
161f0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
16200 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20  holds.       ** 
16210 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f  a write lock, so
16220 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
16230 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77  any chance of tw
16240 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20  o or more.      
16250 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70   ** processes op
16260 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
16270 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  l at the same ti
16280 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  me..       */.  
16290 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
162a0 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
162b0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
162c0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
162d0 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
162e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
162f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
16300 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
16310 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
16320 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
16330 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
16340 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  K;.         retu
16350 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
16360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16370 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16380 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  pen = 1;.       
16390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
163a0 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
163b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
163c0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
163d0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
163e0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ter = 0;.       
163f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
16400 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  dr = 0;..       
16410 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
16420 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
16430 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
16440 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
16450 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
16460 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
16470 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
16480 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70  */.       rc = p
16490 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
164a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66  ager);.       if
164b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
164c0 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  ){.         retu
164d0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
164e0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
164f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
16500 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
16510 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
16520 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65  or page in cache
16530 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
16540 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
16550 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
16560 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  ( MEMDB && pPage
16570 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
16580 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
16590 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
165a0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
165b0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
165c0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
165d0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
165e0 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
165f0 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
16600 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45     int h;.    TE
16610 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
16620 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28 20  nMiss);.    if( 
16630 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
16640 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
16650 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
16660 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20  0 || MEMDB ){.  
16670 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
16680 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  new page */.    
16690 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
166a0 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61  age>=pPager->nHa
166b0 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  sh ){.        pa
166c0 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
166d0 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20  table(pPager,.  
166e0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
166f0 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36  >nHash<256 ? 256
16700 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68   : pPager->nHash
16710 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  *2);.        if(
16720 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d   pPager->nHash==
16730 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
16740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16750 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
16760 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20      }.      pPg 
16770 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
16780 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20  w( sizeof(*pPg) 
16790 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
167a0 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
167d0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a   pPager->nExtra.
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
16800 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
16810 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20  istory) );.     
16820 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
16830 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
16840 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
16850 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
16860 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pPg, 0, sizeof(
16870 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66  *pPg));.      if
16880 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
16890 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
168a0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
168b0 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ger), 0, sizeof(
168c0 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20  PgHistory));.   
168d0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
168e0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
168f0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
16900 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70  tAll = pPager->p
16910 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65  All;.      pPage
16920 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  r->pAll = pPg;. 
16930 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
16940 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
16950 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50  pPager->nPage>pP
16960 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29  ager->nMaxPage )
16970 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
16980 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61  ( pPager->nMaxPa
16990 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61  ge==(pPager->nPa
169a0 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  ge-1) );.       
169b0 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67   pPager->nMaxPag
169c0 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e++;.      }.   
169d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
169e0 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65   = pager_recycle
169f0 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
16a00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
16a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
16a40 73 73 65 72 74 28 70 50 67 29 20 3b 0a 20 20 20  ssert(pPg) ;.   
16a50 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f   }.    pPg->pgno
16a60 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28   = pgno;.    if(
16a70 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
16a80 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
16a90 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
16aa0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
16ab0 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79  lite3CheckMemory
16ac0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
16ad0 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20  nal, pgno/8);.  
16ae0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16af0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
16b00 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
16b10 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65  Journal = (pPage
16b20 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
16b30 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
16b40 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20  o&7)))!=0;.     
16b50 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
16b60 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
16b70 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
16b80 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
16b90 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
16ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16bb0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
16bc0 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
16bd0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20  ager->stmtSize. 
16be0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
16bf0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
16c00 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
16c10 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20  gno&7)))!=0 ){. 
16c20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
16c30 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
16c40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16c50 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72    page_remove_fr
16c60 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  om_stmt_list(pPg
16c70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61 6b  );.    }.    mak
16c80 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
16c90 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
16ca0 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
16cb0 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ;..    pPager->n
16cc0 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Ref++;.    if( p
16cd0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
16ce0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
16cf0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
16d00 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
16d10 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
16d20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16d30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
16d40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70  {.      sqlite3p
16d50 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52  ager_unref(PGHDR
16d60 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a  _TO_DATA(pPg));.
16d70 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65        rc = pPage
16d80 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
16d90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16da0 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c   }..    /* Popul
16db0 61 74 65 20 74 68 65 20 70 61 67 65 20 77 69 74  ate the page wit
16dc0 68 20 64 61 74 61 2c 20 65 69 74 68 65 72 20 62  h data, either b
16dd0 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  y reading from t
16de0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
16df0 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20 73  ** file, or by s
16e00 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69 72  etting the entir
16e10 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a  e page to zero..
16e20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
16e30 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
16e40 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3c 28 69  count(pPager)<(i
16e50 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
16e60 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
16e70 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
16e80 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
16e90 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
16ea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
16eb0 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a  rt( MEMDB==0 );.
16ec0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16ed0 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
16ee0 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69  >fd, (pgno-1)*(i
16ef0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
16f00 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
16f10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16f20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
16f30 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
16f40 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
16f50 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20  _DATA(pPg),.    
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f70 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
16f80 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
16f90 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
16fa0 33 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  3("FETCH %d page
16fb0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
16fc0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
16fd0 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  no);.      CODEC
16fe0 31 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  1(pPager, PGHDR_
16ff0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
17000 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20  g->pgno, 3);.   
17010 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17020 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
17030 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
17040 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  EAD ){.        p
17050 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  Pg->pgno = 0;.  
17060 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
17070 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54  er_unref(PGHDR_T
17080 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20  O_DATA(pPg));.  
17090 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
170a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
170b0 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28        TEST_INCR(
170c0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
170d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
170e0 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70     /* Link the p
170f0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
17100 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
17110 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28      h = pgno & (
17120 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
17130 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
17140 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 67  no!=0 );.    pPg
17150 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
17160 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
17170 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
17180 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
17190 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
171a0 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
171b0 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
171c0 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  sh->pPrevHash==0
171d0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
171e0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
171f0 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ash = pPg;.    }
17200 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17210 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
17220 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
17230 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
17240 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Pg);.#endif.  }e
17250 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
17260 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
17270 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
17280 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53 54  che. */.    TEST
17290 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
172a0 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72 65  it);.    page_re
172b0 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  f(pPg);.  }.  *p
172c0 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f  pPage = PGHDR_TO
172d0 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65  _DATA(pPg);.  re
172e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
172f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
17300 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
17310 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
17320 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
17330 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
17340 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
17350 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
17360 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
17370 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
17380 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
17390 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53  n cache..**.** S
173a0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
173b0 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65  ager_get().  The
173c0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
173d0 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
173e0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70  .** and sqlite3p
173f0 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68  ager_get() is th
17400 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
17410 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
17420 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
17430 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
17440 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
17450 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
17460 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
17470 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
17480 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
17490 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
174a0 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
174b0 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
174c0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
174d0 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
174e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
174f0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
17500 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
17510 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
17520 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
17530 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
17540 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
17550 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
17560 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
17570 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
17580 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
17590 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
175a0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
175b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
175c0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
175d0 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
175e0 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
175f0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
17600 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
17610 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
17620 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
17630 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
17640 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
17650 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
17660 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
17670 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
17680 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
17690 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
176a0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
176b0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
176c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
176d0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
176e0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
176f0 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  _unref(void *pDa
17700 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
17710 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  g;..  /* Decreme
17720 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
17730 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
17740 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20  page.  */.  pPg 
17750 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
17760 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
17770 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
17780 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
17790 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
177a0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
177b0 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
177c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
177d0 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
177e0 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
177f0 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
17800 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
17810 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
17820 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
17830 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
17840 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
17850 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
17860 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
17870 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
17880 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
17890 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
178a0 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
178b0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
178c0 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
178d0 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
178e0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
178f0 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
17900 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
17910 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
17920 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
17930 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
17940 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
17950 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
17960 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
17970 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
17980 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
17990 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
179a0 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
179b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
179c0 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
179d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
179e0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
179f0 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
17a00 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
17a10 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
17a20 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
17a30 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
17a40 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
17a50 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
17a60 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
17a70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
17a80 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
17a90 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45  ->nRef==0 && !ME
17aa0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67  MDB ){.      pag
17ab0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
17ac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
17af0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
17b00 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
17b10 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
17b20 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
17b30 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
17b40 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
17b50 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
17b60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
17b70 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
17b80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
17b90 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
17ba0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
17bb0 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
17bc0 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
17bd0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
17be0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
17bf0 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
17c00 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
17c10 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
17c20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
17c30 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
17c40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
17c50 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
17c60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
17c70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
17c80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17c90 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
17ca0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
17cb0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
17cc0 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
17cd0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
17ce0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
17cf0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
17d00 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
17d10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
17d20 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
17d30 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
17d40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
17d50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17d60 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
17d70 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
17d80 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
17d90 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
17da0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
17db0 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
17dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
17df0 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  le);.  pPager->j
17e00 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
17e10 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
17e20 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
17e30 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
17e40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
17e60 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
17e70 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
17e80 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
17e90 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
17ea0 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
17eb0 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  sync);.  sqlite3
17ec0 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
17ed0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
17ee0 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
17ef0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
17f00 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e  rectory(pPager->
17f10 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69  jfd, pPager->zDi
17f20 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67  rectory);.  pPag
17f30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
17f40 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
17f50 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
17f60 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
17f70 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
17f80 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
17f90 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
17fa0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
17fb0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
17fc0 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
17fd0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
17fe0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
17ff0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
18000 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
18010 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
18020 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72  er->dbSize;..  r
18030 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
18040 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  Hdr(pPager);..  
18050 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
18060 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
18070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18080 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
18090 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50  er_stmt_begin(pP
180a0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
180b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
180c0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
180d0 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  EM ){.    rc = p
180e0 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
180f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
18100 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18110 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
18120 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
18130 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18140 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  ;..failed_to_ope
18150 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c  n_journal:.  sql
18160 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
18170 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  aInJournal);.  p
18180 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
18190 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d  l = 0;.  if( rc=
181a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
181b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
181c0 77 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66  was a malloc() f
181d0 61 69 6c 75 72 65 2c 20 74 68 65 6e 20 77 65 20  ailure, then we 
181e0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f 73  will not be clos
181f0 69 6e 67 20 74 68 65 20 70 61 67 65 72 0a 20 20  ing the pager.  
18200 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64 65    ** file. So de
18210 6c 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  lete any journal
18220 20 66 69 6c 65 20 77 65 20 6d 61 79 20 68 61 76   file we may hav
18230 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 2e 20  e just created. 
18240 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a  Otherwise,.    *
18250 2a 20 74 68 65 20 73 79 73 74 65 6d 20 77 69 6c  * the system wil
18260 6c 20 67 65 74 20 63 6f 6e 66 75 73 65 64 2c 20  l get confused, 
18270 77 65 20 68 61 76 65 20 61 20 72 65 61 64 2d 6c  we have a read-l
18280 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
18290 61 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79 73  and a.    ** mys
182a0 74 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  terious journal 
182b0 68 61 73 20 61 70 70 65 61 72 65 64 20 69 6e 20  has appeared in 
182c0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a  the filesystem..
182d0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
182e0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
182f0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
18300 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
18310 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
18320 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
18330 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
18340 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
18350 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
18360 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
18370 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
18380 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
18390 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
183a0 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
183b0 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
183c0 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
183d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
183e0 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
183f0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
18400 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
18410 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20  r_rollback() is 
18420 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
18430 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
18440 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
18450 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
18460 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20  ager_unref() is 
18470 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65  called to on eve
18480 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ry outstanding p
18490 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
184a0 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74  irst parameter t
184b0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
184c0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
184d0 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20  ny open page of 
184e0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
184f0 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63  file.  Nothing c
18500 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65  hanges about the
18510 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73   page - it is us
18520 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20  ed merely to.** 
18530 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65  acquire a pointe
18540 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
18550 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20  tructure and as 
18560 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65  proof that there
18570 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61   is.** already a
18580 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
18590 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
185a0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72  * The second par
185b0 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
185c0 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
185d0 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65  in bytes to rese
185e0 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73  rve for a.** mas
185f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18600 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61  -name at the sta
18610 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
18620 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65  l when it is cre
18630 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f  ated..**.** A jo
18640 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
18650 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20  ened if this is 
18660 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
18670 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f  file.  For tempo
18680 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74  rary.** files, t
18690 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68  he opening of th
186a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
186b0 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
186c0 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20   there is an.** 
186d0 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77  actual need to w
186e0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
186f0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nal..**.** If th
18700 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
18710 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66  ready reserved f
18720 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73  or writing, this
18730 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
18740 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78  -op..**.** If ex
18750 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f  Flag is true, go
18760 20 61 68 65 61 64 20 61 6e 64 20 67 65 74 20 61   ahead and get a
18770 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
18780 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
18790 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74  immediately inst
187a0 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75  ead of waiting u
187b0 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66  ntil we try to f
187c0 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
187d0 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69   The.** exFlag i
187e0 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74  s ignored if a t
187f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
18800 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f  ready active..*/
18810 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
18820 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44  r_begin(void *pD
18830 61 74 61 2c 20 69 6e 74 20 65 78 46 6c 61 67 29  ata, int exFlag)
18840 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
18850 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
18860 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
18870 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
18880 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
18890 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
188a0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
188b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
188c0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
188d0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
188e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
188f0 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
18900 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18910 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
18920 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  l==0 );.    if( 
18930 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
18940 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
18950 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
18960 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
18970 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
18980 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d  r->dbSize;.    }
18990 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
189a0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
189b0 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
189c0 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
189d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
189e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
189f0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
18a00 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
18a10 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
18a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
18a30 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
18a40 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
18a50 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
18a60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18a70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18a80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18a90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
18ab0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
18ac0 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
18ad0 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  2("TRANSACTION %
18ae0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
18af0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66  ager));.      if
18b00 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
18b10 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d  rnal && !pPager-
18b20 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
18b30 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
18b40 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
18b50 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
18b60 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18b70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
18b80 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79 2e  ke a page dirty.
18b90 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79 20    Set its dirty 
18ba0 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74 20  flag and add it 
18bb0 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20  to the dirty.** 
18bc0 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
18bd0 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69  atic void makeDi
18be0 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b  rty(PgHdr *pPg){
18bf0 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
18c00 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  y==0 ){.    Page
18c10 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
18c20 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
18c30 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
18c40 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70   pPg->pDirty = p
18c50 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20  Pager->pDirty;. 
18c60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
18c70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  Dirty ){.      p
18c80 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70  Pager->pDirty->p
18c90 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b  PrevDirty = pPg;
18ca0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
18cb0 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a  pPrevDirty = 0;.
18cc0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
18cd0 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a  ty = pPg;.  }.}.
18ce0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
18cf0 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72  ge clean.  Clear
18d00 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61   its dirty bit a
18d10 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  nd remove it fro
18d20 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  m the.** dirty p
18d30 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  age list..*/.sta
18d40 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
18d50 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  an(PgHdr *pPg){.
18d60 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
18d70 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   ){.    pPg->dir
18d80 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ty = 0;.    if( 
18d90 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  pPg->pDirty ){. 
18da0 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
18db0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
18dc0 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a  Pg->pPrevDirty;.
18dd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
18de0 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b  g->pPrevDirty ){
18df0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
18e00 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d  vDirty->pDirty =
18e10 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
18e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
18e30 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72  Pg->pPager->pDir
18e40 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
18e50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
18e60 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
18e70 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
18e80 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
18e90 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
18ea0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
18eb0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
18ec0 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
18ed0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
18ee0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
18ef0 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
18f00 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
18f10 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
18f20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18f30 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
18f40 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
18f50 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
18f60 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52  acquires a RESER
18f70 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
18f80 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
18f90 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  e RESERVED.** lo
18fa0 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
18fb0 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72  acquired, this r
18fc0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
18fd0 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65  QLITE_BUSY.  The
18fe0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
18ff0 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66  ine must check f
19000 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76  or that return v
19010 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65  alue and be care
19020 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68  ful not to.** ch
19030 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
19040 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f  ta until this ro
19050 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
19060 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
19070 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
19080 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
19090 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20  written because 
190a0 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c  the disk is full
190b0 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
190c0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
190d0 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64  QLITE_FULL and d
190e0 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  oes an immediate
190f0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c   rollback..** Al
19100 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69  l subsequent wri
19110 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f  te attempts also
19120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
19130 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a  ULL until there.
19140 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20  ** is a call to 
19150 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
19160 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33  mit() or sqlite3
19170 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
19180 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
19190 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
191a0 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44  r_write(void *pD
191b0 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
191c0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
191d0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
191e0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
191f0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
19200 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19210 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
19220 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
19230 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
19240 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  e ){ .    return
19250 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
19260 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
19270 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
19280 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19290 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61  E_PERM;.  }..  a
192a0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
192b0 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
192c0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
192d0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
192e0 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
192f0 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
19300 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
19310 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
19320 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
19330 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
19340 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d  t away..  */.  m
19350 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
19360 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
19370 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53  nal && (pPg->inS
19380 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  tmt || pPager->s
19390 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a  tmtInUse==0) ){.
193a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
193b0 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65  yCache = 1;.  }e
193c0 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
193d0 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
193e0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
193f0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
19400 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
19410 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
19420 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
19430 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
19440 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
19450 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
19460 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
19470 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
19480 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
19490 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
194a0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
194b0 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
194c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
194d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
194e0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
194f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
19500 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28  ite3pager_begin(
19510 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 69  pData, 0);.    i
19520 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19530 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19540 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
19550 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
19560 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
19570 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
19580 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
19590 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
195a0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
195b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
195c0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
195d0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
195e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
195f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19600 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19610 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
19620 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  || !pPager->useJ
19630 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
19640 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
19650 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
19660 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
19670 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
19680 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
19690 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
196a0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
196b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
196c0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
196d0 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
196e0 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
196f0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
19700 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
19710 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
19720 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
19730 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
19740 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72  urnal && (pPager
19750 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ->useJournal || 
19760 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20  MEMDB) ){.      
19770 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
19780 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
19790 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
197a0 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20      int szPg;.  
197b0 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
197c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
197d0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
197e0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
197f0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
19800 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f        TRACE3("JO
19810 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
19820 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
19830 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
19840 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
19850 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
19860 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
19870 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
19880 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
19890 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
198a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  e );.          i
198b0 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
198c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
198d0 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
198e0 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
198f0 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
19900 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
19910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
19920 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
19930 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64  u32 cksum, saved
19940 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
19950 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b   *pData2, *pEnd;
19960 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
19970 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
19980 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
19990 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
199a0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
199b0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
199c0 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
199d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
199e0 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
199f0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
19a00 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
19a10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19a20 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
19a30 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
19a40 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
19a50 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
19a60 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
19a70 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
19a80 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
19a90 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
19aa0 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
19ab0 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e 64 20  .          pEnd 
19ac0 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61 67 65  = pData2 + pPage
19ad0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
19ae0 20 20 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d         pData2 -=
19af0 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61   4;.          sa
19b00 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e  ved = *(u32*)pEn
19b10 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  d;.          put
19b20 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73  32bits(pEnd, cks
19b30 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  um);.          s
19b40 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  zPg = pPager->pa
19b50 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20  geSize+8;.      
19b60 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44      put32bits(pD
19b70 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ata2, pPg->pgno)
19b80 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
19b90 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
19ba0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
19bb0 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20  ta2, szPg);.    
19bc0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
19bd0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67  urnalOff += szPg
19be0 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
19bf0 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E4("JOURNAL %d p
19c00 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
19c10 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
19c20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
19c30 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
19c40 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
19c50 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  nc);.          *
19c60 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76  (u32*)pEnd = sav
19c70 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72  ed;...  /* An er
19c80 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
19c90 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
19ca0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
19cb0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
19cc0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
19cd0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
19ce0 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
19cf0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
19d00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
19d10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19d20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
19d30 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
19d40 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  }..          pPa
19d50 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
19d60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19d70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
19d80 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
19d90 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
19da0 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
19db0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
19dc0 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
19dd0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
19de0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
19df0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
19e00 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
19e10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
19e20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
19e30 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
19e40 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
19e50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
19e60 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
19e70 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20  list(pPg);.     
19e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
19e90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19ea0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
19eb0 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
19ec0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
19ed0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
19ee0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 34  ;.        TRACE4
19ef0 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
19f00 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
19f10 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
19f20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
19f30 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
19f40 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
19f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19f60 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
19f70 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
19f80 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
19f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
19fa0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
19fb0 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  1;.    }.  .    
19fc0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
19fd0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
19fe0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
19ff0 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
1a000 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
1a010 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1a020 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
1a030 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
1a040 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
1a050 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1a060 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
1a070 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
1a080 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
1a090 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
1a0a0 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
1a0b0 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
1a0c0 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
1a0d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1a0e0 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70  >stmtInUse && !p
1a0f0 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69  Pg->inStmt && (i
1a100 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
1a110 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
1a120 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a130 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
1a140 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
1a150 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
1a160 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
1a170 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1a180 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1a190 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1a1a0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1a1b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1a1c0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30   pHist->pStmt==0
1a1d0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   );.        pHis
1a1e0 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  t->pStmt = sqlit
1a1f0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
1a200 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1a210 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1a220 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
1a230 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
1a240 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
1a250 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1a260 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1a270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a280 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
1a290 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
1a2a0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1a2b0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1a2c0 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  no);.      }else
1a2d0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
1a2e0 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
1a2f0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
1a300 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a  Pg->pgno, 7)-4;.
1a310 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1a320 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
1a330 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  gno);.        rc
1a340 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1a350 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
1a360 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1a370 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20  pageSize+4);.   
1a380 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d       TRACE3("STM
1a390 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
1a3a0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1a3b0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1a3c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
1a3d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a3e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1a3f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1a400 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
1a410 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
1a420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1a430 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
1a440 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
1a450 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
1a460 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1a470 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1a480 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65      }.      page
1a490 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1a4a0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
1a4b0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
1a4c0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1a4d0 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
1a4e0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1a4f0 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
1a500 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
1a510 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1a520 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28  g->pgno;.    if(
1a530 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1a540 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49  r->dbSize==PENDI
1a550 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
1a560 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1a570 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1a580 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1a590 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a5a0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1a5b0 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
1a5c0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1a5d0 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
1a5e0 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
1a5f0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1a600 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
1a610 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
1a620 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
1a630 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
1a640 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
1a650 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
1a660 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
1a670 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
1a680 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  e(void *pData){.
1a690 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
1a6a0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
1a6b0 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ta);.  return pP
1a6c0 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64  g->dirty;.}.#end
1a6d0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1a6e0 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
1a6f0 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
1a700 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69   content of a si
1a710 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74  ngle page with t
1a720 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
1a730 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61  n the third.** a
1a740 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
1a750 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65  sqlite3pager_ove
1a760 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
1a770 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
1a780 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
1a790 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
1a7a0 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
1a7b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1a7c0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
1a7d0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1a7e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a7f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1a800 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1a810 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1a820 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a830 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20    memcpy(pPage, 
1a840 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1a850 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
1a860 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
1a870 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
1a880 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a890 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a8a0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
1a8b0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
1a8c0 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
1a8d0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
1a8e0 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
1a8f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
1a900 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20  age "pgno" back 
1a910 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
1a920 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
1a930 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
1a940 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
1a950 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
1a960 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
1a970 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
1a980 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
1a990 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
1a9a0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1a9b0 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
1a9c0 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
1a9d0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
1a9e0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
1a9f0 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
1aa00 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1aa10 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
1aa20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1aa30 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
1aa40 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70   the.** sqlite3p
1aa50 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
1aa60 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
1aa70 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
1aa80 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
1aa90 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
1aaa0 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
1aab0 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
1aac0 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
1aad0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
1aae0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1aaf0 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
1ab00 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
1ab10 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
1ab20 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
1ab30 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
1ab40 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
1ab50 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
1ab60 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
1ab70 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
1ab80 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
1ab90 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
1aba0 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
1abb0 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
1abc0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1abd0 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
1abe0 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
1abf0 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
1ac00 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
1ac10 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
1ac20 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
1ac30 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
1ac40 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
1ac50 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
1ac60 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
1ac70 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
1ac80 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1ac90 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
1aca0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
1acb0 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
1acc0 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
1acd0 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
1ace0 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
1acf0 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  se the page cont
1ad00 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c  ains.** critical
1ad10 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
1ad20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
1ad30 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62  it gets rolled b
1ad40 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20  ack in spite.** 
1ad50 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  of the dont_roll
1ad60 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
1ad70 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
1ad80 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67  r_dont_write(Pag
1ad90 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1ada0 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
1adb0 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  *pPg;..  if( MEM
1adc0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  DB ) return;..  
1add0 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
1ade0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
1adf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
1ae00 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 6e 65 76  =0 );  /* We nev
1ae10 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f 77 72  er call _dont_wr
1ae20 69 74 65 20 75 6e 6c 65 73 73 20 74 68 65 20 70  ite unless the p
1ae30 61 67 65 20 69 73 20 69 6e 20 6d 65 6d 20 2a 2f  age is in mem */
1ae40 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  .  pPg->alwaysRo
1ae50 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66  llback = 1;.  if
1ae60 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20  ( pPg->dirty && 
1ae70 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
1ae80 73 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  se ){.    if( pP
1ae90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
1aea0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
1aeb0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1aec0 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
1aed0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
1aee0 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
1aef0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1af00 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
1af10 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
1af20 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
1af30 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1af40 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
1af50 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
1af60 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
1af70 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
1af80 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
1af90 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
1afa0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
1afb0 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
1afc0 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
1afd0 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
1afe0 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
1aff0 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
1b000 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
1b010 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
1b020 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
1b030 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
1b040 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
1b050 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
1b060 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
1b070 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
1b080 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
1b090 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
1b0a0 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
1b0b0 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
1b0c0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1b0d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b0e0 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49  TRACE3("DONT_WRI
1b0f0 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
1b100 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52  \n", pgno, PAGER
1b110 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1b120 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
1b130 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1b140 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
1b150 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1b160 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1b170 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1b180 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1b190 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1b1a0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1b1b0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
1b1c0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1b1d0 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
1b1e0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
1b1f0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
1b200 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1b210 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
1b220 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1b230 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
1b240 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
1b250 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
1b260 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1b270 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
1b280 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
1b290 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74  lback(void *pDat
1b2a0 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
1b2b0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1b2c0 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
1b2d0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1b2e0 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70  pPager;..  if( p
1b2f0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1b300 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c  GER_EXCLUSIVE ||
1b310 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b320 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  Open==0 ) return
1b330 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  ;.  if( pPg->alw
1b340 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70  aysRollback || p
1b350 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1b360 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29  lback || MEMDB )
1b370 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
1b380 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
1b390 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
1b3a0 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
1b3b0 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  DbSize ){.    as
1b3c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1b3d0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
1b3e0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
1b3f0 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
1b400 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1b410 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d  gno&7);.    pPg-
1b420 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1b430 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1b440 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1b450 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1b460 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1b470 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1b480 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f  &7);.      page_
1b490 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1b4a0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
1b4b0 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f   TRACE3("DONT_RO
1b4c0 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
1b4d0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
1b4e0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1b4f0 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  er));.  }.  if( 
1b500 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1b510 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d  e && !pPg->inStm
1b520 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  t && (int)pPg->p
1b530 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
1b540 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  tSize ){.    ass
1b550 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
1b560 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
1b570 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
1b580 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
1b590 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b5a0 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
1b5b0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1b5c0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1b5d0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1b5e0 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64  7);.    page_add
1b5f0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
1b600 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  g);.  }.}.../*.*
1b610 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
1b620 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1b630 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
1b640 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
1b650 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
1b660 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
1b670 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
1b680 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
1b690 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
1b6a0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1b6b0 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
1b6c0 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
1b6d0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
1b6e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
1b6f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
1b700 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
1b710 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1b720 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
1b730 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1b740 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
1b750 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1b760 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1b770 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
1b780 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
1b790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1b7a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  ROR;.  }.  TRACE
1b7b0 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
1b7c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b7d0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1b7e0 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
1b7f0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1b800 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
1b810 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
1b820 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
1b830 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
1b840 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
1b850 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
1b860 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
1b870 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1b880 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
1b890 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1b8a0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
1b8b0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1b8c0 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
1b8d0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
1b8e0 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
1b8f0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rty;.    }.    p
1b900 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1b910 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  0;.#ifndef NDEBU
1b920 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  G.    for(pPg=pP
1b930 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
1b940 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
1b950 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
1b960 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1b970 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1b980 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1b990 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
1b9a0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
1b9b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1b9c0 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
1b9d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
1b9e0 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
1b9f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
1ba00 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1ba10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1ba20 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1ba30 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
1ba40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1ba50 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  if( pPager->dirt
1ba60 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20  yCache==0 ){.   
1ba70 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28   /* Exit early (
1ba80 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68  without doing th
1ba90 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67  e time-consuming
1baa0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
1bab0 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69   calls).    ** i
1bac0 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  f there have bee
1bad0 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20  n no changes to 
1bae0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1baf0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
1bb00 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1bb10 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  nc==0 );.    rc 
1bb20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1bb30 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
1bb40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1bb50 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  = -1;.    return
1bb60 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1bb70 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1bb80 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
1bb90 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1bba0 6e 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  nc(pPager, 0, 0)
1bbb0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1bbc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1bbd0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1bbe0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
1bbf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1bc00 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1bc10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bc20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
1bc30 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
1bc40 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
1bc50 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
1bc60 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
1bc70 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
1bc80 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
1bc90 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
1bca0 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
1bcb0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
1bcc0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
1bcd0 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
1bce0 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
1bcf0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1bd00 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
1bd10 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
1bd20 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28  cking protocol (
1bd30 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29  SQLITE_PROTOCOL)
1bd40 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
1bd50 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
1bd60 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
1bd70 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
1bd80 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
1bd90 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
1bda0 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
1bdb0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
1bdc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
1bdd0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1bde0 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
1bdf0 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
1be00 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
1be10 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
1be20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1be30 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
1be40 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
1be50 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1be60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  ){.  int rc;.  T
1be70 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
1be80 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1be90 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1bea0 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64  EMDB ){.    PgHd
1beb0 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
1bec0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
1bed0 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
1bee0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
1bef0 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61   *pHist;.      a
1bf00 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79  ssert( !p->alway
1bf10 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
1bf20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79     if( !p->dirty
1bf30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1bf40 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
1bf50 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
1bf60 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f  (p, pPager))->pO
1bf70 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rig );.        a
1bf80 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
1bf90 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
1bfa0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
1bfb0 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  >pStmt );.      
1bfc0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1bfd0 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74    }..      pHist
1bfe0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1bff0 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  (p, pPager);.   
1c000 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
1c010 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  rig ){.        m
1c020 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
1c030 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70  ATA(p), pHist->p
1c040 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  Orig, pPager->pa
1c050 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1c060 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43   TRACE3("ROLLBAC
1c070 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
1c080 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
1c090 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1c0a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c0b0 20 20 20 20 54 52 41 43 45 33 28 22 50 41 47 45      TRACE3("PAGE
1c0c0 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
1c0d0 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
1c0e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1c0f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c100 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
1c110 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
1c120 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
1c130 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1c140 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74  .      p->inStmt
1c150 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
1c160 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e  PrevStmt = p->pN
1c170 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
1c180 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
1c190 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
1c1a0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1c1b0 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44  niter(PGHDR_TO_D
1c1c0 41 54 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e  ATA(p), pPager->
1c1d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1c1e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
1c1f0 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
1c200 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
1c210 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
1c220 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1c230 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1c240 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
1c250 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
1c260 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1c270 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
1c280 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1c290 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
1c2a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c2b0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1c2c0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
1c2d0 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
1c2e0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
1c2f0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
1c300 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1c310 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1c320 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
1c330 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
1c340 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1c350 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
1c360 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
1c370 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1c380 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1c390 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
1c3a0 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
1c3b0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1c3c0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  }.    return pPa
1c3d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1c3e0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1c3f0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
1c400 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERVED ){.    int
1c410 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70   rc2;.    rc = p
1c420 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
1c430 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
1c440 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  c2 = pager_unwri
1c450 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1c460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c480 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
1c490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1c4a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1c4b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70  pPager);.  }.  p
1c4c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1c4d0 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  -1;..  /* If an 
1c4e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
1c4f0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
1c500 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
1c510 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
1c520 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20  .  ** cache. So 
1c530 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72  call pager_error
1c540 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75  () on the way ou
1c550 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72  t to make any er
1c560 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73  ror .  ** persis
1c570 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  tent..  */.  ret
1c580 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1c590 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
1c5a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1c5b0 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
1c5c0 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
1c5d0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
1c5e0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
1c5f0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1c600 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
1c610 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
1c620 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64  ite3pager_isread
1c630 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
1c640 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1c650 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
1c660 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1c670 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
1c680 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1c690 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
1c6a0 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 63 6f  lite3pager_refco
1c6b0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
1c6c0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1c6d0 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69  ger->nRef;.}..#i
1c6e0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1c6f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1c700 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
1c710 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
1c720 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
1c730 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t *sqlite3pager_
1c740 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  stats(Pager *pPa
1c750 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
1c760 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
1c770 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
1c780 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
1c790 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
1c7a0 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
1c7b0 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
1c7c0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
1c7d0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
1c7e0 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
1c7f0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
1c800 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
1c810 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
1c820 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
1c830 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76  8] = pPager->nOv
1c840 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61  fl;.  a[9] = pPa
1c850 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
1c860 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
1c870 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
1c880 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1c890 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
1c8a0 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
1c8b0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
1c8c0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
1c8d0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
1c8e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1c8f0 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
1c900 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
1c910 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
1c920 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
1c930 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
1c940 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
1c950 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
1c960 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
1c970 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
1c980 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1c990 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1c9a0 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  begin(Pager *pPa
1c9b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1c9c0 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
1c9d0 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
1c9e0 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  E];.  assert( !p
1c9f0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1ca00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1ca10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
1ca20 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d  );.  TRACE2("STM
1ca30 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50  T-BEGIN %d\n", P
1ca40 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1ca50 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1ca60 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1ca70 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70  InUse = 1;.    p
1ca80 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1ca90 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1caa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1cab0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1cac0 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
1cad0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50  alOpen ){.    pP
1cae0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
1caf0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  en = 1;.    retu
1cb00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1cb10 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
1cb20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1cb30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
1cb40 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
1cb50 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
1cb60 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
1cb70 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
1cb80 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  mt==0 ){.    /* 
1cb90 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
1cba0 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
1cbb0 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72  _LOCK); */.    r
1cbc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1cbd0 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  EM;.  }.#ifndef 
1cbe0 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71  NDEBUG.  rc = sq
1cbf0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1cc00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
1cc10 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
1cc20 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
1cc30 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
1cc40 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  led;.  assert( p
1cc50 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
1cc60 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   == pPager->jour
1cc70 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66  nalOff );.#endif
1cc80 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
1cc90 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a  Size = pPager->j
1cca0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
1ccb0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
1ccc0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1ccd0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
1cce0 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  rOff = 0;.  pPag
1ccf0 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20  er->stmtCksum = 
1cd00 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
1cd10 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  t;.  if( !pPager
1cd20 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
1cd30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1cd40 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
1cd50 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66  mp, &pPager->stf
1cd60 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
1cd70 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
1cd80 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61  _failed;.    pPa
1cd90 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
1cda0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
1cdb0 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  tmtNRec = 0;.  }
1cdc0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
1cdd0 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  nUse = 1;.  retu
1cde0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
1cdf0 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
1ce00 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
1ce10 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  >aInStmt ){.    
1ce20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
1ce30 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->aInStmt);.   
1ce40 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1ce50 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1ce60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ce70 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65  Commit a stateme
1ce80 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1ce90 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
1cea0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
1ceb0 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
1cec0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1ced0 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a     PgHdr *pPg, *
1cee0 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45  pNext;.    TRACE
1cef0 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25  2("STMT-COMMIT %
1cf00 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1cf10 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
1cf20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
1cf30 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
1cf40 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
1cf50 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1cf60 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
1cf70 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a  r->stfd, 0); */.
1cf80 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1cf90 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1cfa0 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  t );.      pPage
1cfb0 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
1cfc0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50      }.    for(pP
1cfd0 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
1cfe0 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
1cff0 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
1d000 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
1d010 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1d020 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  g->inStmt );.   
1d030 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
1d040 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
1d050 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
1d060 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
1d070 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1d080 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
1d090 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1d0a0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1d0b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1d0c0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
1d0d0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
1d0e0 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
1d0f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1d100 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
1d110 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20  tmtNRec = 0;.   
1d120 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1d130 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
1d140 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
1d150 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
1d160 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
1d170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d180 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
1d190 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
1d1a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d1b0 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62  pager_stmt_rollb
1d1c0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1d1d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1d1e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1d1f0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41  InUse ){.    TRA
1d200 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41  CE2("STMT-ROLLBA
1d210 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
1d220 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1d230 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1d240 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
1d250 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61       for(pPg=pPa
1d260 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
1d270 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53   pPg=pPg->pNextS
1d280 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  tmt){.        Pg
1d290 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
1d2a0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1d2b0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
1d2c0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
1d2d0 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
1d2e0 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
1d2f0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48  TO_DATA(pPg), pH
1d300 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67  ist->pStmt, pPag
1d310 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1d320 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
1d330 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
1d340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
1d350 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
1d360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d370 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1d380 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1d390 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20  stmtSize;.      
1d3a0 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
1d3b0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1d3c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d3d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1d3e0 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  c = pager_stmt_p
1d3f0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
1d400 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d410 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
1d420 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
1d430 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1d440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1d450 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1d460 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
1d470 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d480 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
1d490 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
1d4a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1d4b0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1d4c0 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e  lite3pager_filen
1d4d0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
1d4e0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1d4f0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
1d500 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1d510 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
1d520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d530 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1d540 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1d550 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  dirname(Pager *p
1d560 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1d570 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
1d580 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
1d590 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
1d5a0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
1d5b0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
1d5c0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1d5d0 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e  e3pager_journaln
1d5e0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
1d5f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1d600 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d  ger->zJournal;.}
1d610 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1d620 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63  rue if fsync() c
1d630 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65  alls are disable
1d640 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  d for this pager
1d650 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
1d660 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61  ** if fsync()s a
1d670 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d  re executed norm
1d680 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
1d690 69 74 65 33 70 61 67 65 72 5f 6e 6f 73 79 6e 63  ite3pager_nosync
1d6a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1d6b0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1d6c0 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a  ->noSync;.}../*.
1d6d0 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63  ** Set the codec
1d6e0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
1d6f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
1d700 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a  ager_set_codec(.
1d710 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
1d720 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
1d730 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
1d740 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
1d750 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
1d760 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
1d770 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
1d780 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
1d790 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a  pCodecArg;.}../*
1d7a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d7b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
1d7c0 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61  crement the data
1d7d0 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
1d7e0 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f  -counter,.** sto
1d7f0 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f  red at byte 24 o
1d800 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
1d810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d820 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1d830 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
1d840 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64 20  pPager){.  void 
1d850 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72 20  *pPage;.  PgHdr 
1d860 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
1d870 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
1d880 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f   int rc;..  /* O
1d890 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
1d8a0 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
1d8b0 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ng. */.  rc = sq
1d8c0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1d8d0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65  Pager, 1, &pPage
1d8e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1d8f0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1d900 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
1d910 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
1d920 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1d930 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1d940 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61  rn rc;..  /* Rea
1d950 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
1d960 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e 20  lue at byte 24. 
1d970 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44 41  */.  pPgHdr = DA
1d980 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61 67  TA_TO_PGHDR(pPag
1d990 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75  e);.  change_cou
1d9a0 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65 33  nter = retrieve3
1d9b0 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32 34  2bits(pPgHdr, 24
1d9c0 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  );..  /* Increme
1d9d0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
1d9e0 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
1d9f0 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
1da00 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65   24. */.  change
1da10 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 70 75  _counter++;.  pu
1da20 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1da30 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1da40 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67  gHdr))+24, chang
1da50 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1da60 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
1da70 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
1da80 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
1da90 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
1daa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
1dac0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dad0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
1dae0 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
1daf0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
1db00 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
1db10 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
1db20 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
1db30 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
1db40 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
1db50 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
1db60 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
1db70 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
1db80 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
1db90 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
1dba0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1dbb0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1dbc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1dbd0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
1dbe0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
1dbf0 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70  ced, all dirty p
1dc00 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ages written.** 
1dc10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1dc20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74  file and the dat
1dc30 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
1dc40 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d. The only thin
1dc50 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e  g that.** remain
1dc60 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
1dc70 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
1dc80 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1dc90 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a  rnal file (or.**
1dca0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1dcb0 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
1dcc0 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
1dcd0 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
1dce0 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
1dcf0 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
1dd00 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
1dd10 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
1dd20 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
1dd30 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
1dd40 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
1dd50 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
1dd60 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
1dd70 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
1dd80 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
1dd90 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
1dda0 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1ddb0 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
1ddc0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1ddd0 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  _sync(Pager *pPa
1dde0 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
1ddf0 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e  *zMaster, Pgno n
1de00 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
1de10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1de20 20 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53   TRACE4("DATABAS
1de30 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
1de40 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e  zMaster=%s nTrun
1de50 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  c=%d\n", .      
1de60 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1de70 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  e, zMaster, nTru
1de80 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  nc);..  /* If th
1de90 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1dea0 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
1deb0 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
1dec0 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
1ded0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
1dee0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1def0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
1df00 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1df10 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1df20 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
1df30 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1df40 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
1df50 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
1df60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1df70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1df80 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
1df90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1dfa0 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
1dfb0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1dfc0 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
1dfd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
1dfe0 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
1dff0 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
1e000 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
1e010 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
1e020 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
1e030 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
1e040 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
1e050 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
1e060 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1e070 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
1e080 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
1e090 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
1e0a0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1e0b0 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
1e0c0 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
1e0d0 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
1e0e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1e0f0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1e100 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1e110 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1e120 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  ounter(pPager);.
1e130 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e140 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1e150 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65  ync_exit;.#ifnde
1e160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1e170 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
1e180 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
1e190 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1e1a0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
1e1b0 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
1e1c0 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
1e1d0 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
1e1e0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
1e1f0 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
1e200 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
1e210 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
1e220 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1e230 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   ** file..      
1e240 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1e250 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f 69  o i;.        voi
1e260 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  d *pPage;.      
1e270 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41    int iSkip = PA
1e280 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1e290 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  er);.        for
1e2a0 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c  ( i=nTrunc+1; i<
1e2b0 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1e2c0 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
1e2d0 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67        if( !(pPag
1e2e0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69  er->aInJournal[i
1e2f0 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29  /8] & (1<<(i&7))
1e300 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
1e310 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1e320 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1e330 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
1e340 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e350 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e360 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1e370 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1e380 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1e390 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1e3a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1e3b0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
1e3c0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
1e3d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e3e0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1e3f0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1e400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
1e410 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1e420 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1e430 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1e440 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1e450 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e460 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1e470 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1e480 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
1e490 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1e4a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e4b0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1e4c0 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  it;.    }..#ifnd
1e4d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1e4e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1e4f0 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
1e500 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e510 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
1e520 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
1e530 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e540 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1e550 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
1e560 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1e570 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
1e580 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
1e590 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1e5a0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
1e5b0 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
1e5c0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  s(pPager);.    r
1e5d0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
1e5e0 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
1e5f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e600 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1e610 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53  _exit;..    /* S
1e620 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1e630 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
1e640 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
1e650 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
1e660 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1e670 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20  ager->fd, 0);.  
1e680 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d    }..    pPager-
1e690 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1e6a0 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  YNCED;.  }else i
1e6b0 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75  f( MEMDB && nTru
1e6c0 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  nc!=0 ){.    rc 
1e6d0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74  = sqlite3pager_t
1e6e0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1e6f0 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79  nTrunc);.  }..sy
1e700 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  nc_exit:.  retur
1e710 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1e720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e730 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f  OVACUUM./*.** Mo
1e740 76 65 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  ve the page iden
1e750 74 69 66 69 65 64 20 62 79 20 70 44 61 74 61 20  tified by pData 
1e760 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f  to location pgno
1e770 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a   in the file. .*
1e780 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
1e790 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73  be no references
1e7a0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1e7b0 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75  page pgno. If cu
1e7c0 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67  rrent page.** pg
1e7d0 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
1e7e0 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
1e7f0 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
1e800 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65   not written the
1e810 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73  re by.** by this
1e820 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61   routine. The sa
1e830 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68  me applies to th
1e840 65 20 70 61 67 65 20 70 44 61 74 61 20 72 65 66  e page pData ref
1e850 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20  ers to on entry 
1e860 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
1e870 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
1e880 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
1e890 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 70   refered to by p
1e8a0 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69  Data remain vali
1e8b0 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
1e8c0 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
1e8d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
1e8e0 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61  e pData (i.e. da
1e8f0 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
1e900 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
1e910 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
1e920 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
1e930 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
1e940 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
1e950 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
1e960 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1e970 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
1e980 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1e990 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
1e9a0 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
1e9b0 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
1e9c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1e9d0 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
1e9e0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
1e9f0 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
1ea00 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
1ea10 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
1ea20 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
1ea30 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
1ea40 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
1ea50 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e)..*/.int sqlit
1ea60 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65  e3pager_movepage
1ea70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1ea80 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 50 67 6e  void *pData, Pgn
1ea90 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1eaa0 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
1eab0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
1eac0 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a  PgHdr *pPgOld; .
1ead0 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20    int h;.  Pgno 
1eae0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
1eaf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
1eb00 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54  ->nRef>0 );..  T
1eb10 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
1eb20 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
1eb30 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
1eb40 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
1eb50 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1eb60 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
1eb70 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20  dSync, pgno);.. 
1eb80 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
1eb90 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  nc ){.    needSy
1eba0 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
1ebb0 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
1ebc0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  pPg->inJournal )
1ebd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1ebe0 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  g->dirty );.    
1ebf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ec00 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
1ec10 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  .  /* Unlink pPg
1ec20 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d   from it's hash-
1ec30 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e  chain */.  unlin
1ec40 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
1ec50 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  r, pPg);..  /* I
1ec60 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
1ec70 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
1ec80 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
1ec90 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
1eca0 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  * from it's hash
1ecb0 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
1ecc0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
1ecd0 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
1ece0 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
1ecf0 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
1ed00 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
1ed10 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
1ed20 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
1ed30 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
1ed40 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f  ere..  */.  pPgO
1ed50 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
1ed60 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
1ed70 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
1ed80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1ed90 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
1eda0 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
1edb0 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
1edc0 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  ld);.    makeCle
1edd0 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  an(pPgOld);.    
1ede0 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64  if( pPgOld->need
1edf0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
1ee00 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e  sert( pPgOld->in
1ee10 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  Journal );.     
1ee20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1ee30 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 1;.      pPg->
1ee40 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1ee50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ee60 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
1ee70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ee80 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
1ee90 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61  number for pPg a
1eea0 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
1eeb0 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63  o the new hash-c
1eec0 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  hain. */.  asser
1eed0 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
1eee0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
1eef0 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28  ;.  h = pgno & (
1ef00 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
1ef10 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1ef20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
1ef30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ef40 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1ef50 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ash==0 );.    pP
1ef60 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1ef70 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1ef80 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
1ef90 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
1efa0 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67  aHash[h];.  pPag
1efb0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1efc0 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76  Pg;.  pPg->pPrev
1efd0 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b  Hash = 0;..  mak
1efe0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70  eDirty(pPg);.  p
1eff0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1f000 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  e = 1;..  if( ne
1f010 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
1f020 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
1f030 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
1f040 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1f050 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
1f060 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
1f070 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
1f080 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
1f090 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
1f0a0 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
1f0b0 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
1f0c0 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
1f0d0 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
1f0e0 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
1f0f0 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  the .    ** Page
1f100 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.aInJournal bit
1f110 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
1f120 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
1f130 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64  remedied by load
1f140 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ing.    ** the p
1f150 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
1f160 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
1f170 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1f180 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20  eedSync flag..  
1f190 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1f1a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1f1b0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
1f1c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
1f1d0 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
1f1e0 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
1f1f0 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1f200 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
1f210 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
1f220 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65  ;.    void *pNee
1f230 64 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72  dSync;.    asser
1f240 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1f250 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
1f260 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1f270 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
1f280 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e  cPgno, &pNeedSyn
1f290 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
1f2a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1f2b0 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
1f2c0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1f2d0 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1f2e0 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e  DR(pNeedSync)->n
1f2f0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1f300 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1f310 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75  NeedSync)->inJou
1f320 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61  rnal = 1;.    ma
1f330 6b 65 44 69 72 74 79 28 44 41 54 41 5f 54 4f 5f  keDirty(DATA_TO_
1f340 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1f350 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  );.    sqlite3pa
1f360 67 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53  ger_unref(pNeedS
1f370 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ync);.  }..  ret
1f380 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f390 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1f3a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1f3b0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1f3c0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1f3d0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
1f3e0 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1f3f0 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
1f400 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
1f410 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
1f420 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
1f430 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
1f440 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
1f450 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
1f460 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
1f470 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
1f480 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
1f490 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
1f4a0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
1f4b0 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
1f4c0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a  (pPager->fd);.}.
1f4d0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1f4e0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1f4f0 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
1f500 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
1f510 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
1f520 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
1f530 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1f540 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
1f550 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
1f560 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
1f570 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
1f580 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
1f590 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
1f5a0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
1f5b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1f5c0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1f5d0 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
1f5e0 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
1f5f0 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
1f600 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
1f610 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
1f620 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
1f630 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
1f640 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
1f650 2f 0a                                            /.