/ Hex Artifact Content
Login

Artifact 0b34f79119dfd302e371f5f172f434613336ca67:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 32 36  : pager.c,v 1.26
0350: 34 20 32 30 30 36 2f 30 33 2f 32 33 20 32 33 3a  4 2006/03/23 23:
0360: 32 39 3a 30 34 20 64 72 68 20 45 78 70 20 24 0a  29:04 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 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
1c20: 20 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61       /* Dirty pa
1c30: 67 65 73 20 73 6f 72 74 65 64 20 62 79 20 50 67  ges sorted by Pg
1c40: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66 64  Hdr.pgno */.#ifd
1c50: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1c60: 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65  PAGES.  u32 page
1c70: 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f  Hash;.#endif.  /
1c80: 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
1c90: 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65  ze bytes of page
1ca0: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69   data follow thi
1cb0: 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a  s header */.  /*
1cc0: 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
1cd0: 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74  tes of local dat
1ce0: 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67  a follow the pag
1cf0: 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e data */.};../*
1d00: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65  .** For an in-me
1d10: 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61  mory only databa
1d20: 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69  se, some extra i
1d30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  nformation is re
1d40: 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20  corded about.** 
1d50: 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61  each page so tha
1d60: 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65  t changes can be
1d70: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28   rolled back.  (
1d80: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  Journal files ar
1d90: 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f  e not.** used fo
1da0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
1db0: 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c  bases.)  The fol
1dc0: 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  lowing informati
1dd0: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  on is added to.*
1de0: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  * the end of eve
1df0: 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66  ry EXTRA block f
1e00: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1e10: 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  abases..**.** Th
1e20: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  is information c
1e30: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61  ould have been a
1e40: 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f  dded directly to
1e50: 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63   the PgHdr struc
1e60: 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65  ture..** But the
1e70: 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20  n it would take 
1e80: 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79  up an extra 8 by
1e90: 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f  tes of storage o
1ea0: 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a  n every PgHdr.**
1eb0: 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62   even for disk-b
1ec0: 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20  ased databases. 
1ed0: 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75   Splitting it ou
1ee0: 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e  t saves 8 bytes.
1ef0: 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c    This.** is onl
1f00: 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30  y a savings of 0
1f10: 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65  .8% but those pe
1f20: 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70  rcentages add up
1f30: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1f40: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67  uct PgHistory Pg
1f50: 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20  History;.struct 
1f60: 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38  PgHistory {.  u8
1f70: 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20   *pOrig;     /* 
1f80: 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65  Original page te
1f90: 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20  xt.  Restore to 
1fa0: 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72  this on a full r
1fb0: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20  ollback */.  u8 
1fc0: 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54  *pStmt;     /* T
1fd0: 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74  ext as it was at
1fe0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1ff0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
2000: 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f  atement */.};../
2010: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
2020: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
2030: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
2040: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
2050: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
2060: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
2070: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  EC1(P,D,N,X) if(
2080: 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b   P->xCodec!=0 ){
2090: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
20a0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
20b0: 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  }.# define CODEC
20c0: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
20d0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30  r*)(P->xCodec!=0
20e0: 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43  ?P->xCodec(P->pC
20f0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44  odecArg,D,N,X):D
2100: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
2110: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
2120: 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20  ) /* NO-OP */.# 
2130: 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c  define CODEC2(P,
2140: 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44  D,N,X) ((char*)D
2150: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2160: 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65  Convert a pointe
2170: 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74  r to a PgHdr int
2180: 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  o a pointer to i
2190: 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62  ts data.** and b
21a0: 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64  ack again..*/.#d
21b0: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44  efine PGHDR_TO_D
21c0: 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29  ATA(P)  ((void*)
21d0: 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69  (&(P)[1])).#defi
21e0: 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52  ne DATA_TO_PGHDR
21f0: 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29  (D)  (&((PgHdr*)
2200: 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e  (D))[-1]).#defin
2210: 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  e PGHDR_TO_EXTRA
2220: 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28  (G,P) ((void*)&(
2230: 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29  (char*)(&(G)[1])
2240: 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d  )[(P)->pageSize]
2250: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
2260: 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20  TO_HIST(P,PGR)  
2270: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  \.            ((
2280: 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68  PgHistory*)&((ch
2290: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28  ar*)(&(P)[1]))[(
22a0: 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28  PGR)->pageSize+(
22b0: 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a  PGR)->nExtra])..
22c0: 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f  /*.** How big to
22d0: 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
22e0: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  able used for lo
22f0: 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79  cating in-memory
2300: 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67   pages.** by pag
2310: 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 6d  e number. This m
2320: 61 63 72 6f 20 6c 6f 6f 6b 73 20 61 20 6c 69 74  acro looks a lit
2330: 74 6c 65 20 73 69 6c 6c 79 2c 20 62 75 74 20 69  tle silly, but i
2340: 73 20 65 76 61 6c 75 61 74 65 64 0a 2a 2a 20 61  s evaluated.** a
2350: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 20  t compile-time, 
2360: 6e 6f 74 20 72 75 6e 2d 74 69 6d 65 20 28 61 74  not run-time (at
2370: 20 6c 65 61 73 74 20 66 6f 72 20 67 63 63 20 74   least for gcc t
2380: 68 69 73 20 69 73 20 74 72 75 65 29 2e 0a 2a 2f  his is true)..*/
2390: 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41  .#define N_PG_HA
23a0: 53 48 20 28 5c 0a 20 20 28 4d 41 58 5f 50 41 47  SH (\.  (MAX_PAG
23b0: 45 53 3e 31 30 32 34 29 3f 32 30 34 38 3a 20 5c  ES>1024)?2048: \
23c0: 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 35 31  .  (MAX_PAGES>51
23d0: 32 29 3f 31 30 32 34 3a 20 5c 0a 20 20 28 4d 41  2)?1024: \.  (MA
23e0: 58 5f 50 41 47 45 53 3e 32 35 36 29 3f 35 31 32  X_PAGES>256)?512
23f0: 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53  : \.  (MAX_PAGES
2400: 3e 31 32 38 29 3f 32 35 36 3a 20 5c 0a 20 20 28  >128)?256: \.  (
2410: 4d 41 58 5f 50 41 47 45 53 3e 36 34 29 3f 31 32  MAX_PAGES>64)?12
2420: 38 3a 36 34 20 5c 0a 29 0a 0a 2f 2a 0a 2a 2a 20  8:64 \.)../*.** 
2430: 48 61 73 68 20 61 20 70 61 67 65 20 6e 75 6d 62  Hash a page numb
2440: 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61  er.*/.#define pa
2450: 67 65 72 5f 68 61 73 68 28 50 4e 29 20 20 28 28  ger_hash(PN)  ((
2460: 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48 2d 31  PN)&(N_PG_HASH-1
2470: 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  ))../*.** A open
2480: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
2490: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
24a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
24b0: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  cture..**.** Pag
24c0: 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62  er.errCode may b
24d0: 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
24e0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
24f0: 52 52 55 50 54 2c 20 53 51 4c 49 54 45 5f 50 52  RRUPT, SQLITE_PR
2500: 4f 54 4f 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c  OTOCOL.** or SQL
2510: 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f  ITE_FULL. Once o
2520: 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ne of the first 
2530: 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63  three errors occ
2540: 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73  urs, it persists
2550: 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72  .** and is retur
2560: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
2570: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
2580: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
2590: 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
25a0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
25b0: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
25c0: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
25d0: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
25e0: 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65  he.** next succe
25f0: 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69  ssful rollback i
2600: 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  s performed on t
2610: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
2620: 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  Also,.** SQLITE_
2630: 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66  FULL does not af
2640: 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33  fect the sqlite3
2650: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
2660: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
2670: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
2680: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
2690: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
26a0: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
26b0: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
26c0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
26d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
26e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
26f0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
2700: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2710: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2720: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2730: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2740: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2750: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2770: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2780: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2790: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
27a0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
27b0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
27c0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
27d0: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
27e0: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
27f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2800: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
2810: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
2820: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
2830: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
2840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
2850: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
2860: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
2870: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
2880: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
2890: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
28a0: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
28b0: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
28c0: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
28d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28e0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
28f0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
2900: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
2910: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
2920: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
2930: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
2940: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
2950: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
2960: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
2970: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2980: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
2990: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
29a0: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29c0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
29d0: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
29e0: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 65 72   etc. */.  u8 er
29f0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2a00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2a10: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
2a20: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38  f errors */.  u8
2a30: 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20   tempFile;      
2a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
2a50: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
2a60: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
2a70: 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20  u8 readOnly;    
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a90: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
2aa0: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
2ab0: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ad0: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
2ae0: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
2af0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
2b00: 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b    u8 dirtyCache;
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b20: 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20   True if cached 
2b30: 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67  pages have chang
2b40: 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ed */.  u8 alway
2b50: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
2b60: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64      /* Disable d
2b70: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
2b80: 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  or all pages */.
2b90: 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20    u8 memDb;     
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb0: 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74   True to inhibit
2bc0: 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f   all file I/O */
2bd0: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bf0: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
2c00: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
2c10: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
2c20: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20  .  int dbSize;  
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2c50: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  s in the file */
2c60: 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a  .  int origDbSiz
2c70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2c80: 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20  * dbSize before 
2c90: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
2ca0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  ge */.  int stmt
2cb0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2cc0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
2cd0: 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65  atabase (in page
2ce0: 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  s) at stmt_begin
2cf0: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  () */.  int nRec
2d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d20: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
2d30: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
2d40: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
2d50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d60: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
2d70: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
2d80: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
2d90: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2db0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
2dc0: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
2dd0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
2de0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
2df0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
2e00: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
2e10: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
2e20: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
2e30: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
2e40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e50: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
2e60: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
2e70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2e80: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
2e90: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2ea0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2eb0: 6e 4d 61 78 50 61 67 65 3b 20 20 20 20 20 20 20  nMaxPage;       
2ec0: 20 20 20 20 20 20 20 20 2f 2a 20 48 69 67 68 20          /* High 
2ed0: 77 61 74 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50  water mark of nP
2ee0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  age */.  int nRe
2ef0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2f00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f10: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2f20: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
2f30: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
2f40: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2f50: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2f60: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2f70: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
2f80: 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75   */.  u8 *aInJou
2f90: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
2fa0: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
2fb0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
2fc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fd0: 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74  */.  u8 *aInStmt
2fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ff0: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
3000: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
3010: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
3020: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
3030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3040: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3050: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
3060: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
3070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3080: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3090: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
30a0: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
30b0: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
30c0: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
30d0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
30e0: 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a  es */.  OsFile *
30f0: 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  fd, *jfd;       
3100: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
3110: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
3120: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
3130: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74   */.  OsFile *st
3140: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
3150: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
3160: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61  ptor for the sta
3170: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3180: 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65  l*/.  BusyHandle
3190: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
31a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
31b0: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
31c0: 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  er */.  PgHdr *p
31d0: 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20  First, *pLast;  
31e0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
31f0: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
3200: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
3210: 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ed;        /* Fi
3220: 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69  rst free page wi
3230: 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  th PgHdr.needSyn
3240: 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  c==0 */.  PgHdr 
3250: 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *pAll;          
3260: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3270: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3280: 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20  PgHdr *pStmt;   
3290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
32a0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
32b0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
32c0: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36  bjournal */.  i6
32d0: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
32e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
32f0: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
3300: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3310: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
3320: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
3330: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
3340: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
3350: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3360: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3370: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3380: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3390: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
33a0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
33b0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
33c0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
33d0: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
33e0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
33f0: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36   started */.  i6
3400: 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20  4 stmtJSize;    
3410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
3420: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
3430: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
3440: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
3450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3460: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
3470: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
3480: 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53  back */.#ifdef S
3490: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
34a0: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f   nHit, nMiss, nO
34b0: 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63 68  vfl;     /* Cach
34c0: 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c  e hits, missing,
34d0: 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f   and LRU overflo
34e0: 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ws */.  int nRea
34f0: 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  d,nWrite;       
3500: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
3510: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
3520: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
3530: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
3540: 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f  r)(void*,int); /
3550: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
3560: 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67  ine when freeing
3570: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
3580: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76 6f   (*xReiniter)(vo
3590: 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43  id*,int);   /* C
35a0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
35b0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
35c0: 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  pages */.  void 
35d0: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
35e0: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
35f0: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
3600: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
3610: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
3620: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
3630: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
3640: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
3650: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
3660: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
3670: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
3680: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
3690: 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23  er to PgHdr */.#
36a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
36b0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
36c0: 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70  EMENT.  Pager *p
36d0: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
36e0: 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69      /* Linked li
36f0: 73 74 20 6f 66 20 70 61 67 65 72 73 20 69 6e 20  st of pagers in 
3700: 74 68 69 73 20 74 68 72 65 61 64 20 2a 2f 0a 23  this thread */.#
3710: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
3720: 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  If SQLITE_TEST i
3730: 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 69  s defined then i
3740: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 72  ncrement the var
3750: 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a 2a  iable given in.*
3760: 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a  * the argument.*
3770: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3780: 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54 45  TEST.# define TE
3790: 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b 0a  ST_INCR(x)  x++.
37a0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54  #else.# define T
37b0: 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e 64  EST_INCR(x).#end
37c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  if../*.** Journa
37d0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
37e0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
37f0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
3800: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
3810: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
3820: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
3830: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
3840: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
3850: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
3860: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
3870: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3880: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
3890: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
38a0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
38b0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
38c0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
38d0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
38e0: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
38f0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
3900: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
3910: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
3920: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
3930: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
3940: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
3950: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
3960: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
3970: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
3980: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
3990: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
39a0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
39b0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
39c0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
39d0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
39e0: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
39f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
3a00: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
3a10: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
3a20: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3a30: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
3a40: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
3a50: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
3a60: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
3a70: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
3a80: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
3a90: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
3aa0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
3ab0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
3ac0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
3ad0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
3ae0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
3af0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
3b00: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
3b10: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
3b20: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
3b30: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
3b40: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
3b50: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
3b60: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
3b70: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
3b80: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
3b90: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
3ba0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
3bb0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
3bc0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
3bd0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
3be0: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
3bf0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
3c00: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
3c10: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
3c20: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
3c30: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
3c40: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
3c50: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
3c60: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
3c70: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
3c80: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
3c90: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
3ca0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
3cb0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
3cc0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
3cd0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
3ce0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3cf0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
3d00: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
3d10: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
3d20: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
3d30: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
3d40: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
3d50: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
3d60: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
3d70: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
3d80: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
3d90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
3da0: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
3db0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
3dc0: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
3dd0: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
3de0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
3df0: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
3e00: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
3e10: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
3e20: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
3e30: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
3e40: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
3e50: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
3e60: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
3e70: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
3e80: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
3e90: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
3ea0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
3eb0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3ec0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
3ed0: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
3ee0: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
3ef0: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
3f00: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
3f10: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
3f20: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
3f30: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
3f40: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
3f50: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
3f60: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
3f70: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
3f80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
3f90: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
3fa0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
3fb0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
3fc0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
3fd0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
3fe0: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
3ff0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
4000: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
4010: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
4020: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
4030: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
4040: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
4050: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20  default size of 
4060: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a 2f  a disk sector.*/
4070: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
4080: 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a 0a  ECTOR_SIZE 512..
4090: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
40a0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
40b0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
40c0: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
40d0: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
40e0: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
40f0: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
4100: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
4110: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
4120: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
4130: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
4140: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
4150: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
4160: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
4170: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
4180: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
4190: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
41a0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
41b0: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
41c0: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
41d0: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
41e0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
41f0: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
4200: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
4210: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
4220: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
4230: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
4240: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
4250: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
4260: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
4270: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
4280: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4290: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
42a0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
42b0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
42c0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
42d0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45  7483647../*.** E
42e0: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
42f0: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
4300: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
4310: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
4320: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
4330: 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f  t pager3_refinfo
4340: 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73  _enable = 0;.  s
4350: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
4360: 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a  _refinfo(PgHdr *
4370: 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  p){.    static i
4380: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
4390: 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69  if( !pager3_refi
43a0: 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74  nfo_enable ) ret
43b0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
43c0: 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
43d0: 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64      "REFCNT: %4d
43e0: 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
43f0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
4400: 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
4410: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20  TA(p), p->nRef. 
4420: 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b     );.    cnt++;
4430: 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20     /* Something 
4440: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
4450: 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20  int on */.  }.# 
4460: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
4470: 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  )  pager_refinfo
4480: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
4490: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65  ne REFINFO(X).#e
44a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
44b0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
44c0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
44d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
44e0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
44f0: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
4500: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
4510: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4520: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
4530: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
4540: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4550: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4560: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
4570: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
4580: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4590: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
45a0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
45b0: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20  OsFile *fd, u32 
45c0: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
45d0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
45e0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
45f0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
4600: 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20 69  sizeof(ac));.  i
4610: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4620: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
4630: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
4640: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
4650: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
4660: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4680: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4690: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
46a0: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
46b0: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
46c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
46d0: 75 74 33 32 62 69 74 73 28 63 68 61 72 20 2a 61  ut32bits(char *a
46e0: 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 61  c, u32 val){.  a
46f0: 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29  c[0] = (val>>24)
4700: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d   & 0xff;.  ac[1]
4710: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
4720: 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28  xff;.  ac[2] = (
4730: 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a  val>>8) & 0xff;.
4740: 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20    ac[3] = val & 
4750: 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  0xff;.}../*.** W
4760: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4770: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
4780: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
4790: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
47a0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
47b0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
47c0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
47d0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
47e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
47f0: 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ite32bits(OsFile
4800: 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a   *fd, u32 val){.
4810: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
4820: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
4830: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
4840: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
4850: 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ac, 4);.}../*.**
4860: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4870: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
4880: 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74   'offset' from t
4890: 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
48a0: 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65  ed by.** page he
48b0: 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61  ader 'p'..*/.sta
48c0: 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65  tic u32 retrieve
48d0: 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c  32bits(PgHdr *p,
48e0: 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20   int offset){.  
48f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
4900: 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73  c;.  ac = &((uns
4910: 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44  igned char*)PGHD
4920: 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66  R_TO_DATA(p))[of
4930: 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20  fset];.  return 
4940: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
4950: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
4960: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
4970: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
4980: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
4990: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
49a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
49b0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
49c0: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
49d0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
49e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
49f0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
4a00: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
4a10: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
4a20: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
4a30: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
4a40: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
4a50: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4a60: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
4a70: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4a80: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
4a90: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
4aa0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4ab0: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
4ac0: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
4ad0: 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52 4f  PT or SQLITE_PRO
4ae0: 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65 72  TOCOL,.** the er
4af0: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
4b00: 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73  istent. All subs
4b10: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
4b20: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a   on this Pager.*
4b30: 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  * will immediate
4b40: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
4b50: 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  me error code..*
4b60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
4b70: 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
4b80: 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
4b90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4ba0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
4bb0: 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65  TE_FULL || pPage
4bc0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
4bd0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 0a  TE_OK );.  if( .
4be0: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46      rc==SQLITE_F
4bf0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 3d 3d 53  ULL ||.    rc==S
4c00: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20  QLITE_IOERR ||. 
4c10: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f     rc==SQLITE_CO
4c20: 52 52 55 50 54 20 7c 7c 0a 20 20 20 20 72 63 3d  RRUPT ||.    rc=
4c30: 3d 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  =SQLITE_PROTOCOL
4c40: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
4c50: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
4c60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4c70: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4c80: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
4c90: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
4ca0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
4cb0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
4cc0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
4cd0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
4ce0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
4cf0: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
4d00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
4d10: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
4d20: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
4d30: 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  r *)PGHDR_TO_DAT
4d40: 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28  A(pPage);.  for(
4d50: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50  i=0; i<pPage->pP
4d60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
4d70: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
4d80: 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b   (hash+i)^pData[
4d90: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
4da0: 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   hash;.}../*.** 
4db0: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
4dc0: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
4dd0: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
4de0: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
4df0: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
4e00: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
4e10: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
4e20: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
4e30: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
4e40: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
4e50: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
4e60: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
4e70: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
4e80: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
4e90: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4ea0: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
4eb0: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
4ec0: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
4ed0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
4ee0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
4ef0: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
4f00: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
4f10: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
4f20: 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67   || MEMDB || pPg
4f30: 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20  ->dirty || .    
4f40: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d    pPg->pageHash=
4f50: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
4f60: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
4f70: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
4f80: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  AGE(x).#endif../
4f90: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
4fa0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
4fb0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
4fc0: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
4fd0: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
4fe0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
4ff0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
5000: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
5010: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
5020: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
5030: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
5040: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
5050: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
5060: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
5070: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
5080: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
5090: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
50a0: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
50b0: 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72  Free() *pzMaster
50c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
50d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
50e0: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
50f0: 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73  t *pzMaster is s
5100: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
5110: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
5120: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5130: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
5140: 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c  al(OsFile *pJrnl
5150: 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65  , char **pzMaste
5160: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5170: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
5180: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
5190: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
51a0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
51b0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
51c0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
51d0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
51e0: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  *pzMaster = 0;..
51f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5200: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
5210: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
5220: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
5230: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
5240: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5250: 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73  3OsSeek(pJrnl, s
5260: 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63  zJ-16);.  if( rc
5270: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5280: 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20  turn rc;. .  rc 
5290: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
52a0: 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  nl, &len);.  if(
52b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
52c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
52d0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
52e0: 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  Jrnl, &cksum);. 
52f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5300: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5310: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5320: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
5330: 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72  gic, 8);.  if( r
5340: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
5350: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
5360: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
5370: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5380: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5390: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
53a0: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
53b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
53c0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d  turn rc;..  *pzM
53d0: 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29  aster = (char *)
53e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
53f0: 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d  +1);.  if( !*pzM
5400: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  aster ){.    ret
5410: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5420: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5430: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
5440: 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  , *pzMaster, len
5450: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5460: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
5470: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
5480: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
5490: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  er = 0;.    retu
54a0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
54b0: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
54c0: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
54d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
54e0: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
54f0: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
5500: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70      cksum -= (*p
5510: 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d  zMaster)[i];.  }
5520: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
5530: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
5540: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
5550: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
5560: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
5570: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
5580: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
5590: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
55a0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
55b0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
55c0: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
55d0: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
55e0: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
55f0: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
5600: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
5610: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
5620: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
5630: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
5640: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
5650: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
5660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a  .  }else{.    (*
5670: 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d  pzMaster)[len] =
5680: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
5690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
56a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
56b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
56c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
56d0: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
56e0: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
56f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
5700: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
5710: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
5720: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
5730: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
5740: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
5750: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
5760: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
5770: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
5780: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
5790: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
57a0: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
57f0: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5810: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5830: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
5850: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
5860: 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61  c int seekJourna
5870: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
5880: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
5890: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
58a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
58b0: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
58c0: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
58d0: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
58e0: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
58f0: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
5900: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
5910: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
5920: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5930: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
5940: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
5950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
5960: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
5970: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
5980: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
5990: 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b  nalOff = offset;
59a0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
59b0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
59c0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
59d0: 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a  rnalOff);.}../*.
59e0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
59f0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
5a00: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
5a10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
5a20: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
5a30: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
5a40: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
5a50: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
5a60: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
5a70: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
5a80: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
5a90: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
5aa0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
5ab0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
5ac0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
5ad0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
5ae0: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
5af0: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
5b00: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
5b10: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
5b20: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
5b30: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
5b40: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
5b50: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
5b60: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
5b70: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
5b80: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
5b90: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
5ba0: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
5bb0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
5bc0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
5bd0: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
5be0: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
5bf0: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
5c00: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
5c10: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
5c20: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
5c30: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5c40: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
5c50: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
5c60: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 0a 20 20  lMagic)+16];..  
5c70: 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75  int rc = seekJou
5c80: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
5c90: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
5ca0: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
5cb0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
5cc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5cd0: 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  f;.  if( pPager-
5ce0: 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29  >stmtHdrOff==0 )
5cf0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
5d00: 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65  mtHdrOff = pPage
5d10: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20  r->journalHdr;. 
5d20: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
5d30: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
5d40: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5d50: 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a  );..  /* FIX ME:
5d60: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73   .  **.  ** Poss
5d70: 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72  ibly for a pager
5d80: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
5d90: 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
5da0: 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e  l magic should n
5db0: 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  ot.  ** be writt
5dc0: 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73  en until nRec is
5dd0: 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61   filled in as pa
5de0: 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a  rt of next syncJ
5df0: 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a  ournal(). .  **.
5e00: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61    ** Actually ma
5e10: 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  ybe the whole jo
5e20: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f  urnal header sho
5e30: 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75  uld be delayed u
5e40: 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70  ntil that.  ** p
5e50: 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75  oint. Think abou
5e60: 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d  t this..  */.  m
5e70: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
5e80: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
5e90: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5ea0: 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e  ic));.  /* The n
5eb0: 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46  Rec Field. 0xFFF
5ec0: 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e  FFFFF for no-syn
5ed0: 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20  c journals. */. 
5ee0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
5ef0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
5f00: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
5f10: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66  er->noSync ? 0xf
5f20: 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
5f30: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
5f40: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
5f50: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
5f60: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  e3Randomness(siz
5f70: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
5f80: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
5f90: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
5fa0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
5fb0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
5fc0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
5fd0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
5fe0: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
5ff0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
6000: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6010: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6020: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
6030: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
6040: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
6050: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
6060: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
6070: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
6080: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6090: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
60a0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
60b0: 72 53 69 7a 65 29 3b 0a 20 20 72 63 20 3d 20 73  rSize);.  rc = s
60c0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
60d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
60e0: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
60f0: 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er));..  /* The 
6100: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
6110: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
6120: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
6130: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
6140: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
6150: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
6160: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
6170: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
6180: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
6190: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
61a0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
61b0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
61c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
61d0: 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
61e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
61f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6200: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
6210: 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a  fd, "\000", 1);.
6220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6230: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6240: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6250: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
6260: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
6270: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
6280: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
6290: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
62a0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
62b0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
62c0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
62d0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
62e0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
62f0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
6300: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
6310: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
6320: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6330: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
6340: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
6350: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
6360: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
6370: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
6380: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
6390: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
63a0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
63b0: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
63c0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
63d0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
63e0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
63f0: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
6400: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
6410: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
6420: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
6430: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
6440: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6450: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
6460: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
6470: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
6480: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
6490: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
64a0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
64b0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
64c0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
64d0: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
64e0: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
64f0: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
6500: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
6510: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
6520: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
6530: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
6540: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6550: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
6560: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
6570: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
6580: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
6590: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
65a0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
65b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
65c0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
65d0: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
65e0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
65f0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
6600: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6610: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6620: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6630: 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
6640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
6650: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6660: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
6670: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
6680: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
6690: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
66a0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
66b0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
66c0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
66d0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
66e0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63   rc;..  if( memc
66f0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6700: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6710: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
6720: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6730: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
6740: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6750: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65  Pager->jfd, pNRe
6760: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
6770: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6780: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6790: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
67a0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
67b0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
67c0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
67d0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
67e0: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
67f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6800: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
6810: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
6820: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
6830: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
6840: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
6850: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
6860: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
6870: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
6880: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
6890: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
68a0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
68b0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
68c0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
68d0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
68e0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
68f0: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
6900: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
6910: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
6920: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
6930: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
6940: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
6950: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6960: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  s(pPager->jfd, (
6970: 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73  u32 *)&pPager->s
6980: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
6990: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
69a0: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
69b0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
69c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
69d0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
69e0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
69f0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
6a00: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75  rnalOff);.  retu
6a10: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
6a20: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
6a30: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
6a40: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
6a50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6a60: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
6a70: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
6a80: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
6a90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6aa0: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
6ab0: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
6ac0: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
6ad0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
6ae0: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
6af0: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
6b00: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
6b10: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
6b20: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
6b30: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
6b40: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
6b50: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
6b60: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
6b70: 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  **.** + 4 bytes:
6b80: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
6b90: 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65  ** + N bytes: le
6ba0: 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
6bb0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20  ournal name..** 
6bc0: 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20  + 4 bytes: N.** 
6bd0: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
6be0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
6bf0: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20  hecksum..** + 8 
6c00: 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
6c10: 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
6c20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6c30: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
6c40: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
6c50: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
6c60: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
6c70: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  name..**.** If z
6c80: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
6c90: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
6ca0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
6cb0: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
6cc0: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
6cd0: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
6ce0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
6cf0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
6d00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
6d10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
6d20: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
6d30: 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74   int len; .  int
6d40: 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d   i; .  u32 cksum
6d50: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
6d60: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
6d70: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
6d80: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
6d90: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
6da0: 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  er) return SQLIT
6db0: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
6dc0: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
6dd0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
6de0: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
6df0: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
6e00: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
6e10: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
6e20: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
6e30: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
6e40: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
6e50: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
6e60: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
6e70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6e80: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
6e90: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
6ea0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
6eb0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
6ec0: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
6ed0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
6ee0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
6ef0: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
6f00: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
6f10: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
6f20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6f30: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6f40: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
6f50: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
6f60: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
6f70: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
6f80: 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a  r->jfd, PAGER_MJ
6f90: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
6fa0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6fb0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6fc0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6fd0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6fe0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
6ff0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
7000: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7010: 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74   rc;..  put32bit
7020: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
7030: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
7040: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
7050: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
7060: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
7070: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7080: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
7090: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
70a0: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
70b0: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
70c0: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
70d0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
70e0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
70f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7100: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
7110: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
7120: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
7130: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
7140: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
7150: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
7160: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
7170: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
7180: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
7190: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
71a0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
71b0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
71c0: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
71d0: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
71e0: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
71f0: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
7200: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
7210: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
7220: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
7230: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
7240: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
7250: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
7260: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
7270: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64  ic void page_add
7280: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  _to_stmt_list(Pg
7290: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
72a0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
72b0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
72c0: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
72d0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
72e0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  pPg->pPrevStmt==
72f0: 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53  0 && pPg->pNextS
7300: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d  tmt==0 );.  pPg-
7310: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
7320: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
7330: 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  tmt ){.    pPage
7340: 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53  r->pStmt->pPrevS
7350: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  tmt = pPg;.  }. 
7360: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7370: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
7380: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
7390: 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69   = pPg;.  pPg->i
73a0: 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61  nStmt = 1;.}.sta
73b0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
73c0: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
73d0: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
73e0: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53  .  if( !pPg->inS
73f0: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
7400: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  if( pPg->pPrevSt
7410: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
7420: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
7430: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67  ->pNextStmt==pPg
7440: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
7450: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
7460: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
7470: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
7480: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
7490: 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67  ager->pStmt==pPg
74a0: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   );.    pPg->pPa
74b0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
74c0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
74d0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
74e0: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  tStmt ){.    ass
74f0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53  ert( pPg->pNextS
7500: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  tmt->pPrevStmt==
7510: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
7520: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
7530: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Stmt = pPg->pPre
7540: 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67  vStmt;.  }.  pPg
7550: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
7560: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
7570: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e  t = 0;.  pPg->in
7580: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
7590: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
75a0: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
75b0: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
75c0: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
75d0: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
75e0: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
75f0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
7600: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
7610: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
7620: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
7630: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
7640: 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  *p = pPager->aHa
7650: 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67  sh[pager_hash(pg
7660: 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  no)];.  while( p
7670: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
7680: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
7690: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
76a0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
76b0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
76c0: 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61  atabase and clea
76d0: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
76e0: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
76f0: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
7700: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
7710: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
7720: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
7730: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
7740: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
7750: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
7760: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
7770: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
7780: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
7790: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
77a0: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
77b0: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
77c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
77d0: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
77e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
77f0: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
7800: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
7810: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
7820: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
7830: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
7840: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
7850: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
7860: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
7870: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
7880: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
7890: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
78a0: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
78b0: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
78c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
78d0: 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ll = 0;.  memset
78e0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
78f0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
7900: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61  ->aHash));.  pPa
7910: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
7920: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7930: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
7940: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7950: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
7960: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7970: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7980: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7990: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
79a0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
79b0: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
79c0: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
79d0: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
79e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
79f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
7a00: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
7a10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7a20: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7a30: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7a40: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7a50: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
7a60: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
7a70: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7a80: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7a90: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
7aa0: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
7ab0: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7ac0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7ad0: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
7ae0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
7af0: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
7b00: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
7b10: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
7b20: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
7b30: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
7b40: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
7b50: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
7b60: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
7b70: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
7b80: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
7b90: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
7ba0: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
7bb0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
7bc0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
7bd0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
7be0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
7bf0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
7c00: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
7c10: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
7c20: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
7c30: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
7c40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7c50: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
7c60: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
7c70: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
7c80: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
7c90: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
7ca0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
7cb0: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
7cc0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
7cd0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
7ce0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7cf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7d00: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7d10: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
7d20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
7d30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
7d40: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
7d50: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
7d60: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
7d70: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
7d80: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
7d90: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
7da0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
7db0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
7dc0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
7dd0: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
7de0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
7df0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
7e00: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
7e10: 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  nc = 0;.#ifdef S
7e20: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
7e30: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
7e40: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
7e50: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
7e60: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
7e70: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
7e80: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
7e90: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
7ea0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7eb0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
7ec0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
7ed0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
7ee0: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
7ef0: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
7f00: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63  l==0 );.  }.  rc
7f10: 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   = sqlite3OsUnlo
7f20: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
7f30: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70  HARED_LOCK);.  p
7f40: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
7f50: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 70  AGER_SHARED;.  p
7f60: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
7f70: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
7f80: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
7f90: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
7fa0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
7fb0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
7fc0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
7fd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7fe0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
7ff0: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
8000: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
8010: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
8020: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
8030: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
8040: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
8050: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8060: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
8070: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
8080: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
8090: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
80a0: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
80b0: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
80c0: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
80d0: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
80e0: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
80f0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
8100: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
8110: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
8120: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
8130: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
8140: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8150: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
8160: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
8170: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
8180: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
8190: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
81a0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
81b0: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
81c0: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
81d0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
81e0: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
81f0: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
8200: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
8210: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
8220: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
8230: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
8240: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
8250: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
8260: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
8270: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
8280: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
8290: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
82a0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
82b0: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
82c0: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
82d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
82e0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
82f0: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
8300: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
8310: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
8320: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
8330: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
8340: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
8350: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
8360: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
8370: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
8380: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
8390: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
83a0: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
83b0: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
83c0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
83d0: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
83e0: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
83f0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
8400: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
8410: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
8420: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
8430: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
8440: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
8450: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
8460: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
8470: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
8480: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
8490: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
84a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
84b0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
84c0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
84d0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
84e0: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
84f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8500: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
8510: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
8520: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
8530: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
8540: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
8550: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
8560: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
8570: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
8580: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
8590: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
85a0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
85b0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
85c0: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
85d0: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
85e0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
85f0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
8600: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8610: 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74  OsFile *jfd, int
8620: 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e   useCksum){.  in
8630: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
8640: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
8650: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
8660: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
8670: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
8680: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
8690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
86a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
86b0: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
86c0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
86d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
86e0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
86f0: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
8700: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
8710: 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d  8 aData[SQLITE_M
8720: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20  AX_PAGE_SIZE];  
8730: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
8740: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
8750: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
8760: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
8770: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
8780: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
8790: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
87a0: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
87b0: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
87c0: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
87d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
87e0: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
87f0: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
8800: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 0a 0a  ger->stfd) );...
8810: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
8820: 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20  s(jfd, &pgno);. 
8830: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8840: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8860: 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61  Read(jfd, &aData
8870: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8880: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
8890: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
88a0: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
88b0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
88c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
88d0: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
88e0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
88f0: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
8900: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
8910: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
8920: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
8930: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
8940: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
8950: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8960: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
8970: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
8980: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
8990: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
89a0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
89b0: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
89c0: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
89d0: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
89e0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
89f0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8a00: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
8a10: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
8a20: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
8a30: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8a40: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8a50: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
8a60: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
8a70: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8a80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8a90: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
8aa0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
8ab0: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b  d32bits(jfd, &ck
8ac0: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
8ad0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
8ae0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8af0: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69  lOff += 4;.    i
8b00: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
8b10: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
8b20: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
8b30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8b40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
8b50: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
8b60: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
8b70: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
8b80: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
8b90: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
8ba0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
8bb0: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
8bc0: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
8bd0: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
8be0: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
8bf0: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
8c00: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
8c10: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
8c20: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
8c30: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
8c40: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
8c50: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
8c60: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
8c70: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
8c80: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
8c90: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
8ca0: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
8cb0: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
8cc0: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
8cd0: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
8ce0: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
8cf0: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
8d00: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
8d10: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
8d20: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
8d30: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
8d40: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
8d50: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
8d60: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
8d70: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
8d80: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
8d90: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
8da0: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
8db0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
8dc0: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
8dd0: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
8de0: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
8df0: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
8e00: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
8e10: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
8e20: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
8e30: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
8e40: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
8e50: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
8e60: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
8e70: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
8e80: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
8e90: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
8ea0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   in the main rol
8eb0: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
8ec0: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
8ed0: 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41  if a full ROLLBA
8ee0: 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  CK occurs after 
8ef0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  the statement.  
8f00: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
8f10: 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69  full ROLLBACK wi
8f20: 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74  ll not restore t
8f30: 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f  he page to its o
8f40: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e  riginal.  ** con
8f50: 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69  tent.  Two condi
8f60: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65  tions must be me
8f70: 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
8f80: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
8f90: 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29  .  ** files. (1)
8fa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
8fb0: 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28  st be locked.  (
8fc0: 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
8fd0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
8fe0: 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  * page content i
8ff0: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
9000: 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
9010: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
9020: 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63   not in.  ** cac
9030: 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  he or else it is
9040: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
9050: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70  ync==0..  */.  p
9060: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
9070: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
9080: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9090: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
90a0: 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67  EXCLUSIVE || pPg
90b0: 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33 28  !=0 );.  TRACE3(
90c0: 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
90d0: 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
90e0: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b  (pPager), pgno);
90f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9100: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
9110: 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30  USIVE && (pPg==0
9120: 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   || pPg->needSyn
9130: 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20  c==0) ){.    rc 
9140: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
9150: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
9160: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
9170: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9180: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9190: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
91a0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
91b0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
91c0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
91d0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
91e0: 69 66 28 20 70 50 67 20 29 20 70 50 67 2d 3e 64  if( pPg ) pPg->d
91f0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
9200: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
9210: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
9220: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
9230: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
9240: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
9250: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
9260: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
9270: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
9280: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
9290: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
92a0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
92b0: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
92c0: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
92d0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
92e0: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
92f0: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
9300: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
9310: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
9320: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
9330: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
9340: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
9350: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
9360: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
9370: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
9380: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
9390: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
93a0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
93b0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
93c0: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
93d0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
93e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
93f0: 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a  estructor ){  /*
9400: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75  ** FIX ME:  Shou
9410: 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e  ld this be xRein
9420: 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70  it? ***/.      p
9430: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
9440: 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72  or(pData, pPager
9450: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9460: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
9470: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
9480: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
9490: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
94a0: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
94b0: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
94c0: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
94d0: 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 3);.  }.  retu
94e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
94f0: 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
9500: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
9510: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
9520: 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
9530: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
9540: 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
9550: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
9560: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
9570: 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
9580: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
9590: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
95a0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
95b0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
95c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
95d0: 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
95e0: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
95f0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
9600: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
9610: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
9620: 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  l child journals
9630: 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20  ..** To tell if 
9640: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
9650: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c   can be deleted,
9660: 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f   check to each o
9670: 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65  f the.** childre
9680: 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64  n.  If all child
9690: 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d  ren are either m
96a0: 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74  issing or do not
96b0: 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64   refer to.** a d
96c0: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20  ifferent master 
96d0: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68  journal, then th
96e0: 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  is master journa
96f0: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
9700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9710: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
9720: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
9730: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
9740: 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65    int master_ope
9750: 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20  n = 0;.  OsFile 
9760: 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63  *master = 0;.  c
9770: 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
9780: 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
9790: 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
97a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
97b0: 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
97c0: 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
97d0: 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
97e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
97f0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
9800: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9810: 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63  exclusively in c
9820: 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ase some other p
9830: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72  rocess.  ** is r
9840: 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74  unning this rout
9850: 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68  ine also. Not th
9860: 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20  at it makes too 
9870: 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e  much difference.
9880: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
9890: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
98a0: 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73  ly(zMaster, &mas
98b0: 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ter);.  if( rc!=
98c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
98d0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
98e0: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
98f0: 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
9900: 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73 74  3OsFileSize(mast
9910: 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
9920: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
9930: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
9940: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9950: 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
9960: 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
9970: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
9980: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
9990: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  Ptr = 0;..    /*
99a0: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
99b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
99c0: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
99d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
99e0: 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f    ** sqliteMallo
99f0: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
9a00: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
9a10: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
9a20: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
9a30: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
9a40: 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  eMalloc(nMasterJ
9a50: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
9a60: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
9a70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
9a80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9a90: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
9aa0: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
9ab0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
9ac0: 65 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73  ead(master, zMas
9ad0: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73  terJournal, nMas
9ae0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
9af0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9b00: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
9b10: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a  ter_out;..    zJ
9b20: 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
9b30: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
9b40: 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
9b50: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
9b60: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
9b70: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9b80: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a  3OsFileExists(zJ
9b90: 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
9ba0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
9bb0: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
9bc0: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
9bd0: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
9be0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
9bf0: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
9c00: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
9c10: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9c20: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
9c30: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
9c40: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
9c50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9c60: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
9c70: 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65  /.        OsFile
9c80: 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20   *journal = 0;. 
9c90: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20         int c;.. 
9ca0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
9cb0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
9cc0: 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75  y(zJournal, &jou
9cd0: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
9ce0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
9d00: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
9d10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
9d20: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
9d30: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72  sterJournal(jour
9d40: 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72  nal, &zMasterPtr
9d50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9d60: 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e  e3OsClose(&journ
9d70: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
9d80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
9da0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9db0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
9dc0: 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
9dd0: 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  r!=0 && strcmp(z
9de0: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
9df0: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
9e00: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
9e10: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
9e20: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
9e30: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
9e40: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
9e50: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
9e60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
9e70: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
9e80: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9e90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9ea0: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
9eb0: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
9ec0: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
9ed0: 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f   }.  .  sqlite3O
9ee0: 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29  sDelete(zMaster)
9ef0: 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
9f00: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a  :.  if( zMasterJ
9f10: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ournal ){.    sq
9f20: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
9f30: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
9f40: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
9f50: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
9f60: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
9f70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9f80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
9f90: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
9fa0: 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77  he cache agree w
9fb0: 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
9fc0: 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  isk.  In other w
9fd0: 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20  ords,.** reread 
9fe0: 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65  the disk to rese
9ff0: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
a000: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
a010: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a020: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72  called after a r
a030: 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68  ollback in which
a040: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72   some of the dir
a050: 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65  ty cache.** page
a060: 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e  s had never been
a070: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
a080: 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74  disk.  We need t
a090: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a  o roll back the.
a0a0: 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74  ** cache content
a0b0: 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74   and the easiest
a0c0: 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20   way to do that 
a0d0: 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  is to reread the
a0e0: 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   old content.** 
a0f0: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69  back from the di
a100: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
a110: 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  t pager_reload_c
a120: 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
a130: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
a140: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
a150: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70  LITE_OK;.  for(p
a160: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
a170: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
a180: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68  NextAll){.    ch
a190: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d  ar zBuf[SQLITE_M
a1a0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20  AX_PAGE_SIZE];. 
a1b0: 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72     if( !pPg->dir
a1c0: 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ty ) continue;. 
a1d0: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
a1e0: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
a1f0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
a200: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a210: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
a220: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
a230: 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e  Size*(i64)(pPg->
a240: 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20  pgno-1));.      
a250: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a260: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
a270: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
a280: 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
a290: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a2a0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
a2b0: 20 20 20 54 52 41 43 45 33 28 22 52 45 46 45 54     TRACE3("REFET
a2c0: 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  CH %d page %d\n"
a2d0: 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
a2e0: 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
a2f0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
a300: 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  eak;.      CODEC
a310: 31 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20  1(pPager, zBuf, 
a320: 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20  pPg->pgno, 2);. 
a330: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a340: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
a350: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a360: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a370: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
a380: 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47   memcmp(zBuf, PG
a390: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a3a0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a3b0: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ze) ){.      mem
a3c0: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
a3d0: 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50  A(pPg), zBuf, pP
a3e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a3f0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
a400: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
a410: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
a420: 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f  xReiniter(PGHDR_
a430: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
a440: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a450: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a460: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
a470: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
a480: 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
a490: 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
a4a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a4b0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
a4c0: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  0;.    pPg->dirt
a4d0: 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
a4e0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
a4f0: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
a500: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
a510: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
a520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
a540: 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  ate the main fil
a550: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  e of the given p
a560: 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62  ager to the numb
a570: 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69  er of pages.** i
a580: 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  ndicated..*/.sta
a590: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
a5a0: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
a5b0: 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29  ager, int nPage)
a5c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
a5d0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
a5e0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
a5f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
a600: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
a610: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
a620: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
a630: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  );.}../*.** Play
a640: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
a650: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
a660: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
a670: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
a680: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
a690: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
a6a0: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
a6b0: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
a6c0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
a6d0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
a6e0: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
a6f0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
a700: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
a710: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
a720: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
a730: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
a740: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
a750: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
a760: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
a770: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
a780: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
a790: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
a7a0: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
a7b0: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
a7c0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
a7d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
a7e0: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
a7f0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
a800: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
a810: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
a820: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
a830: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
a840: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
a850: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
a860: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
a870: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
a880: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
a890: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
a8a0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
a8b0: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
a8c0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
a8d0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
a8e0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
a8f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
a900: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
a910: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
a920: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
a930: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
a940: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
a950: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
a960: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
a970: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
a980: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
a990: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
a9a0: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
a9b0: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
a9c0: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
a9d0: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
a9e0: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
a9f0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
aa00: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
aa10: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
aa20: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
aa30: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
aa40: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
aa50: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
aa60: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
aa70: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
aa80: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
aa90: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
aaa0: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
aab0: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
aac0: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
aad0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
aae0: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
aaf0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
ab00: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
ab10: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
ab20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
ab30: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
ab40: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
ab50: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
ab60: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
ab70: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
ab80: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
ab90: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
aba0: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
abb0: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
abc0: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
abd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
abe0: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
abf0: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
ac00: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
ac10: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
ac20: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
ac30: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
ac40: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
ac50: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
ac60: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
ac70: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
ac80: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
ac90: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
aca0: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
acb0: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
acc0: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
acd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ace0: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
acf0: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
ad00: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
ad10: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
ad20: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
ad30: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
ad40: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
ad50: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
ad60: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
ad70: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
ad80: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
ad90: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
ada0: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
adb0: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
adc0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
add0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
ade0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
adf0: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
ae00: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
ae10: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
ae20: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
ae30: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
ae40: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
ae50: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
ae60: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
ae70: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
ae80: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
ae90: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
aea0: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
aeb0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
aec0: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
aed0: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
aee0: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
aef0: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
af00: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
af10: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
af20: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
af30: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
af40: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
af50: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
af60: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
af70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
af80: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
af90: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
afa0: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
afb0: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
afc0: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
afd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
afe0: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
aff0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
b000: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
b010: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
b020: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
b030: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
b040: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
b050: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
b060: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
b070: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
b080: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
b090: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
b0a0: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
b0b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
b0c0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
b0d0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
b0e0: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
b0f0: 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  ger){.  i64 szJ;
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
b120: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
b130: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
b140: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
b150: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b160: 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
b170: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
b180: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
b190: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b1a0: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
b1b0: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
b1c0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
b1d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
b1e0: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
b1f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
b200: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
b210: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
b220: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
b230: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
b240: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
b250: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
b260: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
b270: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
b280: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
b290: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
b2a0: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
b2b0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
b2c0: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
b2d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
b2e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
b2f0: 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
b300: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
b310: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
b320: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b330: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
b340: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
b350: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
b360: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b370: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
b380: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
b390: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
b3a0: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
b3b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
b3c0: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
b3d0: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
b3e0: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
b3f0: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
b400: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
b410: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
b420: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
b430: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
b440: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
b450: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
b460: 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29  ->jfd, &zMaster)
b470: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
b480: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
b490: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b4a0: 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26  OK || (zMaster &
b4b0: 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  & !sqlite3OsFile
b4c0: 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29  Exists(zMaster))
b4d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
b4e0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
b4f0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
b500: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b510: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
b520: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
b530: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
b540: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
b550: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
b560: 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  0);.  pPager->jo
b570: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
b580: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
b590: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
b5a0: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
b5b0: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
b5c0: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
b5d0: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
b5e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
b5f0: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
b600: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
b610: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
b620: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
b630: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
b640: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
b650: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
b660: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
b670: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
b680: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
b690: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
b6a0: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
b6b0: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
b6c0: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
b6d0: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
b6e0: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
b6f0: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
b700: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
b710: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
b720: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
b730: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
b740: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
b750: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
b760: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
b770: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b780: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
b790: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
b7a0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
b7b0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b7c0: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
b7d0: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
b7e0: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
b7f0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
b800: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
b810: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
b820: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
b830: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
b840: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
b850: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
b860: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
b870: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
b880: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
b890: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
b8a0: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
b8b0: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
b8c0: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
b8d0: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
b8e0: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
b8f0: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
b900: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
b910: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
b920: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
b930: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
b940: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
b950: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
b960: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
b970: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
b980: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
b990: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
b9a0: 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
b9b0: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
b9c0: 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
b9d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
b9e0: 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69  ck to it's origi
b9f0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
ba00: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
ba10: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
ba20: 43 4c 55 53 49 56 45 20 26 26 20 0a 20 20 20 20  CLUSIVE && .    
ba30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
ba40: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
ba50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
ba60: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ba70: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
ba80: 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ze==0 || pPager-
ba90: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50  >origDbSize==mxP
baa0: 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g );.      rc = 
bab0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
bac0: 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
bad0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bae0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
baf0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
bb00: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
bb10: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
bb20: 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
bb30: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
bb40: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
bb50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
bb60: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
bb70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
bb80: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
bb90: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
bba0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
bbb0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
bbc0: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
bbd0: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
bbe0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bbf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
bc00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
bc10: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
bc20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bc30: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
bc40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
bc50: 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
bc60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
bc70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
bc80: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
bc90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bca0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bcb0: 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
bcc0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
bcd0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
bce0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bcf0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
bd00: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
bd10: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
bd20: 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( zMaster ){.   
bd30: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
bd40: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
bd50: 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
bd60: 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74  ne will return t
bd70: 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  rue,.    ** see 
bd80: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
bd90: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
bda0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
bdb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
bdc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bdd0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
bde0: 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74  _delmaster(zMast
bdf0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
be00: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
be10: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  r);.  }..  /* Th
be20: 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
be30: 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
be40: 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
be50: 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
be60: 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
be70: 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
be80: 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
be90: 64 69 66 66 65 72 65 6e 74 20 50 41 47 45 52 5f  different PAGER_
bea0: 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a  SECTOR_SIZE.  **
beb0: 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
bec0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
bed0: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
bee0: 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70  rocess..  */.  p
bef0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
bf00: 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52  e = PAGER_SECTOR
bf10: 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  _SIZE;.  return 
bf20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
bf30: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
bf40: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
bf50: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
bf60: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
bf70: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
bf80: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
bf90: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
bfa0: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
bfb0: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
bfc0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
bfd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bfe0: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
bff0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
c000: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
c010: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
c020: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
c030: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
c040: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
c050: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
c060: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
c070: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
c080: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
c090: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
c0a0: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
c0b0: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
c0c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
c0d0: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
c0e0: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
c0f0: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
c100: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
c110: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
c120: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
c130: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
c140: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
c150: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
c160: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
c170: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
c180: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
c190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c1a0: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
c1b0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c1d0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
c1e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
c1f0: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
c200: 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20  nalOff;.#ifndef 
c210: 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20  NDEBUG .  {.    
c220: 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  i64 os_szJ;.    
c230: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
c240: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
c250: 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
c260: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c270: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c280: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
c290: 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
c2a0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
c2b0: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
c2c0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
c2d0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
c2e0: 61 64 65 72 20 77 72 69 74 74 65 6e 0a 20 20 2a  ader written.  *
c2f0: 2a 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * this statement
c300: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72   transaction, or
c310: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c320: 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e  file if no journ
c330: 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77  al.  ** header w
c340: 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  as written..  */
c350: 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67  .  hdrOff = pPag
c360: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a  er->stmtHdrOff;.
c370: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c380: 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68  ->fullSync || !h
c390: 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21  drOff );.  if( !
c3a0: 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64  hdrOff ){.    hd
c3b0: 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  rOff = szJ;.  }.
c3c0: 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65    .  /* Truncate
c3d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
c3e0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
c3f0: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
c400: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
c410: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
c420: 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  VE ){.    rc = p
c430: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
c440: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
c450: 6d 74 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70  mtSize);.  }.  p
c460: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
c470: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
c480: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
c490: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
c4a0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  rds are in the s
c4b0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c4c0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
c4d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
c4e0: 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  se && pPager->jo
c4f0: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
c500: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
c510: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
c520: 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e   nRec = pPager->
c530: 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f  stmtNRec;.  .  /
c540: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
c550: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
c560: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
c570: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
c580: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
c590: 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74  se file.  Note t
c5a0: 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
c5b0: 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20  t journal omits 
c5c0: 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20  checksums from. 
c5d0: 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20   ** each record 
c5e0: 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c  since power-fail
c5f0: 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20  ure recovery is 
c600: 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  not important to
c610: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
c620: 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
c630: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
c640: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
c650: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
c660: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
c670: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
c680: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
c690: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
c6a0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
c6b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
c6c0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
c6d0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
c6e0: 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
c6f0: 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
c700: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
c710: 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
c720: 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
c730: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c740: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c750: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
c760: 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
c770: 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
c780: 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
c790: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
c7a0: 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
c7b0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
c7c0: 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
c7d0: 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
c7e0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
c7f0: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
c800: 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
c810: 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
c820: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
c830: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
c840: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
c850: 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
c860: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
c870: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
c880: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
c890: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
c8a0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
c8b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c8c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
c8d0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
c8e0: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
c8f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c900: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
c910: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
c920: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
c930: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61  ->stmtCksum;.  a
c940: 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48  ssert( JOURNAL_H
c950: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28 70  DR_SZ(pPager)<(p
c960: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
c970: 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  8) );.  while( p
c980: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c990: 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70 50  f <= (hdrOff-(pP
c9a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
c9b0: 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  )) ){.    rc = p
c9c0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
c9d0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
c9e0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
c9f0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
ca00: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
ca10: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ca20: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
ca30: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
ca40: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61   }..  while( pPa
ca50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ca60: 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  < szJ ){.    u32
ca70: 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20   nJRec;         
ca80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
ca90: 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
caa0: 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
cab0: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
cac0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
cad0: 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
cae0: 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  my);.    if( rc!
caf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cb00: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
cb10: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
cb20: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74       goto end_st
cb30: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
cb40: 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63   }.    if( nJRec
cb50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52  ==0 ){.      nJR
cb60: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
cb70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
cb80: 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  / (pPager->pageS
cb90: 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20  ize+8);.    }.  
cba0: 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b    for(i=nJRec-1;
cbb0: 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
cbc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
cbd0: 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
cbe0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
cbf0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
cc00: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
cc10: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
cc20: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
cc30: 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
cc40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
cc50: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
cc60: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
cc70: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
cc80: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
cc90: 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
cca0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
ccb0: 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20  QLITE_OK) {.    
ccc0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ccd0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a  ff = szJ;.    /*
cce0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
ccf0: 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  che(pPager); */.
cd00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cd10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
cd20: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
cd30: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
cd40: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
cd50: 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
cd60: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
cd70: 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65  t_cachesize(Page
cd80: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
cd90: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
cda0: 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
cdb0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
cdc0: 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  mxPage;.  }else{
cdd0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
cde0: 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  age = 10;.  }.}.
cdf0: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
ce00: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
ce10: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
ce20: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
ce30: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
ce40: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
ce50: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
ce60: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
ce70: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
ce80: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
ce90: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
cea0: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
ceb0: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
cec0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
ced0: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
cee0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
cef0: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
cf00: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
cf10: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
cf20: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
cf30: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
cf40: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
cf50: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
cf60: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
cf70: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
cf80: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
cf90: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
cfa0: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
cfb0: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
cfc0: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
cfd0: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
cfe0: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
cff0: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
d010: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
d020: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
d030: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
d040: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
d050: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
d060: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
d070: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
d080: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
d090: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
d0a0: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
d0b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
d0c0: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
d0d0: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
d0e0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
d0f0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d110: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
d120: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
d130: 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
d140: 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
d150: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
d160: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
d170: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
d180: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
d190: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
d1a0: 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
d1b0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
d1c0: 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
d1d0: 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
d1e0: 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
d1f0: 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
d200: 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
d220: 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
d230: 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
d240: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
d250: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d260: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
d270: 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
d280: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
d290: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
d2a0: 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
d2b0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
d2c0: 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
d2d0: 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
d2e0: 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
d2f0: 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
d300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
d310: 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
d320: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
d330: 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61 67  safety_level(Pag
d340: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d350: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f  level, int full_
d360: 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  fsync){.  pPager
d370: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
d380: 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
d390: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
d3a0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
d3b0: 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
d3c0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
d3d0: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
d3e0: 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b  nc = full_fsync;
d3f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
d400: 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
d410: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
d420: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
d430: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
d440: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
d450: 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
d460: 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
d470: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
d480: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
d490: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
d4a0: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
d4b0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
d4c0: 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
d4d0: 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
d4e0: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
d4f0: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70  t = 0;../*.** Op
d500: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
d510: 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
d520: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
d530: 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a 2a 20 28   into zFile.** (
d540: 7a 46 69 6c 65 20 6d 75 73 74 20 62 65 20 61 74  zFile must be at
d550: 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45   least SQLITE_TE
d560: 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65  MPNAME_SIZE byte
d570: 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a  s long.)  Write.
d580: 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
d590: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
d5a0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
d5b0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
d5c0: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
d5d0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
d5e0: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
d5f0: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
d600: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
d610: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
d620: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
d630: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
d640: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
d650: 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a  _opentemp(char *
d660: 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 2a  zFile, OsFile **
d670: 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  pFd){.  int cnt 
d680: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
d690: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
d6a0: 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
d6b0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
d6c0: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
d6d0: 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 63  y */.  do{.    c
d6e0: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
d6f0: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
d700: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
d710: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
d720: 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70  clusive(zFile, p
d730: 46 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65  Fd, 1);.  }while
d740: 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53  ( cnt>0 && rc!=S
d750: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
d760: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
d770: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d780: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
d790: 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
d7a0: 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
d7b0: 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
d7c0: 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
d7d0: 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
d7e0: 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
d7f0: 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
d800: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
d810: 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
d820: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
d830: 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e  e3pager_get() an
d840: 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f  d is only held o
d850: 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  pen until the.**
d860: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
d870: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
d880: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
d890: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
d8a0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
d8b0: 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
d8c0: 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
d8d0: 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
d8e0: 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
d8f0: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
d900: 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
d910: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
d920: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
d930: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
d940: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
d950: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
d960: 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f  :" then all info
d970: 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
d980: 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20  in cache..** It 
d990: 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
d9a0: 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
d9b0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
d9c0: 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69  mplement an.** i
d9d0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
d9e0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
d9f0: 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50  3pager_open(.  P
da00: 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
da10: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
da20: 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
da30: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
da40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
da50: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
da60: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
da70: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
da80: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
da90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
daa0: 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
dab0: 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
dac0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
dad0: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
dae0: 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
daf0: 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
db00: 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61   file */.){.  Pa
db10: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
db20: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61  .  char *zFullPa
db30: 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  thname = 0;.  in
db40: 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43  t nameLen;  /* C
db50: 6f 6d 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67  ompiler is wrong
db60: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
db70: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66   initialized bef
db80: 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46  ore use */.  OsF
db90: 69 6c 65 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72  ile *fd;.  int r
dba0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
dbb0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65   int i;.  int te
dbc0: 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  mpFile = 0;.  in
dbd0: 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69  t memDb = 0;.  i
dbe0: 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
dbf0: 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
dc00: 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
dc10: 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
dc20: 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61  ==0;.  int noRea
dc30: 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
dc40: 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
dc50: 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a  CK)!=0;.  char z
dc60: 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
dc70: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64  NAME_SIZE];.#ifd
dc80: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
dc90: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
dca0: 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  NT.  /* A malloc
dcb0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  () cannot fail i
dcc0: 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  n sqlite3ThreadD
dcd0: 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20  ata() as one or 
dce0: 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20  more calls to . 
dcf0: 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73   ** malloc() mus
dd00: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
dd10: 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73  een made by this
dd20: 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69   thread before i
dd30: 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74  t gets.  ** to t
dd40: 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20  his point. This 
dd50: 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64  means the Thread
dd60: 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62  Data must have b
dd70: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  een allocated al
dd80: 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68  ready.  ** so th
dd90: 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
dda0: 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e  lloc can be set.
ddb0: 20 49 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63   It would be nic
ddc0: 65 20 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a  e to assert.  **
ddd0: 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61   that ThreadData
dde0: 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a  .nAlloc is non-z
ddf0: 65 72 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68  ero, but alas th
de00: 69 73 20 62 72 65 61 6b 73 20 74 65 73 74 20 63  is breaks test c
de10: 61 73 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74  ases .  ** writt
de20: 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  en to invoke the
de30: 20 70 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e   pager directly.
de40: 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61  .  */.  ThreadDa
de50: 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74  ta *pTsd = sqlit
de60: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  e3ThreadData();.
de70: 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20 29    assert( pTsd )
de80: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
de90: 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 61  f malloc() has a
dea0: 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20 72 65  lready failed re
deb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
dec0: 4d 2e 20 42 65 66 6f 72 65 20 65 76 65 6e 0a 20  M. Before even. 
ded0: 20 2a 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20   ** testing for 
dee0: 74 68 69 73 2c 20 73 65 74 20 2a 70 70 50 61 67  this, set *ppPag
def0: 65 72 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68  er to NULL so th
df00: 65 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 20 74  e caller knows t
df10: 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 73 74  he pager.  ** st
df20: 72 75 63 74 75 72 65 20 77 61 73 20 6e 65 76 65  ructure was neve
df30: 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 20 20  r allocated. .  
df40: 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
df50: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
df60: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
df70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
df80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
df90: 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20   memset(&fd, 0, 
dfa0: 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20  sizeof(fd));..  
dfb0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
dfc0: 72 20 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a  r file and set z
dfd0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20  FullPathname to 
dfe0: 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28  point at malloc(
dff0: 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  )ed .  ** memory
e000: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e010: 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d  complete filenam
e020: 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e  e (i.e. includin
e030: 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 29  g the directory)
e040: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
e050: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
e060: 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65  ame[0] ){.#ifnde
e070: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
e080: 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
e090: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
e0a0: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
e0b0: 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
e0c0: 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61  1;.      zFullPa
e0d0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  thname = sqliteS
e0e0: 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d  trDup("");.    }
e0f0: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
e100: 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  {.      zFullPat
e110: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
e120: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
e130: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
e140: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
e150: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
e160: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
e170: 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61  eadWrite(zFullPa
e180: 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65  thname, &fd, &re
e190: 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d  adOnly);.      }
e1a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
e1b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e1c0: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
e1d0: 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20  Temp, &fd);.    
e1e0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d  zFilename = zTem
e1f0: 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  p;.    zFullPath
e200: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
e210: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
e220: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
e230: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e240: 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65  {.      tempFile
e250: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
e260: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
e270: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
e280: 72 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74  re. As part of t
e290: 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69  he same allocati
e2a0: 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a  on, allocate.  *
e2b0: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
e2c0: 66 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68  full paths of th
e2d0: 65 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72  e file, director
e2e0: 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20  y and journal . 
e2f0: 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65   ** (Pager.zFile
e300: 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72  name, Pager.zDir
e310: 65 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72  ectory and Pager
e320: 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f  .zJournal)..  */
e330: 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68  .  if( zFullPath
e340: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65  name ){.    name
e350: 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75  Len = strlen(zFu
e360: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e370: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
e380: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
e390: 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65  pPager) + nameLe
e3a0: 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 7d 0a  n*3 + 30 );.  }.
e3b0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
e3c0: 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74  r occured in eit
e3d0: 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
e3e0: 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
e3f0: 65 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70  e memory .  ** p
e400: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75  ointed to by zFu
e410: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65  llPathname, free
e420: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
e430: 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
e440: 68 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53  he .  ** file. S
e450: 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
e460: 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
e470: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
e480: 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
e490: 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
e4a0: 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
e4b0: 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
e4c0: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
e4d0: 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
e4e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
e4f0: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
e500: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
e510: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e520: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
e530: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  r);.    return (
e540: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f  (rc==SQLITE_OK)?
e550: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29  SQLITE_NOMEM:rc)
e560: 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 33 28  ;.  }..  TRACE3(
e570: 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
e580: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
e590: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
e5a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
e5b0: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
e5c0: 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
e5d0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
e5e0: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
e5f0: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
e600: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
e610: 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
e620: 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65  Directory[nameLe
e630: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
e640: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
e650: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
e660: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
e670: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  r->zDirectory, z
e680: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a  FullPathname);..
e690: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
e6a0: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
e6b0: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
e6c0: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
e6d0: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
e6e0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
e6f0: 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70   = 0;.  strcpy(p
e700: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
e710: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e720: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
e730: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e740: 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e  strcpy(&pPager->
e750: 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e  zJournal[nameLen
e760: 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a  ], "-journal");.
e770: 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66    pPager->fd = f
e780: 64 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  d;.  /* pPager->
e790: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
e7a0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   */.  pPager->us
e7b0: 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
e7c0: 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
e7d0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
e7e0: 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
e7f0: 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
e800: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
e810: 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
e820: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
e830: 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
e840: 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
e850: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
e860: 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
e870: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
e880: 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  eSize = SQLITE_D
e890: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
e8a0: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
e8b0: 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
e8c0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
e8d0: 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
e8e0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
e8f0: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
e900: 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20  Pager->nMaxPage 
e910: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
e920: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a  ->mxPage = 100;.
e930: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
e940: 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f  UNLOCK==0 );.  /
e950: 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
e960: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
e970: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
e980: 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
e990: 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
e9a0: 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
e9b0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
e9c0: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
e9d0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
e9e0: 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
e9f0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
ea00: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
ea10: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
ea20: 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
ea30: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
ea40: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
ea50: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
ea60: 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  1);.  /* pPager-
ea70: 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
ea80: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
ea90: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
eaa0: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
eab0: 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
eac0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
ead0: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
eae0: 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61 67 65  nExtra);.  pPage
eaf0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
eb00: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
eb10: 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  E;.  /* pPager->
eb20: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
eb30: 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
eb40: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
eb50: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
eb60: 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
eb70: 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
eb80: 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r;.#ifdef SQLITE
eb90: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
eba0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67  ANAGEMENT.  pPag
ebb0: 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64  er->pNext = pTsd
ebc0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64  ->pPager;.  pTsd
ebd0: 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
ebe0: 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  r;.#endif.  retu
ebf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ec00: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
ec10: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
ec20: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
ec30: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62  lite3pager_set_b
ec40: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
ec50: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
ec60: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
ec70: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
ec80: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
ec90: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
eca0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
ecb0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
ecc0: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
ecd0: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
ece0: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
ecf0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
ed00: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
ed10: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
ed20: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
ed30: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
ed40: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
ed50: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
ed60: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
ed70: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
ed80: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
ed90: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
eda0: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
edb0: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
edc0: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
edd0: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
ede0: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
edf0: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
ee00: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
ee10: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
ee20: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
ee30: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
ee40: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
ee50: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
ee60: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
ee70: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
ee80: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
ee90: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
eea0: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
eeb0: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
eec0: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
eed0: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
eee0: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
eef0: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
ef00: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
ef10: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
ef20: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
ef30: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
ef40: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
ef50: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
ef60: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
ef70: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
ef80: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
ef90: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
efa0: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
efb0: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
efc0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
efd0: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
efe0: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
eff0: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
f000: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
f010: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
f020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
f030: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65  e page size.  Re
f040: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a  turn the new siz
f050: 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65  e.  If the sugge
f060: 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73  st new page.** s
f070: 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72  ize is inappropr
f080: 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
f090: 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
f0a0: 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a  ize is selected.
f0b0: 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e  ** and returned.
f0c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
f0d0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a  ager_set_pagesiz
f0e0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
f0f0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
f100: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
f110: 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
f120: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
f130: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69  PAGE_SIZE );.  i
f140: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
f150: 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
f160: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
f170: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Size;.  }.  retu
f180: 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  rn pPager->pageS
f190: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
f1a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
f1b0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
f1c0: 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
f1d0: 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
f1e0: 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
f1f0: 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
f200: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
f210: 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
f220: 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
f230: 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
f240: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
f250: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
f260: 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
f270: 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
f280: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
f290: 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
f2a0: 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
f2b0: 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
f2c0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
f2d0: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
f2e0: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
f2f0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
f300: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
f310: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
f320: 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65  ed_cnt;.void cle
f330: 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  ar_simulated_io_
f340: 65 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74  error(){.  sqlit
f350: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20  e3_io_error_hit 
f360: 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61  = 0;.}.void disa
f370: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
f380: 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
f390: 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
f3a0: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
f3b0: 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
f3c0: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
f3d0: 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
f3e0: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
f3f0: 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
f400: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
f410: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
f420: 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
f430: 0a 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f  .# define clear_
f440: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
f450: 6f 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69  or().# define di
f460: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
f470: 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
f480: 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
f490: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
f4a0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
f4b0: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
f4c0: 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
f4d0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
f4e0: 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
f4f0: 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
f500: 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
f510: 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
f520: 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
f530: 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
f540: 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
f550: 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
f560: 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
f570: 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
f580: 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
f590: 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
f5a0: 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
f5b0: 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
f5c0: 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
f5d0: 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
f5e0: 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
f5f0: 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
f600: 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
f610: 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
f620: 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
f630: 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
f640: 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
f650: 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
f660: 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
f670: 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
f680: 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  s)..*/.void sqli
f690: 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69  te3pager_read_fi
f6a0: 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
f6b0: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
f6c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
f6d0: 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  est){.  memset(p
f6e0: 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
f6f0: 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
f700: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
f710: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
f720: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
f730: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
f740: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  0);.    sqlite3O
f750: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
f760: 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20  , pDest, N);.   
f770: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
f780: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
f790: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
f7a0: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
f7b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
f7c0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
f7d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
f7e0: 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   pPager. .**.** 
f7f0: 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42  If the PENDING_B
f800: 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20  YTE lies on the 
f810: 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66  page directly af
f820: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
f830: 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  he.** file, then
f840: 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70   consider this p
f850: 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  age part of the 
f860: 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78  file too. For ex
f870: 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e  ample, if.** PEN
f880: 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74  DING_BYTE is byt
f890: 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73  e 4096 (the firs
f8a0: 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35  t byte of page 5
f8b0: 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  ) and the size o
f8c0: 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  f the.** file is
f8d0: 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69   4096 bytes, 5 i
f8e0: 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
f8f0: 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20  ad of 4..*/.int 
f900: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
f910: 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
f920: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
f930: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f940: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
f950: 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
f960: 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
f970: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
f980: 73 65 20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  se {.    if( sql
f990: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
f9a0: 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d  Pager->fd, &n)!=
f9b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f9c0: 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
f9d0: 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 49 4f  Pager, SQLITE_IO
f9e0: 45 52 52 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ERR);.      retu
f9f0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
fa00: 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
fa10: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
fa20: 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  .      n = 1;.  
fa30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
fa40: 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
fa50: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
fa60: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
fa70: 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
fa80: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
fa90: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  >dbSize = n;.   
faa0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
fab0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  (PENDING_BYTE/pP
fac0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
fad0: 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
fae0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
faf0: 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
fb00: 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
fb10: 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
fb20: 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a  al(Pager*);.../*
fb30: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66  .** Unlink pPg f
fb40: 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
fb50: 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
fb60: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
fb70: 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
fb80: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
fb90: 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
fba0: 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
fbb0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
fbc0: 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
fbd0: 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
fbe0: 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63  page() routine c
fbf0: 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20  an leave a page 
fc00: 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74  in the .** pNext
fc10: 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c  Free/pPrevFree l
fc20: 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ist that is not 
fc30: 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  a part of any ha
fc40: 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  sh-chain..*/.sta
fc50: 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48  tic void unlinkH
fc60: 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a  ashChain(Pager *
fc70: 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
fc80: 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
fc90: 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pgno==0 ){.    /
fca0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
fcb0: 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68  mber is zero, th
fcc0: 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
fcd0: 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68 20  not in any hash 
fce0: 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65  chain. */.    re
fcf0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
fd00: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
fd10: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
fd20: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
fd30: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
fd40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
fd50: 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
fd60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
fd70: 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61  ->aHash[pager_ha
fd80: 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d  sh(pPg->pgno)]!=
fd90: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
fda0: 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
fdb0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
fdc0: 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
fdd0: 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65      int h = page
fde0: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
fdf0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
fe00: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
fe10: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
fe20: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
fe30: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
fe40: 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
fe50: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 76 6f 69  {.    static voi
fe60: 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50  d clearHistory(P
fe70: 67 48 69 73 74 6f 72 79 2a 29 3b 20 20 2f 2a 20  gHistory*);  /* 
fe80: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
fe90: 65 20 2a 2f 0a 20 20 20 20 63 6c 65 61 72 48 69  e */.    clearHi
fea0: 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
feb0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
fec0: 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67  );.  }.  pPg->pg
fed0: 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  no = 0;.  pPg->p
fee0: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
fef0: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
ff00: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61  ../*.** Unlink a
ff10: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
ff20: 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ree list (the li
ff30: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
ff40: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a  where nRef==0).*
ff50: 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68  * and from its h
ff60: 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
ff70: 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
ff80: 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50  oid unlinkPage(P
ff90: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
ffa0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ffb0: 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
ffc0: 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74   Keep the pFirst
ffd0: 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70  Synced pointer p
ffe0: 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66  ointing at the f
fff0: 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65  irst synchronize
10000 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  d page */.  if( 
10010 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  pPg==pPager->pFi
10020 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
10030 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
10040 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
10050 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
10060 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
10070 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
10080 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
10090 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d  tSynced = p;.  }
100a0 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
100b0 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
100c0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  */.  if( pPg->pP
100d0 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70  revFree ){.    p
100e0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
100f0 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
10100 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c  pNextFree;.  }el
10110 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
10120 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
10130 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
10140 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
10150 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a  >pNextFree;.  }.
10160 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
10170 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
10180 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
10190 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
101a0 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  evFree;.  }else{
101b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
101c0 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20  ger->pLast==pPg 
101d0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
101e0 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
101f0 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67  vFree;.  }.  pPg
10200 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
10210 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30  g->pPrevFree = 0
10220 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
10230 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73  rom the pgno has
10240 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c  h table */.  unl
10250 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
10260 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69  ger, pPg);.}..#i
10270 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10280 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
10290 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
102a0 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
102b0 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
102c0 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65  atabase.  Delete
102d0 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68  .** all pages wh
102e0 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67  ose pgno is larg
102f0 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
10300 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
10310 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52  referenced..** R
10320 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
10330 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
10340 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
10350 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eroed..*/.static
10360 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e   void memoryTrun
10370 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
10380 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
10390 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  g;.  PgHdr **ppP
103a0 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20  g;.  int dbSize 
103b0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
103c0 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61  ;..  ppPg = &pPa
103d0 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69  ger->pAll;.  whi
103e0 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67  le( (pPg = *ppPg
103f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
10400 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a  pPg->pgno<=dbSiz
10410 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20  e ){.      ppPg 
10420 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
10430 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10440 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  pPg->nRef>0 ){. 
10450 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
10460 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
10470 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
10480 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67  ize);.      ppPg
10490 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
104a0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
104b0 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d      *ppPg = pPg-
104c0 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
104d0 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
104e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
104f0 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
10500 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
10510 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
10520 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79  e.#define memory
10530 54 72 75 6e 63 61 74 65 28 70 29 0a 23 65 6e 64  Truncate(p).#end
10540 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  if../*.** Try to
10550 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
10560 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
10570 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
10580 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
10590 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
105a0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
105b0 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
105c0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
105d0 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
105e0 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
105f0 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
10600 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
10610 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
10620 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
10630 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
10640 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
10650 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10660 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
10670 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
10680 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
10690 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
106a0 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
106b0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
106c0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
106d0 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
106e0 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
106f0 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
10700 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
10710 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
10720 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
10730 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
10740 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10750 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
10760 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10770 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
10780 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
10790 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
107a0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73  SQLITE_BUSY && s
107b0 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
107c0 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
107d0 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b  pBusyHandler) );
107e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
107f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10800 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
10810 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 0a  locktype;.    }.
10820 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
10840 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
10850 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
10860 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
10870 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
10880 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
10890 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
108a0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
108b0 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
108c0 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
108d0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
108e0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
108f0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
10900 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
10910 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
10920 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
10930 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
10940 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10950 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
10960 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
10970 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
10980 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  nPage;.    memor
10990 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
109a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
109b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
109c0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
109d0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
109e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
109f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10a00 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
10a10 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
10a20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
10a30 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
10a40 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65  . */.  rc = page
10a50 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
10a60 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
10a70 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
10a80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10a90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10aa0 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
10ab0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
10ac0 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   nPage);.  if( r
10ad0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10ae0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10af0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a  ze = nPage;.  }.
10b00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10b10 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
10b20 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
10b30 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
10b40 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
10b50 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
10b60 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
10b70 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
10b80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10b90 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
10ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10bb0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
10bc0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
10bd0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
10be0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
10bf0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
10c00 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
10c10 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
10c20 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
10c30 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
10c40 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
10c50 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
10c60 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
10c70 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
10c80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
10c90 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
10ca0 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
10cb0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
10cc0 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
10cd0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
10ce0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
10cf0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
10d00 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
10d10 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
10d20 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
10d30 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
10d40 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
10d50 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
10d60 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
10d70 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
10d80 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
10d90 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
10da0 2c 20 2a 70 4e 65 78 74 3b 0a 23 69 66 64 65 66  , *pNext;.#ifdef
10db0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
10dc0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
10dd0 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
10de0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
10df0 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
10e00 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
10e10 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
10e20 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
10e30 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
10e40 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
10e50 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
10e60 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
10e70 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
10e80 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
10e90 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
10ea0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
10eb0 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
10ec0 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
10ed0 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20  oc can be set.. 
10ee0 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
10ef0 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
10f00 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
10f10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 20 29  assert( pPager )
10f20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64  ;.  assert( pTsd
10f30 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63   && pTsd->nAlloc
10f40 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77   );.#endif..  sw
10f50 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74  itch( pPager->st
10f60 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
10f70 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a 0a  PAGER_RESERVED:.
10f80 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53      case PAGER_S
10f90 59 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73 65  YNCED: .    case
10fa0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
10fb0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  : {.      /* We 
10fc0 69 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72  ignore any IO er
10fd0 72 6f 72 73 20 74 68 61 74 20 6f 63 63 75 72 20  rors that occur 
10fe0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
10ff0 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65  ack.      ** ope
11000 72 61 74 69 6f 6e 2e 20 53 6f 20 64 69 73 61 62  ration. So disab
11010 6c 65 20 49 4f 20 65 72 72 6f 72 20 73 69 6d 75  le IO error simu
11020 6c 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  lation so that t
11030 65 73 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  esting.      ** 
11040 77 6f 72 6b 73 20 6d 6f 72 65 20 65 61 73 69 6c  works more easil
11050 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
11060 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
11070 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
11080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61  .      sqlite3pa
11090 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
110a0 67 65 72 29 3b 0a 20 20 20 20 20 20 65 6e 61 62  ger);.      enab
110b0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
110c0 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 20 20  errors();.      
110d0 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
110e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
110f0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
11100 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
11110 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
11120 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
11130 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
11140 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
11150 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11160 7d 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  }.    case PAGER
11170 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20  _SHARED: {.     
11180 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
11190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
111a0 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
111b0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
111c0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
111d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
111e0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
111f0 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
11200 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11210 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70  .  }.  for(pPg=p
11220 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
11230 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69  ; pPg=pNext){.#i
11240 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
11250 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
11260 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
11270 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
11280 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
11290 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
112a0 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
112b0 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
112c0 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
112d0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
112e0 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
112f0 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
11300 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  dif.    pNext = 
11310 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
11320 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
11330 67 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32  g);.  }.  TRACE2
11340 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
11350 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
11360 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11370 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70  r->errCode || (p
11380 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
11390 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  en==0 && pPager-
113a0 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b  >stmtOpen==0) );
113b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
113c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
113d0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
113e0 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
113f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
11400 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
11410 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nal);.  if( pPag
11420 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
11430 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11440 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
11450 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11460 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
11470 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  >fd);.  /* Temp 
11480 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
11490 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
114a0 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
114b0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
114c0 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
114d0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
114e0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
114f0 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23  ;.  ** }.  */..#
11500 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11510 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
11520 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76  EMENT.  /* Remov
11530 65 20 74 68 65 20 70 61 67 65 72 20 66 72 6f 6d  e the pager from
11540 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
11550 20 6f 66 20 70 61 67 65 72 73 20 73 74 61 72 74   of pagers start
11560 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54 68 72  ing at .  ** Thr
11570 65 61 64 44 61 74 61 2e 70 50 61 67 65 72 20 69  eadData.pPager i
11580 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
11590 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ent is enabled..
115a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
115b0 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72 20  r==pTsd->pPager 
115c0 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50 61  ){.    pTsd->pPa
115d0 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e  ger = pPager->pN
115e0 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
115f0 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20    Pager *pTmp;. 
11600 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70 54     for(pTmp = pT
11610 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d 70  sd->pPager; pTmp
11620 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72 3b  ->pNext!=pPager;
11630 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78   pTmp=pTmp->pNex
11640 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70  t){}.    pTmp->p
11650 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Next = pPager->p
11660 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Next;.  }.#endif
11670 0a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ..  sqliteFree(p
11680 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
11690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
116a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
116b0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
116c0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
116d0 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
116e0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
116f0 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61  mber(void *pData
11700 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
11710 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
11720 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
11730 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
11740 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
11750 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
11760 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
11770 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
11780 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
11790 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
117a0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
117b0 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
117c0 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
117d0 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
117e0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
117f0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
11800 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
11810 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
11820 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
11830 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
11840 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
11850 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
11860 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
11870 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
11880 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
11890 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
118a0 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
118b0 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
118c0 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
118d0 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
118e0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
118f0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
11900 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
11910 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
11920 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
11930 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
11940 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67      if( pPg==pPg
11950 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
11960 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20  Synced ){.      
11970 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
11980 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
11990 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
119a0 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
119b0 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
119c0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
119d0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
119e0 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = p;.    }.    i
119f0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
11a00 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
11a10 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
11a20 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
11a30 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tFree;.    }else
11a40 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
11a50 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
11a60 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
11a70 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
11a80 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
11a90 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
11aa0 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
11ab0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
11ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11ad0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c   pPg->pPager->pL
11ae0 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
11af0 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
11b00 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
11b10 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
11b20 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46  nRef++;.  REFINF
11b30 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66  O(pPg);.}.#ifdef
11b40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
11b50 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11b60 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
11b70 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
11b80 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
11b90 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a  _page_ref(pPg);.
11ba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11bb0 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
11bc0 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
11bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
11be0 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f  e.# define page_
11bf0 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e  ref(P)   ((P)->n
11c00 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66  Ref==0?_page_ref
11c10 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e  (P):(void)(P)->n
11c20 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f  Ref++).#endif../
11c30 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
11c40 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
11c50 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
11c60 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65  The input pointe
11c70 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  r is.** a refere
11c80 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  nce to the page 
11c90 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  data..*/.int sql
11ca0 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f  ite3pager_ref(vo
11cb0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
11cc0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
11cd0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
11ce0 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
11cf0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11d00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
11d10 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
11d20 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
11d30 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
11d40 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
11d50 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
11d60 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
11d70 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
11d80 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
11d90 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
11da0 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20  isk.  It is not 
11db0 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  safe to modify t
11dc0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
11dd0 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
11de0 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75  after.** the jou
11df0 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79  rnal has been sy
11e00 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72  nced.  If the or
11e10 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
11e20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f  is modified befo
11e30 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  re.** the journa
11e40 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20  l is synced and 
11e50 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
11e60 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79  occurs, the unsy
11e70 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  nced journal.** 
11e80 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f  data would be lo
11e90 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  st and we would 
11ea0 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  be unable to com
11eb0 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b  pletely rollback
11ec0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
11ed0 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62   changes.  Datab
11ee0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
11ef0 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a  ould occur..** .
11f00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11f10 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65  also updates the
11f20 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
11f30 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
11f40 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65   journal..** (Se
11f50 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68  e comments on th
11f60 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
11f70 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  () routine for a
11f80 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
11f90 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68  ation.).** If th
11fa0 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46  e sync mode is F
11fb0 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77  ULL, two syncs w
11fc0 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73  ill occur.  Firs
11fd0 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  t the whole jour
11fe0 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64  nal.** is synced
11ff0 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20  , then the nRec 
12000 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
12010 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20  , then a second 
12020 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
12030 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
12040 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64   databases, we d
12050 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65  o not care if we
12060 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c   are able to rol
12070 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61  lback.** after a
12080 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
12090 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  so sync occurs..
120a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
120b0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
120c0 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
120d0 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
120e0 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
120f0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
12100 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
12110 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
12120 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
12130 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12140 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  OK;..  /* Sync t
12150 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
12160 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
12170 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
12180 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
12190 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
121a0 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
121b0 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
121c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
121d0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
121e0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
121f0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73  File ){.      as
12200 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
12210 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
12220 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70     /* assert( !p
12230 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
12240 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74   // noSync might
12250 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68   be set if synch
12260 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  ronous.      ** 
12270 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61  was turned off a
12280 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
12290 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
122a0 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a  .  Ticket #615 *
122b0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
122c0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
122d0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
122e0 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63  e pPager->nRec c
122f0 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65  ounter we are ke
12300 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20  eping agrees.   
12310 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65       ** with the
12320 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
12330 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
12340 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12350 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
12360 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20       i64 jSz;.  
12370 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12380 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
12390 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b  ger->jfd, &jSz);
123a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
123b0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
123c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
123d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
123e0 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  ff==jSz );.     
123f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
12400 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
12410 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
12420 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
12430 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
12440 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
12450 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
12460 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
12470 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
12480 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
12490 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
124a0 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
124b0 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
124c0 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
124d0 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
124e0 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
124f0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
12500 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20  llback. .       
12510 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
12520 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
12530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52   ){.          TR
12540 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
12550 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
12560 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
12570 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
12580 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
12590 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
125a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
125b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
125c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
125d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
125e0 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a  ek(pPager->jfd,.
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12600 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
12610 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
12620 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
12630 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
12640 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12650 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
12660 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
12670 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
12680 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20  ->nRec);.       
12690 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
126a0 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63   rc;..        rc
126b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
126c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
126d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
126e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
126f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
12700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
12710 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
12720 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
12730 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
12740 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12750 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
12760 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
12770 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20 69  _fsync);.      i
12780 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
12790 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67  n rc;.      pPag
127a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
127b0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
127c0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
127d0 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
127e0 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
127f0 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
12800 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
12810 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
12820 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
12830 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
12840 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
12850 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
12860 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
12870 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
12880 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
12890 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
128a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
128b0 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
128c0 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
128d0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
128e0 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
128f0 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
12900 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
12910 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
12920 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
12930 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
12940 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
12950 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
12960 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
12970 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
12980 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
12990 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
129a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
129b0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
129c0 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
129d0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
129e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
129f0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
12a00 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
12a10 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
12a20 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
12a30 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
12a40 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
12a50 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
12a60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
12a70 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
12a80 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
12a90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12aa0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
12ab0 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
12ac0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
12ad0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
12ae0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
12af0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12b00 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
12b10 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
12b20 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
12b30 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
12b40 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
12b50 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
12b60 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
12b70 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
12b80 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
12b90 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
12ba0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
12bb0 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
12bc0 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
12bd0 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
12be0 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
12bf0 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
12c00 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
12c10 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
12c20 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
12c30 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
12c40 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
12c50 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
12c60 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
12c70 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
12c80 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
12c90 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
12ca0 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
12cb0 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
12cc0 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
12cd0 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
12ce0 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
12cf0 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
12d00 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
12d10 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
12d20 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
12d30 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
12d40 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
12d50 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
12d60 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
12d70 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
12d80 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
12d90 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
12da0 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
12db0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
12dc0 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
12dd0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
12de0 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
12df0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
12e00 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
12e10 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
12e20 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
12e30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12e40 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
12e50 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
12e60 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
12e70 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
12e80 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  ayback..  */.  r
12e90 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
12ea0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
12eb0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
12ec0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12ed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
12ee0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  n rc;.  }..  whi
12ef0 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  le( pList ){.   
12f00 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
12f10 64 69 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20  dirty );.    rc 
12f20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
12f30 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69  pPager->fd, (pLi
12f40 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34  st->pgno-1)*(i64
12f50 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
12f60 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
12f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12f80 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
12f90 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
12fa0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
12fb0 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
12fc0 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
12fd0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
12fe0 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
12ff0 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
13000 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
13010 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
13020 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
13030 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
13040 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
13050 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
13060 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
13070 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
13080 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
13090 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
130a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
130b0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
130c0 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  a = CODEC2(pPage
130d0 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
130e0 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
130f0 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20  pgno, 6);.      
13100 54 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64  TRACE3("STORE %d
13110 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
13120 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
13130 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
13140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13150 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
13160 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
13170 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
13180 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
13190 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
131a0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
131b0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
131c0 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52    TRACE3("NOSTOR
131d0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
131e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
131f0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
13200 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13210 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
13220 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   rc;.    pList->
13230 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
13240 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13250 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
13260 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
13270 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
13280 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
13290 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
132a0 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
132b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
132c0 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65  *.** Collect eve
132d0 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e  ry dirty page in
132e0 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20  to a dirty list 
132f0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  and.** return a 
13300 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
13310 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ead of that list
13320 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65  .  All pages are
13330 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76  .** collected ev
13340 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73  en if they are s
13350 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  till in use..*/.
13360 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
13370 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
13380 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70  y_pages(Pager *p
13390 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
133a0 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c  *p, *pList;.  pL
133b0 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ist = 0;.  for(p
133c0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
133d0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
133e0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72  {.    if( p->dir
133f0 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  ty ){.      p->p
13400 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20  Dirty = pList;. 
13410 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a       pList = p;.
13420 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13430 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
13440 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
13450 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
13460 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
13470 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
13480 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
13490 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
134a0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
134b0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
134c0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
134d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
134e0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
134f0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
13500 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
13510 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
13520 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
13530 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
13540 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
13550 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
13560 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
13570 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
13580 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
13590 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
135a0 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
135b0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
135c0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
135d0 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
135e0 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
135f0 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nal) ) return 0;
13600 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
13610 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
13620 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  k(pPager->fd) ) 
13630 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
13640 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
13650 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d  ecount(pPager)==
13660 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13670 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
13680 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
13690 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
136a0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
136b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
136c0 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  y to find a page
136d0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
136e0 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c  at can be recycl
136f0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed. .**.** This 
13700 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75  routine may retu
13710 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  rn SQLITE_IOERR,
13720 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20   SQLITE_FULL or 
13730 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a  SQLITE_OK. It .*
13740 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74  * does not set t
13750 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  he pPager->errCo
13760 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  de variable..*/.
13770 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
13780 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a  _recycle(Pager *
13790 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63  pPager, int sync
137a0 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  Ok, PgHdr **ppPg
137b0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
137c0 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
137d0 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20   /* Find a page 
137e0 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79  to recycle.  Try
137f0 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67   to locate a pag
13800 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  e that does not.
13810 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
13820 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
13830 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
13840 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50  .  */.  pPg = pP
13850 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
13860 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ed;..  /* If we 
13870 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
13880 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
13890 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66  not require an f
138a0 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74  sync().  ** on t
138b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
138c0 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
138d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
138e0 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72  is is a.  ** ver
138f0 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
13900 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
13910 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
13920 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
13930 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68  ** it can't be h
13940 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  elped..  */.  if
13950 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67  ( pPg==0 && pPag
13960 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79  er->pFirst && sy
13970 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b  ncOk && !MEMDB){
13980 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79  .    int rc = sy
13990 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
139a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
139b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
139c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
139d0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
139e0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ync ){.      /* 
139f0 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
13a00 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65  mode, write a ne
13a10 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  w journal header
13a20 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
13a30 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
13a40 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f   This is done to
13a50 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69   avoid ever modi
13a60 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a  fying a journal.
13a70 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20        ** header 
13a80 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64  that is involved
13a90 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
13aa0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
13ab0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72  ave.      ** alr
13ac0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
13ad0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
13ae0 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68  e (in case the h
13af0 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a  eader is.      *
13b00 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74  * trashed when t
13b10 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
13b20 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20   updated)..     
13b30 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
13b40 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
13b50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13b60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30  ->journalOff > 0
13b70 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   );.      rc = w
13b80 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
13b90 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
13ba0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
13bb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13bc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13bd0 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
13be0 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  irst;.  }.  if( 
13bf0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pPg==0 ){.    re
13c00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13c10 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
13c20 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
13c30 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
13c40 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
13c50 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69  ase file if it i
13c60 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20  s dirty..  */.  
13c70 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
13c80 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
13c90 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13ca0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
13cb0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
13cc0 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
13cd0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
13ce0 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28  ( pPg );.    if(
13cf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13d00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
13d10 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  c;.    }.  }.  a
13d20 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
13d30 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
13d40 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
13d50 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61   recycling is ma
13d60 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
13d70 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a  llback, then.  *
13d80 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c  * set the global
13d90 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
13da0 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62  flag, thus disab
13db0 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71  ling the.  ** sq
13dc0 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  lite_dont_rollba
13dd0 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ck() optimizatio
13de0 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f  n for the rest o
13df0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
13e00 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e  on..  ** It is n
13e10 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74  ecessary to do t
13e20 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20  his because the 
13e30 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61  page marked alwa
13e40 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  ysRollback.  ** 
13e50 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65  might be reloade
13e60 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d  d at a later tim
13e70 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f  e but at that po
13e80 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d  int we won't rem
13e90 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ember.  ** that 
13ea0 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c  is was marked al
13eb0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54  waysRollback.  T
13ec0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
13ed0 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20  ll pages must.  
13ee0 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
13ef0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
13f00 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e  rom here on out.
13f10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
13f20 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
13f30 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ){.    pPager->a
13f40 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
13f50 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  1;.  }..  /* Unl
13f60 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65  ink the old page
13f70 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
13f80 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68  ist and the hash
13f90 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e   table.  */.  un
13fa0 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
13fb0 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
13fc0 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a 70  r->nOvfl);..  *p
13fd0 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  pPg = pPg;.  ret
13fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13ff0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
14000 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
14010 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75  to free superflu
14020 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  ous dynamically 
14030 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
14040 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20  .** held by the 
14050 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65  pager system. Me
14060 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61  mory in use by a
14070 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20  ny SQLite pager 
14080 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
14090 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
140a0 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65  ad may be sqlite
140b0 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20  Free()ed..**.** 
140c0 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62  nReq is the numb
140d0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
140e0 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20  emory required. 
140f0 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68  Once this much h
14100 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61  as.** been relea
14110 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
14120 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67  n returns. A neg
14130 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20  ative value for 
14140 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72  nReq means.** fr
14150 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
14160 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54  y as possible. T
14170 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
14180 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
14190 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73  ber .** of bytes
141a0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
141b0 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
141c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
141d0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69  ORY_MANAGEMENT.i
141e0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
141f0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 69  release_memory(i
14200 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73  nt nReq){.  cons
14210 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54  t ThreadData *pT
14220 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68  sdro = sqlite3Th
14230 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
14240 28 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a  ();.  Pager *p;.
14250 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20    int nReleased 
14260 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
14270 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67   /* If the the g
14280 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68  lobal mutex is h
14290 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75  eld, this subrou
142a0 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20  tine becomes a. 
142b0 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62   ** o-op; zero b
142c0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61  ytes of memory a
142d0 72 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20  re freed.  This 
142e0 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  is because.  ** 
142f0 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65  some of the code
14300 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73   invoked by this
14310 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
14320 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f  so.  ** try to o
14330 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c  btain the mutex,
14340 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
14350 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  deadlock..  */. 
14360 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e   if( sqlite3OsIn
14370 4d 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20  Mutex(0) ){.    
14380 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
14390 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f   /* Outermost lo
143a0 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d  op runs for at m
143b0 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f  ost two iteratio
143c0 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74  ns. First iterat
143d0 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20  ion we.  ** try 
143e0 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74  to find memory t
143f0 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  hat can be relea
14400 73 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c  sed without call
14410 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63  ing fsync(). Sec
14420 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69  ond.  ** iterati
14430 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72  on (which only r
14440 75 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74  uns if the first
14450 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20   failed to free 
14460 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20  nReq bytes of.  
14470 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65  ** memory) is pe
14480 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20  rmitted to call 
14490 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73  fsync(). This is
144a0 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20   of course much 
144b0 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e  more .  ** expen
144c0 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  sive..  */.  for
144d0 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29  (i=0; i<=1; i++)
144e0 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  {..    /* Loop t
144f0 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53  hrough all the S
14500 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65  QLite pagers ope
14510 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
14520 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  nt thread. */.  
14530 20 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e    for(p=pTsdro->
14540 70 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52  pPager; p && (nR
14550 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
14560 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e  d<nReq); p=p->pN
14570 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ext){.      PgHd
14580 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e  r *pPg;.      in
14590 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t rc;..      /* 
145a0 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20  For each pager, 
145b0 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d  try to free as m
145c0 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73  any pages as pos
145d0 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a  sible (without .
145e0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
145f0 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73   fsync() if this
14600 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74   is the first it
14610 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  eration of the o
14620 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20  utermost .      
14630 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20  ** loop)..      
14640 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
14650 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
14660 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
14670 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70  , i, &pPg)) && p
14680 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Pg) {.        /*
14690 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70   We've found a p
146a0 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20  age to free. At 
146b0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
146c0 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20  age has been .  
146d0 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64        ** removed
146e0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68   from the page h
146f0 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d  ash-table, free-
14700 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d  list and synced-
14710 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  list .        **
14720 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
14730 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
14740 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
14750 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
14760 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74      ** Remove it
14770 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20   from this list 
14780 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a  before freeing..
14790 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
147a0 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63     ** Todo: Chec
147b0 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d  k the Pager.pStm
147c0 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73  t list to make s
147d0 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20  ure this is Ok. 
147e0 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  It .        ** p
147f0 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67  robably is thoug
14800 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  h..        */.  
14810 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d        PgHdr *pTm
14820 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
14830 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20  t( pPg );.      
14840 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72    page_remove_fr
14850 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  om_stmt_list(pPg
14860 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14870 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pg==p->pAll ){. 
14880 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c            p->pAl
14890 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
148a0 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  l;.        }else
148b0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
148c0 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70   pTmp=p->pAll; p
148d0 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70  Tmp->pNextAll!=p
148e0 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  Pg; pTmp=pTmp->p
148f0 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20  NextAll ){}.    
14900 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78        pTmp->pNex
14910 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  tAll = pPg->pNex
14920 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tAll;.        }.
14930 20 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65          nRelease
14940 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63  d += sqliteAlloc
14950 53 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Size(pPg);.     
14960 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
14970 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  g);.      }..   
14980 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14990 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
149a0 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  /* An error occu
149b0 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
149c0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
149d0 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20  se file or .    
149e0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
149f0 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  n pager_recycle(
14a00 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  ). The error is 
14a10 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20  not returned to 
14a20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
14a30 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
14a40 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  unction. Instead
14a50 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
14a60 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
14a70 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
14a80 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
14a90 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
14aa0 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69  ser (or users, i
14ab0 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20  n the case .    
14ac0 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
14ad0 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
14ae0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
14af0 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
14b00 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
14b10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
14b20 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
14b30 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c  IOERR || rc==SQL
14b40 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20  ITE_FULL );.    
14b50 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
14b60 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
14b70 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  RVED );.        
14b80 70 61 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72  pager_error(p, r
14b90 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
14ba0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
14bb0 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
14bc0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
14bd0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
14be0 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  GEMENT */../*.**
14bf0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
14c00 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
14c10 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
14c20 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
14c30 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
14c40 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
14c50 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
14c60 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
14c70 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
14c80 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
14c90 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b  *.** A _get work
14ca0 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e  s for any page n
14cb0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
14cc0 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61  an 0.  If the da
14cd0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
14ce0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
14cf0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
14d00 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61  e, then no actua
14d10 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f  l disk.** read o
14d20 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65  ccurs and the me
14d30 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
14d40 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  e page is initia
14d50 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20  lized to.** all 
14d60 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72  zeros.  The extr
14d70 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
14d80 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
14d90 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a  ays initialized.
14da0 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ** to zeros the 
14db0 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
14dc0 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
14dd0 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
14de0 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
14df0 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
14e00 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
14e10 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
14e20 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
14e30 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
14e40 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
14e50 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
14e60 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
14e70 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c  o sqlite3pager_l
14e80 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
14e90 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
14ea0 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70  _lookup() attemp
14eb0 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
14ec0 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
14ed0 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
14ee0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
14ef0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
14f00 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
14f10 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
14f20 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
14f30 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f   in whereas _loo
14f40 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
14f50 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
14f60 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
14f70 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
14f80 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
14f90 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
14fa0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
14fb0 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
14fc0 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
14fd0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
14fe0 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  e _lookup() neve
14ff0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
15000 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
15010 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
15020 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
15030 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
15040 74 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67  te3pager_get(Pag
15050 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
15060 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70   pgno, void **pp
15070 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
15080 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
15090 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
150a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
150b0 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
150c0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
150d0 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
150e0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
150f0 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
15100 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
15110 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
15120 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
15130 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
15140 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
15150 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
15160 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
15170 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
15180 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
15190 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
151a0 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
151b0 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
151c0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
151d0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  *ppPage = 0;.  i
151e0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
151f0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
15200 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
15210 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
15220 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
15230 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
15240 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
15250 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
15260 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
15270 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
15280 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15290 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
152a0 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
152b0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66  !MEMDB ){.    if
152c0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
152d0 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  dlock ){.      r
152e0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
152f0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
15300 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
15310 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15330 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
15340 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
15350 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
15360 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
15370 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
15380 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
15390 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
153a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
153b0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
153c0 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
153d0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
153e0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
153f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73    */.    if( has
15400 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
15410 72 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 20  r) ){.       /* 
15420 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
15430 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15440 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
15450 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
15460 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74         ** import
15470 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
15480 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
15490 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
154a0 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
154b0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
154c0 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
154d0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
154e0 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
154f0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
15500 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
15510 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
15520 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
15530 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
15540 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
15550 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
15560 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
15570 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
15580 69 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61  it .       ** ba
15590 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20  ck..       ** . 
155a0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
155b0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
155c0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
155d0 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
155e0 2c 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  , the.       ** 
155f0 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
15600 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
15610 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
15620 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
15630 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69       ** obtain i
15640 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  t's own EXCLUSIV
15650 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
15660 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
15670 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
15680 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
15690 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
156a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
156b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
156c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
156d0 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
156e0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
156f0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  O_LOCK);.       
15700 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
15710 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
15720 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15730 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
15740 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
15750 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
15760 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
15770 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20  XCLUSIVE;..     
15780 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
15790 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
157a0 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
157b0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
157c0 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20        ** we are 
157d0 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  unable to open t
157e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
157f0 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   .       **.    
15800 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61     ** The journa
15810 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
15820 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
15830 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20  d itself.  The. 
15840 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
15850 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
15860 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
15870 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
15880 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a  e holds.       *
15890 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
158a0 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
158b0 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
158c0 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
158d0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
158e0 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
158f0 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
15900 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  time..       */.
15910 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15920 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
15930 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
15940 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
15950 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
15960 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
15980 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
15990 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
159a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
159b0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
159c0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65  OCK;.         re
159d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
159e0 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
159f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15a00 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
15a10 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15a20 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
15a30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
15a40 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
15a50 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
15a60 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
15a70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15a80 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20  lHdr = 0;..     
15a90 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
15aa0 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
15ab0 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
15ac0 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
15ad0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
15ae0 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
15af0 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
15b00 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
15b10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
15b20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
15b30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15b40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65  K ){.         re
15b50 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
15b60 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
15b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15b80 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
15b90 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
15ba0 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63   for page in cac
15bb0 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  he */.    pPg = 
15bc0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
15bd0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
15be0 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61  if( MEMDB && pPa
15bf0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
15c00 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
15c10 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
15c20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
15c30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
15c40 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
15c50 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
15c60 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
15c70 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
15c80 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
15c90 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
15ca0 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66  ->nMiss);.    if
15cb0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
15cc0 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
15cd0 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
15ce0 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a  ==0 || MEMDB ){.
15cf0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
15d00 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20  a new page */.  
15d10 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
15d20 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
15d30 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
15d40 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
15d70 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
15d80 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
15db0 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
15dc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
15dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
15de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15df0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
15e00 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c    memset(pPg, 0,
15e10 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a   sizeof(*pPg));.
15e20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
15e30 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
15e40 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  t(PGHDR_TO_HIST(
15e50 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
15e60 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72   sizeof(PgHistor
15e70 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  y));.      }.   
15e80 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
15e90 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70   pPager;.      p
15ea0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
15eb0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
15ec0 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
15ed0 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61  = pPg;.      pPa
15ee0 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
15ef0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15f00 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d  nPage>pPager->nM
15f10 61 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  axPage ){.      
15f20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15f30 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61  ->nMaxPage==(pPa
15f40 67 65 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b  ger->nPage-1) );
15f50 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
15f60 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20  >nMaxPage++;.   
15f70 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
15f80 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15f90 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c  _recycle(pPager,
15fa0 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20   1, &pPg);.     
15fb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15fc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
15fd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
15fe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
15ff0 67 29 20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  g) ;.    }.    p
16000 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
16010 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
16020 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  >aInJournal && (
16030 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
16040 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
16050 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
16060 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  ckMemory(pPager-
16070 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >aInJournal, pgn
16080 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65  o/8);.      asse
16090 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
160a0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
160b0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
160c0 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  = (pPager->aInJo
160d0 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
160e0 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
160f0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
16100 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
16110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
16120 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
16130 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
16140 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
16150 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16160 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  aInStmt && (int)
16170 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
16180 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  mtSize.         
16190 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e      && (pPager->
161a0 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20  aInStmt[pgno/8] 
161b0 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
161c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67  !=0 ){.      pag
161d0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
161e0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  st(pPg);.    }el
161f0 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72  se{.      page_r
16200 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f  emove_from_stmt_
16210 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
16220 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
16230 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  = 0;.    pPg->nR
16240 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49  ef = 1;.    REFI
16250 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20 70  NFO(pPg);..    p
16260 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
16270 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
16280 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20  Extra>0 ){.     
16290 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
162a0 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
162b0 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
162c0 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
162d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
162e0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
162f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
16300 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ef(PGHDR_TO_DATA
16310 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63  (pPg));.      rc
16320 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
16330 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  de;.      return
16340 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
16350 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
16360 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20  page with data, 
16370 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e  either by readin
16380 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
16390 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c  ase.    ** file,
163a0 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74   or by setting t
163b0 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74  he entire page t
163c0 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  o zero..    */. 
163d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61     if( sqlite3pa
163e0 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
163f0 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20  ager)<(int)pgno 
16400 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  || MEMDB ){.    
16410 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
16420 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
16430 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16440 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16450 20 20 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44      assert( MEMD
16460 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  B==0 );.      rc
16470 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
16480 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  (pPager->fd, (pg
16490 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
164a0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
164b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
164c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
164d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
164e0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
164f0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
16500 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  g),.            
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16520 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
16530 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
16540 20 20 20 54 52 41 43 45 33 28 22 46 45 54 43 48     TRACE3("FETCH
16550 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
16560 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
16570 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
16580 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
16590 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
165a0 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
165b0 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   3);.      if( r
165c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
165d0 20 20 20 20 20 20 20 20 69 36 34 20 66 69 6c 65          i64 file
165e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Size;.        in
165f0 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 4f  t rc2 = sqlite3O
16600 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
16610 2d 3e 66 64 2c 20 26 66 69 6c 65 53 69 7a 65 29  ->fd, &fileSize)
16620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16630 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  2!=SQLITE_OK || 
16640 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70  fileSize>=pgno*p
16650 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
16660 29 7b 0a 09 20 20 2f 2a 20 41 6e 20 49 4f 20 65  ){..  /* An IO e
16670 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
16680 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 65 20 73  one of the the s
16690 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 29 20 6f  qlite3OsSeek() o
166a0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  r.          ** s
166b0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63  qlite3OsRead() c
166c0 61 6c 6c 73 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  alls above. */. 
166d0 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67           pPg->pg
166e0 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  no = 0;.        
166f0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
16700 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
16710 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
16720 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16730 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
16740 20 20 20 20 20 20 20 20 63 6c 65 61 72 5f 73 69          clear_si
16750 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
16760 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  ();.          me
16770 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
16780 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
16790 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
167a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
167b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 45  else{.        TE
167c0 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
167d0 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a  nRead);.      }.
167e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69      }..    /* Li
167f0 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  nk the page into
16800 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74   the page hash t
16810 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20  able */.    h = 
16820 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
16830 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
16840 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
16850 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
16860 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
16870 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
16880 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
16890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
168a0 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
168b0 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
168c0 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
168d0 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
168e0 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  Pg;.    }..#ifde
168f0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
16900 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
16910 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
16920 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
16930 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
16940 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
16950 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
16960 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
16970 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70  .    TEST_INCR(p
16980 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20  Pager->nHit);.  
16990 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
169a0 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
169b0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
169c0 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
169d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
169e0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
169f0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
16a00 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
16a10 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
16a20 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
16a30 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
16a40 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
16a50 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
16a60 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
16a70 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
16a80 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
16a90 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
16aa0 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
16ab0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
16ac0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
16ad0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
16ae0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
16af0 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
16b00 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
16b10 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
16b20 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
16b30 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
16b40 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
16b50 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
16b60 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
16b70 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
16b80 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
16b90 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
16ba0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76  r happened..*/.v
16bb0 6f 69 64 20 2a 73 71 6c 69 74 65 33 70 61 67 65  oid *sqlite3page
16bc0 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
16bd0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
16be0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
16bf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
16c00 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
16c10 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
16c20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
16c30 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
16c40 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
16c50 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
16c60 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20  rn 0;.  }.  pPg 
16c70 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
16c80 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
16c90 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74  if( pPg==0 ) ret
16ca0 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65  urn 0;.  page_re
16cb0 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
16cc0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
16cd0 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pg);.}../*.** Re
16ce0 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
16cf0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
16d00 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
16d10 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
16d20 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
16d30 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
16d40 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
16d50 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
16d60 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
16d70 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
16d80 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
16d90 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
16da0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
16db0 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
16dc0 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
16dd0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
16de0 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
16df0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
16e00 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
16e10 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
16e20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
16e30 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f  */.  pPg = DATA_
16e40 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
16e50 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
16e60 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d  nRef>0 );.  pPg-
16e70 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
16e80 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43  FO(pPg);..  CHEC
16e90 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
16ea0 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
16eb0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
16ec0 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
16ed0 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
16ee0 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
16ef0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
16f00 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
16f10 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
16f20 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
16f30 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
16f40 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
16f50 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
16f60 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20  pNextFree = 0;. 
16f70 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
16f80 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  e = pPager->pLas
16f90 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
16fa0 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Last = pPg;.    
16fb0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
16fc0 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
16fd0 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
16fe0 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20  tFree = pPg;.   
16ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
17000 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
17010 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
17020 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
17030 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
17040 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b  irstSynced==0 ){
17050 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
17060 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
17070 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
17080 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
17090 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
170a0 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
170b0 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  r(pData, pPager-
170c0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
170d0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e  }.  .    /* When
170e0 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68   all pages reach
170f0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64   the freelist, d
17100 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63  rop the read loc
17110 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  k from.    ** th
17120 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17130 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
17140 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
17150 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17160 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nRef>=0 );.    i
17170 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
17180 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a  =0 && !MEMDB ){.
17190 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
171a0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  t(pPager);.    }
171b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
171c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
171d0 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e  * Create a journ
171e0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67  al file for pPag
171f0 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c  er.  There shoul
17200 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  d already be a R
17210 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58  ESERVED.** or EX
17220 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
17230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17240 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
17250 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
17260 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
17270 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
17280 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ing.  Return an 
17290 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72  error code and r
172a0 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72  elease the.** wr
172b0 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74  ite lock if anyt
172c0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
172d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
172e0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
172f0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
17300 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
17310 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
17320 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17330 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
17340 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
17350 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
17360 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
17370 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17380 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
17390 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
173a0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
173b0 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
173c0 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
173d0 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
173e0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
173f0 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
17400 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
17410 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
17420 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
17430 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17440 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
17450 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
17460 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63  ournal;.  }.  rc
17470 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
17480 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65 72  Exclusive(pPager
17490 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
174a0 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20  ger->jfd,.      
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174c0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
174d0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
174e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
174f0 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
17500 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
17510 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
17520 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28  alHdr = 0;.  if(
17530 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17540 7b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  {.    goto faile
17550 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
17560 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  l;.  }.  sqlite3
17570 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
17580 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
17590 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a  r->full_fsync);.
175a0 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
175b0 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  llSync(pPager->f
175c0 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
175d0 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  fsync);.  sqlite
175e0 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  3OsOpenDirectory
175f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
17600 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
17610 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
17620 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
17630 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
17640 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50  tarted = 0;.  pP
17650 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
17660 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c   0;.  pPager->al
17670 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
17680 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
17690 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
176a0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
176b0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
176c0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74  errCode;.    got
176d0 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
176e0 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
176f0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
17700 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
17710 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  ize;..  rc = wri
17720 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
17730 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  ger);..  if( pPa
17740 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
17750 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
17760 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
17770 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
17780 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  _begin(pPager);.
17790 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
177a0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
177b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
177c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
177d0 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
177e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
177f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17800 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
17810 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
17820 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c  return rc;..fail
17830 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
17840 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  al:.  sqliteFree
17850 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
17860 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
17870 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
17880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17890 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a  _NOMEM ){.    /*
178a0 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20 6d   If this was a m
178b0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c  alloc() failure,
178c0 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 6f   then we will no
178d0 74 20 62 65 20 63 6c 6f 73 69 6e 67 20 74 68 65  t be closing the
178e0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 69   pager.    ** fi
178f0 6c 65 2e 20 53 6f 20 64 65 6c 65 74 65 20 61 6e  le. So delete an
17900 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  y journal file w
17910 65 20 6d 61 79 20 68 61 76 65 20 6a 75 73 74 20  e may have just 
17920 63 72 65 61 74 65 64 2e 20 4f 74 68 65 72 77 69  created. Otherwi
17930 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  se,.    ** the s
17940 79 73 74 65 6d 20 77 69 6c 6c 20 67 65 74 20 63  ystem will get c
17950 6f 6e 66 75 73 65 64 2c 20 77 65 20 68 61 76 65  onfused, we have
17960 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
17970 74 68 65 20 66 69 6c 65 20 61 6e 64 20 61 0a 20  the file and a. 
17980 20 20 20 2a 2a 20 6d 79 73 74 65 72 69 6f 75 73     ** mysterious
17990 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 70 70   journal has app
179a0 65 61 72 65 64 20 69 6e 20 74 68 65 20 66 69 6c  eared in the fil
179b0 65 73 79 73 74 65 6d 2e 0a 20 20 20 20 2a 2f 0a  esystem..    */.
179c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
179d0 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
179e0 72 6e 61 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rnal);.  }else{.
179f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
17a00 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
17a10 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  NO_LOCK);.    pP
17a20 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
17a30 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  GER_UNLOCK;.  }.
17a40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17a50 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
17a60 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
17a70 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
17a80 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
17a90 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79   when.** the any
17aa0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17ab0 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20  g happen:.**.** 
17ac0 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
17ad0 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61  r_commit() is ca
17ae0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
17af0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
17b00 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
17b10 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
17b20 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73  pager_close() is
17b30 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
17b40 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
17b50 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ref() is called 
17b60 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73  to on every outs
17b70 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a  tanding page..**
17b80 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
17b90 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
17ba0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69  routine is a poi
17bb0 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e  nter to any open
17bc0 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20   page of the.** 
17bd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
17be0 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20  Nothing changes 
17bf0 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d  about the page -
17c00 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65   it is used mere
17c10 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65  ly to.** acquire
17c20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
17c30 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
17c40 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74  e and as proof t
17c50 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  hat there is.** 
17c60 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
17c70 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
17c80 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ase..**.** The s
17c90 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
17ca0 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75  indicates how mu
17cb0 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  ch space in byte
17cc0 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  s to reserve for
17cd0 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75   a.** master jou
17ce0 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61  rnal file-name a
17cf0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17d00 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20  he journal when 
17d10 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a  it is created..*
17d20 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66  *.** A journal f
17d30 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66  ile is opened if
17d40 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
17d50 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
17d60 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a  For temporary.**
17d70 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e   files, the open
17d80 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
17d90 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72  al file is defer
17da0 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20  red until there 
17db0 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20  is an.** actual 
17dc0 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  need to write to
17dd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
17de0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
17df0 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72  ase is already r
17e00 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74  eserved for writ
17e10 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ing, this routin
17e20 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
17e30 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73  .** If exFlag is
17e40 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20   true, go ahead 
17e50 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55  and get an EXCLU
17e60 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
17e70 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61   file.** immedia
17e80 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20  tely instead of 
17e90 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65  waiting until we
17ea0 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68   try to flush th
17eb0 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a  e cache.  The.**
17ec0 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72   exFlag is ignor
17ed0 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ed if a transact
17ee0 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
17ef0 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
17f00 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e  lite3pager_begin
17f10 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e  (void *pData, in
17f20 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 67 48  t exFlag){.  PgH
17f30 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
17f40 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
17f50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
17f60 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
17f70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17f80 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
17f90 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
17fa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17fb0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
17fc0 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
17fd0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
17fe0 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  R_SHARED ){.    
17ff0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18000 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  aInJournal==0 );
18010 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
18020 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
18030 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
18040 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70  CLUSIVE;.      p
18050 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
18060 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
18070 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ze;.    }else{. 
18080 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18090 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
180a0 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
180b0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
180c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
180d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
180e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
180f0 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69  ERVED;.        i
18100 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
18110 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
18120 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
18130 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
18140 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
18150 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
18160 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18170 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
18180 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
18190 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69        pPager->di
181a0 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
181b0 20 20 20 20 54 52 41 43 45 32 28 22 54 52 41 4e      TRACE2("TRAN
181c0 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
181d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
181e0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
181f0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
18200 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
18210 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
18220 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
18230 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
18240 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18260 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
18270 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
18280 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
18290 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
182a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
182b0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
182c0 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
182d0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
182e0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
182f0 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
18300 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
18310 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
18320 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
18330 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
18340 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
18350 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
18360 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
18370 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
18380 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
18390 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
183a0 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
183b0 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
183c0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
183d0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
183e0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
183f0 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
18400 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
18410 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
18420 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
18430 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
18440 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
18450 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
18460 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
18470 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
18480 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
18490 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
184a0 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
184b0 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
184c0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
184d0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
184e0 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
184f0 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
18500 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
18510 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
18520 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
18530 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
18540 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
18550 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
18560 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
18570 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
18580 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
18590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
185a0 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70  er_write(void *p
185b0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
185c0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
185d0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
185e0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
185f0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
18600 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18610 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
18620 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
18630 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
18640 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
18650 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
18660 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
18670 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
18680 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18690 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
186a0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
186b0 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
186c0 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
186d0 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
186e0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
186f0 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
18700 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
18710 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
18720 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
18730 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
18740 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
18750 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
18760 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75    if( pPg->inJou
18770 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e  rnal && (pPg->in
18780 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Stmt || pPager->
18790 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b  stmtInUse==0) ){
187a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
187b0 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d  tyCache = 1;.  }
187c0 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
187d0 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
187e0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
187f0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
18800 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
18810 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
18820 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
18830 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
18840 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
18850 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
18860 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
18870 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
18880 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
18890 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
188a0 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
188b0 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
188c0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
188d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
188e0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
188f0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
18900 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e  lite3pager_begin
18910 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20  (pData, 0);.    
18920 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18930 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
18940 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18950 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18960 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
18970 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28  ERVED );.    if(
18980 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
18990 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
189a0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >useJournal ){. 
189b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
189c0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
189d0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
189e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
189f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18a00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
18a10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18a20 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65   || !pPager->use
18a30 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70  Journal );.    p
18a40 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
18a50 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  e = 1;.  .    /*
18a60 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
18a70 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
18a80 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
18a90 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
18aa0 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
18ab0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
18ac0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
18ad0 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
18ae0 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
18af0 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
18b00 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
18b10 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
18b20 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
18b30 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a     if( !pPg->inJ
18b40 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65  ournal && (pPage
18b50 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  r->useJournal ||
18b60 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20   MEMDB) ){.     
18b70 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
18b80 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
18b90 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
18ba0 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20       int szPg;. 
18bb0 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42         if( MEMDB
18bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
18bd0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
18be0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
18bf0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
18c00 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a         TRACE3("J
18c10 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
18c20 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
18c30 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
18c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
18c50 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69  ert( pHist->pOri
18c60 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
18c70 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
18c80 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
18c90 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
18ca0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ze );.          
18cb0 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
18cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18cd0 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
18ce0 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
18cf0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
18d00 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
18d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18d20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
18d30 20 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76 65   u32 cksum, save
18d40 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  d;.          cha
18d50 72 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e 64  r *pData2, *pEnd
18d60 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;.          /* W
18d70 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
18d80 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
18d90 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
18da0 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  e that.         
18db0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
18dc0 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
18dd0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
18de0 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
18df0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
18e00 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
18e10 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18e20 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
18e30 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
18e40 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r) );.          
18e50 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
18e60 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
18e70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
18e80 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
18e90 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
18ea0 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
18eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e 64  ;.          pEnd
18ec0 20 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61 67   = pData2 + pPag
18ed0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
18ee0 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20 2d          pData2 -
18ef0 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 4;.          s
18f00 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70 45  aved = *(u32*)pE
18f10 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  nd;.          pu
18f20 74 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63 6b  t32bits(pEnd, ck
18f30 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sum);.          
18f40 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70  szPg = pPager->p
18f50 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20  ageSize+8;.     
18f60 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70       put32bits(p
18f70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f  Data2, pPg->pgno
18f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
18f90 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
18fa0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
18fb0 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20  ata2, szPg);.   
18fc0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
18fd0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50  ournalOff += szP
18fe0 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  g;.          TRA
18ff0 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE4("JOURNAL %d 
19000 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
19010 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
19020 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
19030 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
19040 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
19050 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
19060 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61  *(u32*)pEnd = sa
19070 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65  ved;...  /* An e
19080 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
19090 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
190a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
190b0 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
190c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
190d0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
190e0 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f  by the layer abo
190f0 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
19100 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
19110 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19120 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
19130 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
19140 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50   }..          pP
19150 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
19160 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19170 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
19180 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
19190 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
191a0 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
191b0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
191c0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
191d0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
191e0 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
191f0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  c;.          if(
19200 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
19210 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
19220 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
19230 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
19240 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
19250 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  7);.            
19260 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
19270 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
19280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19290 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
192a0 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
192b0 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
192c0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
192d0 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
192e0 63 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  c;.        TRACE
192f0 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  4("APPEND %d pag
19300 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
19310 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19320 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
19330 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
19340 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
19350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
19360 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
19370 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
19380 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
19390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
193a0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
193b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   1;.    }.  .   
193c0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
193d0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
193e0 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
193f0 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
19400 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
19410 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
19420 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
19430 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
19440 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
19450 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
19460 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
19470 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
19480 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
19490 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
194a0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
194b0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
194c0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
194d0 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
194e0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21  ->stmtInUse && !
194f0 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28  pPg->inStmt && (
19500 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
19510 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
19520 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19530 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
19540 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
19550 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
19560 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
19570 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
19580 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
19590 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
195a0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
195b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
195c0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d  ( pHist->pStmt==
195d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
195e0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
195f0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
19600 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
19610 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
19620 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
19630 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
19640 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44  ist->pStmt, PGHD
19650 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
19660 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19670 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
19680 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d       TRACE3("STM
19690 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
196a0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
196b0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
196c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  gno);.      }els
196d0 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  e{.        char 
196e0 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32  *pData2 = CODEC2
196f0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
19700 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b  pPg->pgno, 7)-4;
19710 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
19720 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e  ts(pData2, pPg->
19730 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  pgno);.        r
19740 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
19750 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
19760 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
19770 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20  >pageSize+4);.  
19780 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54        TRACE3("ST
19790 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
197a0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
197b0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
197c0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
197d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
197e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
197f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
19800 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
19810 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
19820 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19830 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
19840 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
19850 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
19860 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
19870 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
19880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
19890 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
198a0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
198b0 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
198c0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
198d0 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
198e0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
198f0 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
19900 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
19910 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
19920 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
19930 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
19940 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
19950 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
19960 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
19970 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
19980 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
19990 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
199a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
199b0 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
199c0 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
199d0 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
199e0 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
199f0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
19a00 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
19a10 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
19a20 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
19a30 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
19a40 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
19a50 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
19a60 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
19a70 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
19a80 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  le(void *pData){
19a90 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
19aa0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
19ab0 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
19ac0 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e  Pg->dirty;.}.#en
19ad0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
19ae0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a  ITE_OMIT_VACUUM.
19af0 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
19b00 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
19b10 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
19b20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
19b30 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
19b40 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
19b50 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76   sqlite3pager_ov
19b60 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
19b70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
19b80 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
19b90 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
19ba0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
19bb0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
19bc0 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
19bd0 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
19be0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19bf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19c00 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
19c10 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
19c20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19c30 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c     memcpy(pPage,
19c40 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
19c50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
19c60 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
19c70 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
19c80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19c90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19ca0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
19cb0 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
19cc0 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
19cd0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
19ce0 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
19cf0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
19d00 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b  page "pgno" back
19d10 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
19d20 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
19d30 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
19d40 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
19d50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
19d60 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
19d70 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
19d80 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
19d90 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
19da0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
19db0 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65   is unused.  The
19dc0 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
19dd0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
19de0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
19df0 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
19e00 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
19e10 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
19e20 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
19e30 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  on, together wit
19e40 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  h the.** sqlite3
19e50 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
19e60 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72  ack() below, mor
19e70 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68  e than double th
19e80 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61  e speed.** of la
19e90 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61  rge INSERT opera
19ea0 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75  tions and quadru
19eb0 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
19ec0 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a   large DELETEs..
19ed0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
19ee0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19ef0 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79  d, set the alway
19f00 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74  sRollback flag t
19f10 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65  o true..** Subse
19f20 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
19f30 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
19f40 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
19f50 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a  the same page.**
19f60 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72   will thereafter
19f70 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68   be ignored.  Th
19f80 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
19f90 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c  to avoid a probl
19fa0 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61  em.** where a pa
19fb0 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20  ge with data is 
19fc0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
19fd0 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65  elist during one
19fe0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72   part of.** a tr
19ff0 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72  ansaction then r
1a000 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1a010 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
1a020 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20  a later part.** 
1a030 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e  of the same tran
1a040 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  saction and reus
1a050 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ed for some othe
1a060 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e  r purpose.  When
1a070 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20   it.** is first 
1a080 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
1a090 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  elist, this rout
1a0a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
1a0b0 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20  When reused,.** 
1a0c0 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  the dont_rollbac
1a0d0 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
1a0e0 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
1a0f0 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e  use the page con
1a100 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61  tains.** critica
1a110 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
1a120 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
1a130 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20   it gets rolled 
1a140 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a  back in spite.**
1a150 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c   of the dont_rol
1a160 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
1a170 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
1a180 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61  er_dont_write(Pa
1a190 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1a1a0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1a1b0 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45   *pPg;..  if( ME
1a1c0 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  MDB ) return;.. 
1a1d0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
1a1e0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
1a1f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1a200 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 6e 65  !=0 );  /* We ne
1a210 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f 77  ver call _dont_w
1a220 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68 65 20  rite unless the 
1a230 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d 20 2a  page is in mem *
1a240 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  /.  pPg->alwaysR
1a250 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
1a260 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26  f( pPg->dirty &&
1a270 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
1a280 55 73 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Use ){.    if( p
1a290 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
1a2a0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26  int)pPg->pgno &&
1a2b0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1a2c0 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
1a2d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
1a2e0 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
1a2f0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
1a300 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
1a310 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
1a320 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
1a330 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1a340 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
1a350 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
1a360 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
1a370 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
1a380 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
1a390 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
1a3a0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
1a3b0 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
1a3c0 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
1a3d0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
1a3e0 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
1a3f0 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
1a400 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
1a410 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
1a420 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
1a430 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
1a440 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
1a450 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
1a460 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
1a470 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
1a480 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
1a490 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
1a4a0 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
1a4b0 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
1a4c0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1a4d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a4e0 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52   TRACE3("DONT_WR
1a4f0 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
1a500 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45  d\n", pgno, PAGE
1a510 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1a520 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1a530 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
1a540 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1a550 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
1a560 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1a570 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
1a580 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1a590 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1a5a0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1a5b0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1a5c0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
1a5d0 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
1a5e0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
1a5f0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
1a600 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1a610 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
1a620 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1a630 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
1a640 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
1a650 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
1a660 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
1a670 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  al..*/.void sqli
1a680 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
1a690 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61  llback(void *pDa
1a6a0 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
1a6b0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
1a6c0 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
1a6d0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1a6e0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20  >pPager;..  if( 
1a6f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1a700 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
1a710 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
1a720 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72  lOpen==0 ) retur
1a730 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  n;.  if( pPg->al
1a740 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
1a750 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1a760 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20  llback || MEMDB 
1a770 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1a780 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
1a790 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
1a7a0 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
1a7b0 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  gDbSize ){.    a
1a7c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1a7d0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1a7e0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
1a7f0 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
1a800 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1a810 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67  pgno&7);.    pPg
1a820 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1a830 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1a840 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1a850 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1a860 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1a870 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1a880 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65  o&7);.      page
1a890 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1a8a0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
1a8b0 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52    TRACE3("DONT_R
1a8c0 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20  OLLBACK page %d 
1a8d0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
1a8e0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1a8f0 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ger));.  }.  if(
1a900 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1a910 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
1a920 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
1a930 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1a940 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  mtSize ){.    as
1a950 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
1a960 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
1a970 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1a980 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
1a990 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a9a0 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
1a9b0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1a9c0 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1a9d0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1a9e0 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
1a9f0 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1aa00 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66  Pg);.  }.}...#if
1aa10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1aa20 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
1aa30 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
1aa40 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
1aa50 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
1aa60 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
1aa70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46  Hist){.  sqliteF
1aa80 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  ree(pHist->pOrig
1aa90 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
1aaa0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
1aab0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
1aac0 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d  0;.  pHist->pStm
1aad0 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23  t = 0;.}.#else.#
1aae0 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74  define clearHist
1aaf0 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  ory(x).#endif../
1ab00 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20  *.** Commit all 
1ab10 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
1ab20 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65  atabase and rele
1ab30 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1ab40 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1ab50 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f   commit fails fo
1ab60 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20  r any reason, a 
1ab70 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74  rollback attempt
1ab80 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20   is made.** and 
1ab90 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1aba0 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74   returned.  If t
1abb0 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64  he commit worked
1abc0 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  , SQLITE_OK.** i
1abd0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
1abe0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1abf0 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
1ac00 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1ac10 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1ac20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1ac30 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
1ac40 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1ac50 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
1ac60 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
1ac70 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
1ac80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ac90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52  _ERROR;.  }.  TR
1aca0 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
1acb0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1acc0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1acd0 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
1ace0 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
1acf0 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
1ad00 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
1ad10 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48   ){.      clearH
1ad20 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
1ad30 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1ad40 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  ));.      pPg->d
1ad50 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
1ad60 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1ad70 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
1ad80 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
1ad90 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1ada0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
1adb0 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
1adc0 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
1add0 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
1ade0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69  pDirty;.    }.#i
1adf0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1ae00 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
1ae10 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
1ae20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
1ae30 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1ae40 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1ae50 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1ae60 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
1ae70 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
1ae80 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
1ae90 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
1aea0 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
1aeb0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
1aec0 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
1aed0 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
1aee0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1aef0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1af00 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
1af10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1af20 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1af30 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1af40 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==0 ){.    /* E
1af50 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f  xit early (witho
1af60 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d  ut doing the tim
1af70 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69  e-consuming sqli
1af80 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c  te3OsSync() call
1af90 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  s).    ** if the
1afa0 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
1afb0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
1afc0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1afd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1afe0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  ger->needSync==0
1aff0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
1b000 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1b010 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1b020 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1b030 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1b040 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1b050 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b060 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
1b070 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50  te3pager_sync(pP
1b080 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69  ager, 0, 0);.  i
1b090 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b0a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1b0b0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1b0c0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1b0d0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1b0e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b0f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1b100 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
1b110 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
1b120 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
1b130 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
1b140 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
1b150 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
1b160 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
1b170 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
1b180 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
1b190 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
1b1a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1b1b0 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
1b1c0 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1b1d0 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
1b1e0 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
1b1f0 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
1b200 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54   protocol (SQLIT
1b210 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75  E_PROTOCOL) or u
1b220 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1b230 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
1b240 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
1b250 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1b260 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
1b270 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
1b280 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
1b290 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
1b2a0 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
1b2b0 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
1b2c0 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
1b2d0 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
1b2e0 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
1b2f0 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
1b300 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1b310 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1b320 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  ager_rollback(Pa
1b330 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b340 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32  int rc;.  TRACE2
1b350 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
1b360 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b370 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1b380 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1b390 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
1b3a0 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
1b3b0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
1b3c0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1b3d0 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
1b3e0 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
1b3f0 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
1b400 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
1b410 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1b420 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
1b430 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1b440 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
1b450 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1b460 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
1b470 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
1b480 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
1b490 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
1b4a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
1b4b0 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
1b4c0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1b4d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1b4e0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
1b4f0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1b500 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1b510 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
1b520 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1b530 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  e);.        TRAC
1b540 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
1b550 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
1b560 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1b570 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1b580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
1b590 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69  RACE3("PAGE %d i
1b5a0 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22  s clean on %d\n"
1b5b0 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
1b5c0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1b5d0 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
1b5e0 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
1b5f0 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
1b600 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
1b610 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1b620 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b    p->inStmt = 0;
1b630 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53  .      p->pPrevS
1b640 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74  tmt = p->pNextSt
1b650 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
1b660 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
1b670 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
1b680 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1b690 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  r(PGHDR_TO_DATA(
1b6a0 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  p), pPager->page
1b6b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
1b6c0 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20       .    }.    
1b6d0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1b6e0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
1b6f0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1b700 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20  origDbSize;.    
1b710 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
1b720 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1b730 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1b740 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1b750 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1b760 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
1b770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1b780 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
1b790 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
1b7a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b7b0 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
1b7c0 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
1b7d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
1b7e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1b7f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1b800 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
1b810 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
1b820 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
1b830 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
1b840 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1b850 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
1b860 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
1b870 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
1b880 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
1b890 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1b8a0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
1b8b0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1b8c0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
1b8d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
1b8e0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1b8f0 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
1b900 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  ger);.    rc2 = 
1b910 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1b920 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
1b930 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b940 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
1b950 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
1b960 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
1b970 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
1b980 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  r);.  }.  pPager
1b990 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a  ->dbSize = -1;..
1b9a0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
1b9b0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
1b9c0 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
1b9d0 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
1b9e0 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  t the pager.  **
1b9f0 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
1ba00 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
1ba10 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
1ba20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
1ba30 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
1ba40 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  .  */.  return p
1ba50 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1ba60 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
1ba70 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1ba80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ba90 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
1baa0 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
1bab0 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
1bac0 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
1bad0 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
1bae0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1baf0 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
1bb00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1bb10 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1bb20 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
1bb30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1bb40 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
1bb50 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
1bb60 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
1bb70 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61  sqlite3pager_sta
1bb80 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
1bb90 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
1bba0 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
1bbb0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
1bbc0 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
1bbd0 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
1bbe0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
1bbf0 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
1bc00 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
1bc10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
1bc20 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
1bc30 3e 65 72 72 43 6f 64 65 3b 0a 23 69 66 64 65 66  >errCode;.#ifdef
1bc40 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 61   SQLITE_TEST.  a
1bc50 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
1bc60 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
1bc70 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
1bc80 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76  8] = pPager->nOv
1bc90 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61  fl;.  a[9] = pPa
1bca0 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
1bcb0 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
1bcc0 72 69 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 72  rite;.#endif.  r
1bcd0 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn a;.}../*.*
1bce0 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
1bcf0 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
1bd00 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
1bd10 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
1bd20 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
1bd30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1bd40 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
1bd50 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
1bd60 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
1bd70 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
1bd80 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
1bd90 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
1bda0 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
1bdb0 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
1bdc0 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
1bdd0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1bde0 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1bdf0 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  begin(Pager *pPa
1be00 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1be10 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
1be20 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
1be30 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  E];.  assert( !p
1be40 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1be50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1be60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
1be70 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d  );.  TRACE2("STM
1be80 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50  T-BEGIN %d\n", P
1be90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1bea0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1beb0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1bec0 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70  InUse = 1;.    p
1bed0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1bee0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1bef0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1bf00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1bf10 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
1bf20 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50  alOpen ){.    pP
1bf30 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
1bf40 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  en = 1;.    retu
1bf50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1bf60 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
1bf70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1bf80 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
1bf90 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
1bfa0 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
1bfb0 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
1bfc0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
1bfd0 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  mt==0 ){.    /* 
1bfe0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
1bff0 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
1c000 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72  _LOCK); */.    r
1c010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1c020 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  EM;.  }.#ifndef 
1c030 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71  NDEBUG.  rc = sq
1c040 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1c050 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
1c060 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
1c070 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
1c080 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
1c090 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  led;.  assert( p
1c0a0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
1c0b0 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   == pPager->jour
1c0c0 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66  nalOff );.#endif
1c0d0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
1c0e0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a  Size = pPager->j
1c0f0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
1c100 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
1c110 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1c120 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
1c130 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  rOff = 0;.  pPag
1c140 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20  er->stmtCksum = 
1c150 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
1c160 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  t;.  if( !pPager
1c170 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
1c180 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1c190 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
1c1a0 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66  mp, &pPager->stf
1c1b0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
1c1c0 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
1c1d0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61  _failed;.    pPa
1c1e0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
1c1f0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
1c200 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  tmtNRec = 0;.  }
1c210 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
1c220 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  nUse = 1;.  retu
1c230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
1c240 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
1c250 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
1c260 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  >aInStmt ){.    
1c270 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
1c280 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->aInStmt);.   
1c290 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1c2a0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1c2b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c2c0 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65  Commit a stateme
1c2d0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1c2e0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
1c2f0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
1c300 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
1c310 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1c320 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a     PgHdr *pPg, *
1c330 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45  pNext;.    TRACE
1c340 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25  2("STMT-COMMIT %
1c350 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1c360 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
1c370 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
1c380 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
1c390 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
1c3a0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1c3b0 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
1c3c0 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a  r->stfd, 0); */.
1c3d0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1c3e0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1c3f0 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  t );.      pPage
1c400 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
1c410 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50      }.    for(pP
1c420 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
1c430 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
1c440 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
1c450 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
1c460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1c470 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  g->inStmt );.   
1c480 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
1c490 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
1c4a0 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
1c4b0 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
1c4c0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1c4d0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
1c4e0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1c4f0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1c500 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c510 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
1c520 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
1c530 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
1c540 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1c550 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
1c560 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20  tmtNRec = 0;.   
1c570 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1c580 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
1c590 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
1c5a0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
1c5b0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
1c5c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c5d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
1c5e0 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
1c5f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c600 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62  pager_stmt_rollb
1c610 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1c620 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1c630 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1c640 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41  InUse ){.    TRA
1c650 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41  CE2("STMT-ROLLBA
1c660 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
1c670 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1c680 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1c690 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
1c6a0 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61       for(pPg=pPa
1c6b0 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
1c6c0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53   pPg=pPg->pNextS
1c6d0 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  tmt){.        Pg
1c6e0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
1c6f0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1c700 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
1c710 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
1c720 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
1c730 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
1c740 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48  TO_DATA(pPg), pH
1c750 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67  ist->pStmt, pPag
1c760 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c770 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
1c780 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
1c790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
1c7a0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
1c7b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c7c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1c7d0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1c7e0 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20  stmtSize;.      
1c7f0 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
1c800 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1c810 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1c830 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  c = pager_stmt_p
1c840 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
1c850 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1c860 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
1c870 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
1c880 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1c890 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1c8a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1c8b0 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
1c8c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c8d0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
1c8e0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
1c8f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1c900 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1c910 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e  lite3pager_filen
1c920 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
1c930 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1c940 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
1c950 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1c960 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
1c970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c980 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1c990 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1c9a0 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  dirname(Pager *p
1c9b0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1c9c0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
1c9d0 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
1c9e0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
1c9f0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
1ca00 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
1ca10 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1ca20 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e  e3pager_journaln
1ca30 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
1ca40 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1ca50 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d  ger->zJournal;.}
1ca60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ca70 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63  rue if fsync() c
1ca80 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65  alls are disable
1ca90 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  d for this pager
1caa0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
1cab0 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61  ** if fsync()s a
1cac0 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d  re executed norm
1cad0 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
1cae0 69 74 65 33 70 61 67 65 72 5f 6e 6f 73 79 6e 63  ite3pager_nosync
1caf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1cb00 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1cb10 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a  ->noSync;.}../*.
1cb20 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63  ** Set the codec
1cb30 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
1cb40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
1cb50 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a  ager_set_codec(.
1cb60 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
1cb70 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
1cb80 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
1cb90 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
1cba0 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
1cbb0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
1cbc0 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
1cbd0 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
1cbe0 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a  pCodecArg;.}../*
1cbf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1cc00 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
1cc10 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61  crement the data
1cc20 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
1cc30 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f  -counter,.** sto
1cc40 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f  red at byte 24 o
1cc50 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
1cc60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cc70 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1cc80 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
1cc90 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64 20  pPager){.  void 
1cca0 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72 20  *pPage;.  PgHdr 
1ccb0 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
1ccc0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
1ccd0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f   int rc;..  /* O
1cce0 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
1ccf0 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
1cd00 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ng. */.  rc = sq
1cd10 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1cd20 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65  Pager, 1, &pPage
1cd30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1cd40 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1cd50 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
1cd60 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
1cd70 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1cd80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1cd90 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61  rn rc;..  /* Rea
1cda0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
1cdb0 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e 20  lue at byte 24. 
1cdc0 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44 41  */.  pPgHdr = DA
1cdd0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61 67  TA_TO_PGHDR(pPag
1cde0 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75  e);.  change_cou
1cdf0 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65 33  nter = retrieve3
1ce00 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32 34  2bits(pPgHdr, 24
1ce10 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  );..  /* Increme
1ce20 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
1ce30 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
1ce40 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
1ce50 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65   24. */.  change
1ce60 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 70 75  _counter++;.  pu
1ce70 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1ce80 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1ce90 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67  gHdr))+24, chang
1cea0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1ceb0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
1cec0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
1ced0 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
1cee0 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
1cef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cf00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
1cf10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cf20 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
1cf30 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
1cf40 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
1cf50 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
1cf60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
1cf70 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
1cf80 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
1cf90 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
1cfa0 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
1cfb0 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
1cfc0 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
1cfd0 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
1cfe0 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
1cff0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1d000 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1d010 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d020 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
1d030 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
1d040 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70  ced, all dirty p
1d050 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ages written.** 
1d060 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d070 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74  file and the dat
1d080 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
1d090 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d. The only thin
1d0a0 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e  g that.** remain
1d0b0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
1d0c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
1d0d0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1d0e0 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a  rnal file (or.**
1d0f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1d100 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
1d110 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
1d120 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
1d130 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
1d140 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
1d150 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
1d160 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
1d170 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
1d180 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
1d190 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
1d1a0 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
1d1b0 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
1d1c0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
1d1d0 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
1d1e0 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
1d1f0 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1d200 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
1d210 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1d220 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  _sync(Pager *pPa
1d230 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
1d240 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e  *zMaster, Pgno n
1d250 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
1d260 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1d270 20 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53   TRACE4("DATABAS
1d280 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
1d290 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e  zMaster=%s nTrun
1d2a0 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  c=%d\n", .      
1d2b0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1d2c0 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  e, zMaster, nTru
1d2d0 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  nc);..  /* If th
1d2e0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1d2f0 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
1d300 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
1d310 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
1d320 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
1d330 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1d340 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
1d350 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1d360 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1d370 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
1d380 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1d390 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
1d3a0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
1d3b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d3c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1d3d0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
1d3e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1d3f0 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
1d400 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1d410 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
1d420 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
1d430 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
1d440 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
1d450 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
1d460 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
1d470 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
1d480 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
1d490 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
1d4a0 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
1d4b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1d4c0 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
1d4d0 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
1d4e0 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
1d4f0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1d500 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
1d510 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
1d520 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
1d530 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1d540 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1d550 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1d560 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1d570 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  ounter(pPager);.
1d580 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d590 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1d5a0 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65  ync_exit;.#ifnde
1d5b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d5c0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
1d5d0 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
1d5e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1d5f0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
1d600 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
1d610 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
1d620 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
1d630 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
1d640 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
1d650 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
1d660 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
1d670 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1d680 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   ** file..      
1d690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1d6a0 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f 69  o i;.        voi
1d6b0 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  d *pPage;.      
1d6c0 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41    int iSkip = PA
1d6d0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1d6e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  er);.        for
1d6f0 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c  ( i=nTrunc+1; i<
1d700 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1d710 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
1d720 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67        if( !(pPag
1d730 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69  er->aInJournal[i
1d740 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29  /8] & (1<<(i&7))
1d750 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
1d760 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1d770 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1d780 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
1d790 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1d7a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d7b0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1d7c0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1d7d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1d7e0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1d7f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1d800 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
1d810 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
1d820 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d830 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1d840 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1d850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
1d860 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1d870 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1d880 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1d890 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1d8a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d8b0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1d8c0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1d8d0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
1d8e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1d8f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d900 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1d910 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  it;.    }..#ifnd
1d920 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1d930 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1d940 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
1d950 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d960 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
1d970 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
1d980 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d990 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1d9a0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
1d9b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1d9c0 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
1d9d0 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
1d9e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1d9f0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
1da00 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
1da10 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  s(pPager);.    r
1da20 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
1da30 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
1da40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1da50 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1da60 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53  _exit;..    /* S
1da70 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1da80 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
1da90 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
1daa0 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
1dab0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1dac0 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20  ager->fd, 0);.  
1dad0 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d    }..    pPager-
1dae0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1daf0 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  YNCED;.  }else i
1db00 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75  f( MEMDB && nTru
1db10 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  nc!=0 ){.    rc 
1db20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74  = sqlite3pager_t
1db30 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1db40 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79  nTrunc);.  }..sy
1db50 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  nc_exit:.  retur
1db60 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1db70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1db80 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f  OVACUUM./*.** Mo
1db90 76 65 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  ve the page iden
1dba0 74 69 66 69 65 64 20 62 79 20 70 44 61 74 61 20  tified by pData 
1dbb0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f  to location pgno
1dbc0 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a   in the file. .*
1dbd0 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
1dbe0 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73  be no references
1dbf0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1dc00 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75  page pgno. If cu
1dc10 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67  rrent page.** pg
1dc20 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
1dc30 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
1dc40 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
1dc50 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65   not written the
1dc60 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73  re by.** by this
1dc70 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61   routine. The sa
1dc80 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68  me applies to th
1dc90 65 20 70 61 67 65 20 70 44 61 74 61 20 72 65 66  e page pData ref
1dca0 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20  ers to on entry 
1dcb0 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
1dcc0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
1dcd0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
1dce0 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 70   refered to by p
1dcf0 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69  Data remain vali
1dd00 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
1dd10 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
1dd20 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
1dd30 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61  e pData (i.e. da
1dd40 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
1dd50 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
1dd60 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
1dd70 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
1dd80 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
1dd90 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
1dda0 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
1ddb0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1ddc0 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
1ddd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1dde0 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
1ddf0 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
1de00 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
1de10 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1de20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
1de30 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
1de40 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
1de50 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
1de60 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
1de70 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
1de80 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
1de90 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
1dea0 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e)..*/.int sqlit
1deb0 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65  e3pager_movepage
1dec0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1ded0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 50 67 6e  void *pData, Pgn
1dee0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1def0 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
1df00 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
1df10 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a  PgHdr *pPgOld; .
1df20 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20    int h;.  Pgno 
1df30 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
1df40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
1df50 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54  ->nRef>0 );..  T
1df60 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
1df70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
1df80 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
1df90 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
1dfa0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1dfb0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
1dfc0 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20  dSync, pgno);.. 
1dfd0 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
1dfe0 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  nc ){.    needSy
1dff0 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
1e000 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
1e010 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  pPg->inJournal )
1e020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1e030 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  g->dirty );.    
1e040 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e050 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
1e060 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  .  /* Unlink pPg
1e070 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d   from it's hash-
1e080 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e  chain */.  unlin
1e090 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
1e0a0 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  r, pPg);..  /* I
1e0b0 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
1e0c0 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
1e0d0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
1e0e0 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
1e0f0 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  * from it's hash
1e100 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
1e110 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
1e120 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
1e130 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
1e140 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
1e150 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
1e160 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
1e170 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
1e180 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
1e190 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f  ere..  */.  pPgO
1e1a0 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
1e1b0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
1e1c0 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
1e1d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1e1e0 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
1e1f0 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
1e200 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
1e210 6c 64 29 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d  ld);.    pPgOld-
1e220 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1e230 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64  if( pPgOld->need
1e240 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
1e250 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e  sert( pPgOld->in
1e260 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  Journal );.     
1e270 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1e280 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 1;.      pPg->
1e290 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1e2a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e2b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
1e2c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1e2d0 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
1e2e0 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61  number for pPg a
1e2f0 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
1e300 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63  o the new hash-c
1e310 68 61 69 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e  hain. */.  pPg->
1e320 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68  pgno = pgno;.  h
1e330 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67   = pager_hash(pg
1e340 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
1e350 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  r->aHash[h] ){. 
1e360 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e370 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
1e380 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
1e390 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1e3a0 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
1e3b0 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
1e3c0 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
1e3d0 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70  r->aHash[h];.  p
1e3e0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
1e3f0 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50  = pPg;.  pPg->pP
1e400 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20  revHash = 0;..  
1e410 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
1e420 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1e430 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28  ache = 1;..  if(
1e440 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
1e450 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
1e460 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
1e470 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
1e480 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
1e490 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
1e4a0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
1e4b0 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
1e4c0 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
1e4d0 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
1e4e0 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
1e4f0 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
1e500 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
1e510 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
1e520 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50  nd the .    ** P
1e530 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ager.aInJournal 
1e540 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74  bit has been set
1e550 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
1e560 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c  be remedied by l
1e570 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  oading.    ** th
1e580 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
1e590 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
1e5a0 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
1e5b0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e  r.needSync flag.
1e5c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1e5d0 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  he sqlite3pager_
1e5e0 67 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  get() call may c
1e5f0 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
1e600 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
1e610 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
1e620 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1e630 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
1e640 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1e650 20 72 63 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70   rc;.    void *p
1e660 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20 20 61 73  NeedSync;.    as
1e670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1e680 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
1e690 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1e6a0 67 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64  get(pPager, need
1e6b0 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64  SyncPgno, &pNeed
1e6c0 53 79 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 72  Sync);.    if( r
1e6d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1e6e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
1e6f0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
1e700 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1e710 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1e720 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1e730 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44      DATA_TO_PGHD
1e740 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e  R(pNeedSync)->in
1e750 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1e760 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1e770 4e 65 65 64 53 79 6e 63 29 2d 3e 64 69 72 74 79  NeedSync)->dirty
1e780 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
1e790 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4e 65  3pager_unref(pNe
1e7a0 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20  edSync);.  }..  
1e7b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e7c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1e7d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1e7e0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1e7f0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
1e800 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1e810 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1e820 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f  the file lock fo
1e830 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
1e840 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  r..** The return
1e850 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66   value is one of
1e860 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44   NO_LOCK, SHARED
1e870 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
1e880 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47  LOCK,.** PENDING
1e890 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53  _LOCK, or EXCLUS
1e8a0 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74  IVE_LOCK..*/.int
1e8b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
1e8c0 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
1e8d0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1e8e0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74   sqlite3OsLockSt
1e8f0 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ate(pPager->fd);
1e900 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
1e910 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1e920 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
1e930 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
1e940 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
1e950 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
1e960 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e970 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50  3pager_refdump(P
1e980 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e990 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
1e9a0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1e9b0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
1e9c0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
1e9d0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
1e9e0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1e9f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1ea00 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
1ea10 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
1ea20 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
1ea30 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
1ea40 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
1ea50 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
1ea60 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
1ea70 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
1ea80 4f 20 2a 2f 0a                                   O */.