/ Hex Artifact Content
Login

Artifact ddd05666bb89808a516baef2c186d6a75887ae90:


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: 38 20 32 30 30 36 2f 30 35 2f 30 37 20 31 37 3a  8 2006/05/07 17:
0360: 34 39 3a 33 39 20 64 72 68 20 45 78 70 20 24 0a  49:39 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28  .#define TRACE1(
0440: 58 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  X)       sqlite3
0450: 44 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23  DebugPrintf(X).#
0460: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0470: 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  Y)     sqlite3De
0480: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23  bugPrintf(X,Y).#
0490: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
04a0: 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65  Y,Z)   sqlite3De
04b0: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29  bugPrintf(X,Y,Z)
04c0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
04d0: 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33  X,Y,Z,W) sqlite3
04e0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04f0: 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Z,W).#define TRA
0500: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0530: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
0540: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
0550: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0560: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c  define TRACE4(X,
0580: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0590: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
05a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
05b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
05c0: 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 64   macros are used
05d0: 20 77 69 74 68 69 6e 20 74 68 65 20 54 52 41 43   within the TRAC
05e0: 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76  EX() macros abov
05f0: 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75  e.** to print ou
0600: 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  t file-descripto
0610: 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52  rs. .**.** PAGER
0620: 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69  ID() takes a poi
0630: 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
0640: 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20 61  struct as it's a
0650: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0660: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0670: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0680: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
0690: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
06a0: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
06b0: 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e   as it's argumen
06c0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  t..*/.#define PA
06d0: 47 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28  GERID(p) ((int)(
06e0: 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20  p->fd)).#define 
06f0: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
0700: 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a   ((int)fd)../*.*
0710: 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65  * The page cache
0720: 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61   as a whole is a
0730: 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20  lways in one of 
0740: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
0750: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
0760: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
0770: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0780: 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  che is not curre
0790: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
07a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
07b0: 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e            writin
07c0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
07d0: 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ile.  There is n
07e0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
07f0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
0800: 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  held in memory. 
0810: 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   This is the ini
0820: 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  tial.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
0840: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ate..**.**   PAG
0850: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20  ER_SHARED       
0860: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0870: 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  is reading the d
0880: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74    Writing is not
08b0: 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65   permitted.  The
08c0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20  re can be.**    
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64     multiple read
08f0: 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68  ers accessing th
0900: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a  e same database.
0910: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0920: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74           file at
0930: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
0940: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45  **.**   PAGER_RE
0950: 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73  SERVED      This
0960: 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73   process has res
0970: 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61  erved the databa
0980: 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  se for writing.*
0990: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
09a0: 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20          but has 
09b0: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79  not yet made any
09c0: 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20   changes.  Only 
09d0: 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20  one process.**  
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63       at a time c
0a00: 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64  an reserve the d
0a10: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72  atabase.  The or
0a20: 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  iginal.**       
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
0a50: 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  s not been modif
0a60: 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20  ied so other.** 
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20        processes 
0a90: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
0aa0: 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b  ding the on-disk
0ab0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0ac0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0ad0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  se file..**.**  
0ae0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
0af0: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0b00: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0b10: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0b40: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0b50: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0b60: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0b70: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
0b80: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
0b90: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
0ba0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bc0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0bd0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  ng..**.**   PAGE
0be0: 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20  R_SYNCED        
0bf0: 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  The pager moves 
0c00: 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72  to this state fr
0c10: 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  om PAGER_EXCLUSI
0c20: 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  VE.**           
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65              afte
0c40: 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
0c50: 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
0c60: 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ten to the.**   
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0c90: 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
0ca0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
0cb0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
0cc0: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e             disk.
0cd0: 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e   All that remain
0ce0: 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65  s to do is to re
0cf0: 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  move the.**     
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61    journal file a
0d20: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
0d30: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20  on will be.**   
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a      committed..*
0d60: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61  *.** The page ca
0d70: 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20  che comes up in 
0d80: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d90: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a  he first time a.
0da0: 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
0db0: 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  get() occurs, th
0dc0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0dd0: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0de0: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0df0: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0e00: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0e10: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0e20: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0e30: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0e40: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0e50: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0e60: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0e70: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
0e80: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0e90: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0ea0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0eb0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0ec0: 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65  that sqlite_page
0ed0: 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  _write() can onl
0ee0: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0ef0: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0f00: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0f10: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0f20: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0f30: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0f40: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0f50: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0f60: 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61  VED.).** The tra
0f70: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0f80: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0f90: 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e  s when before an
0fa0: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
0fb0: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
0fc0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74  abase file.  Aft
0fd0: 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67  er an sqlite3pag
0fe0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  er_rollback().**
0ff0: 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72   or sqlite_pager
1000: 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73  _commit(), the s
1010: 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74  tate goes back t
1020: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
1030: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1040: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1050: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1060: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1070: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1080: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1090: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
10a0: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
10b0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
10c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
10d0: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
10e0: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10f0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
1100: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
1110: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49        5../*.** I
1120: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  f the SQLITE_BUS
1130: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  Y_RESERVED_LOCK 
1140: 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20  macro is set to 
1150: 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d  true at compile-
1160: 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61  time,.** then fa
1170: 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f  iled attempts to
1180: 20 67 65 74 20 61 20 72 65 73 65 72 76 65 64 20   get a reserved 
1190: 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65  lock will invoke
11a0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
11b0: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f  ck..** This is o
11c0: 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ff by default.  
11d0: 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73  To see why, cons
11e0: 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
11f0: 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20  ng scenario:.** 
1200: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65  .** Suppose thre
1210: 61 64 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  ad A already has
1220: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
1230: 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73 65 72  nd wants a reser
1240: 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72  ved lock..** Thr
1250: 65 61 64 20 42 20 61 6c 72 65 61 64 79 20 68 61  ead B already ha
1260: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
1270: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65  k and wants an e
1280: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
1290: 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61  If.** both threa
12a0: 64 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65  ds are using the
12b0: 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ir busy callback
12c0: 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  s, it might be a
12d0: 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65   long time.** be
12e0: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
12f0: 74 68 72 65 61 64 73 20 67 69 76 65 20 75 70 20  threads give up 
1300: 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f  and allows the o
1310: 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e  ther to proceed.
1320: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
1330: 68 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20  hread trying to 
1340: 67 65 74 20 74 68 65 20 72 65 73 65 72 76 65 64  get the reserved
1350: 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71   lock gives up q
1360: 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74  uickly.** (if it
1370: 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69   never invokes i
1380: 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ts busy callback
1390: 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  ) then the conte
13a0: 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a  ntion will be.**
13b0: 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c   resolved quickl
13c0: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
13d0: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
13e0: 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65  ED_LOCK.# define
13f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1400: 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e  ERVED_LOCK 0.#en
1410: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1420: 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c  macro rounds val
1430: 75 65 73 20 75 70 20 73 6f 20 74 68 61 74 20 69  ues up so that i
1440: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1450: 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20  n address it.** 
1460: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1470: 20 62 65 20 61 6e 20 61 64 64 72 65 73 73 20 74   be an address t
1480: 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74  hat is aligned t
1490: 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  o an 8-byte boun
14a0: 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  dary..*/.#define
14b0: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
14c0: 28 58 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e  (X)   (((X)+7)&~
14d0: 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69  7)../*.** Each i
14e0: 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  n-memory image o
14f0: 66 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20  f a page begins 
1500: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
1510: 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68  ng header..** Th
1520: 69 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c  is header is onl
1530: 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69  y visible to thi
1540: 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20  s pager module. 
1550: 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63   The client.** c
1560: 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70  ode that calls p
1570: 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74  ager sees only t
1580: 68 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  he data that fol
1590: 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e  lows the header.
15a0: 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f  .**.** Client co
15b0: 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73  de should call s
15c0: 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
15d0: 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72  e() on a page pr
15e0: 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a  ior to making.**
15f0: 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f   any modificatio
1600: 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e  ns to that page.
1610: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
1620: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1630: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1640: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1650: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
1660: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1670: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
1680: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
1690: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
16a0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
16b0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
16c0: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
16d0: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
16e0: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
16f0: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1700: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1710: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1720: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1730: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1740: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1750: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1760: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
1770: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
1780: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
1790: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
17a0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
17b0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
17c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
17d0: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
17e0: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
17f0: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69  3pager_write() i
1800: 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  s called and.** 
1810: 69 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e  is cleared again
1820: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63   when the page c
1830: 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65  ontent is writte
1840: 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72  n back to the or
1850: 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  iginal.** databa
1860: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65  se file..*/.type
1870: 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72  def struct PgHdr
1880: 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50   PgHdr;.struct P
1890: 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a  gHdr {.  Pager *
18a0: 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
18b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
18c0: 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68  ager to which th
18d0: 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20  is page belongs 
18e0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
1910: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
1920: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
1930: 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72  *pNextHash, *pPr
1940: 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68  evHash;  /* Hash
1950: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
1960: 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20   for PgHdr.pgno 
1970: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1980: 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65  tFree, *pPrevFre
1990: 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20  e;  /* Freelist 
19a0: 6f 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  of pages where n
19b0: 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64  Ref==0 */.  PgHd
19c0: 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20  r *pNextAll;    
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19e0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
19f0: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
1a00: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
1a10: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
1a20: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
1a30: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1a40: 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61  */.  u8 inJourna
1a50: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1a60: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68      /* TRUE if h
1a70: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
1a80: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
1a90: 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20  u8 inStmt;      
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ab0: 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65  * TRUE if in the
1ac0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
1ad0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
1ae0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
1af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1b00: 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  E if we need to 
1b10: 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67  write back chang
1b20: 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  es */.  u8 needS
1b30: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
1b40: 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a         /* Sync j
1b50: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72  ournal before wr
1b60: 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  iting this page 
1b70: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
1b80: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
1b90: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64      /* Disable d
1ba0: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
1bb0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
1bc0: 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66    short int nRef
1bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
1bf0: 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  ers of this page
1c00: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
1c10: 72 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79  rty, *pPrevDirty
1c20: 3b 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61  ;    /* Dirty pa
1c30: 67 65 73 20 73 6f 72 74 65 64 20 62 79 20 50 67  ges sorted by Pg
1c40: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 75 33  Hdr.pgno */.  u3
1c50: 32 20 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  2 notUsed;      
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c70: 42 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a  Buffer space */.
1c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1c90: 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20  ECK_PAGES.  u32 
1ca0: 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66  pageHash;.#endif
1cb0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61  .  /* pPager->pa
1cc0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1cd0: 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77  page data follow
1ce0: 20 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a   this header */.
1cf0: 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72    /* Pager.nExtr
1d00: 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c  a bytes of local
1d10: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65   data follow the
1d20: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b   page data */.};
1d30: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ../*.** For an i
1d40: 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61  n-memory only da
1d50: 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74  tabase, some ext
1d60: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
1d70: 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74  s recorded about
1d80: 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f  .** each page so
1d90: 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63 61   that changes ca
1da0: 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1db0: 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .  (Journal file
1dc0: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65  s are not.** use
1dd0: 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  d for in-memory 
1de0: 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68 65  databases.)  The
1df0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72   following infor
1e00: 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20  mation is added 
1e10: 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  to.** the end of
1e20: 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f   every EXTRA blo
1e30: 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ck for in-memory
1e40: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
1e50: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
1e60: 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  on could have be
1e70: 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74 6c  en added directl
1e80: 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20 73  y to the PgHdr s
1e90: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74  tructure..** But
1ea0: 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74   then it would t
1eb0: 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61 20  ake up an extra 
1ec0: 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61  8 bytes of stora
1ed0: 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64  ge on every PgHd
1ee0: 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69  r.** even for di
1ef0: 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  sk-based databas
1f00: 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69  es.  Splitting i
1f10: 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62 79  t out saves 8 by
1f20: 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  tes.  This.** is
1f30: 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20   only a savings 
1f40: 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73  of 0.8% but thos
1f50: 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61 64  e percentages ad
1f60: 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  d up..*/.typedef
1f70: 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72   struct PgHistor
1f80: 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72  y PgHistory;.str
1f90: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a  uct PgHistory {.
1fa0: 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20    u8 *pOrig;    
1fb0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67   /* Original pag
1fc0: 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65  e text.  Restore
1fd0: 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75   to this on a fu
1fe0: 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ll rollback */. 
1ff0: 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20   u8 *pStmt;     
2000: 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77 61  /* Text as it wa
2010: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2020: 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ng of the curren
2030: 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d  t statement */.}
2040: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f  ;../*.** A macro
2050: 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69   used for invoki
2060: 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20  ng the codec if 
2070: 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a  there is one.*/.
2080: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
2090: 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65  S_CODEC.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
20b0: 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d   if( P->xCodec!=
20c0: 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50  0 ){ P->xCodec(P
20d0: 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c  ->pCodecArg,D,N,
20e0: 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43  X); }.# define C
20f0: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
2100: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
2110: 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50  c!=0?P->xCodec(P
2120: 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c  ->pCodecArg,D,N,
2130: 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64  X):D)).#else.# d
2140: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
2150: 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a  ,N,X) /* NO-OP *
2160: 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  /.# define CODEC
2170: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
2180: 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r*)D).#endif../*
2190: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f  .** Convert a po
21a0: 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72  inter to a PgHdr
21b0: 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
21c0: 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61  to its data.** a
21d0: 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a  nd back again..*
21e0: 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  /.#define PGHDR_
21f0: 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f  TO_DATA(P)  ((vo
2200: 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23  id*)(&(P)[1])).#
2210: 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50  define DATA_TO_P
2220: 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48  GHDR(D)  (&((PgH
2230: 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64  dr*)(D))[-1]).#d
2240: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45  efine PGHDR_TO_E
2250: 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64  XTRA(G,P) ((void
2260: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29  *)&((char*)(&(G)
2270: 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53  [1]))[(P)->pageS
2280: 69 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47  ize]).#define PG
2290: 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47  HDR_TO_HIST(P,PG
22a0: 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20  R)  \.          
22b0: 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26    ((PgHistory*)&
22c0: 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d  ((char*)(&(P)[1]
22d0: 29 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69  ))[(PGR)->pageSi
22e0: 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61  ze+(PGR)->nExtra
22f0: 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  ])../*.** A open
2300: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
2310: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2320: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2330: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  cture..**.** Pag
2340: 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62  er.errCode may b
2350: 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
2360: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
2370: 52 52 55 50 54 2c 20 53 51 4c 49 54 45 5f 50 52  RRUPT, SQLITE_PR
2380: 4f 54 4f 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c  OTOCOL.** or SQL
2390: 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f  ITE_FULL. Once o
23a0: 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ne of the first 
23b0: 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63  three errors occ
23c0: 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73  urs, it persists
23d0: 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72  .** and is retur
23e0: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
23f0: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
2400: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
2410: 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
2420: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
2430: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
2440: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
2450: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
2460: 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65  he.** next succe
2470: 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69  ssful rollback i
2480: 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  s performed on t
2490: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
24a0: 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  Also,.** SQLITE_
24b0: 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66  FULL does not af
24c0: 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33  fect the sqlite3
24d0: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
24e0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
24f0: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
2500: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
2510: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
2520: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
2530: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
2540: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
2550: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
2560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
2570: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
2580: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2590: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
25a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
25b0: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
25c0: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
25d0: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
25e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
25f0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2600: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2610: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
2620: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
2630: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
2640: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
2650: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
2660: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
2670: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2680: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
2690: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
26a0: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
26b0: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
26c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
26d0: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
26e0: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
26f0: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
2700: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
2710: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
2720: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
2730: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
2740: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
2750: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2760: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
2770: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
2780: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
2790: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
27a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
27b0: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
27c0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
27d0: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
27e0: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
27f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2800: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
2810: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
2820: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
2830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2840: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
2850: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
2860: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 65 72   etc. */.  u8 er
2870: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2880: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2890: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
28a0: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38  f errors */.  u8
28b0: 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20   tempFile;      
28c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
28d0: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
28e0: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
28f0: 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20  u8 readOnly;    
2900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2910: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
2920: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
2930: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2950: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
2960: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
2970: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
2980: 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b    u8 dirtyCache;
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29a0: 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20   True if cached 
29b0: 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67  pages have chang
29c0: 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ed */.  u8 alway
29d0: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
29e0: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64      /* Disable d
29f0: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
2a00: 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  or all pages */.
2a10: 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20    u8 memDb;     
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74   True to inhibit
2a40: 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f   all file I/O */
2a50: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a70: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
2a80: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
2a90: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
2aa0: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20  .  int dbSize;  
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2ad0: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  s in the file */
2ae0: 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a  .  int origDbSiz
2af0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2b00: 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20  * dbSize before 
2b10: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
2b20: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  ge */.  int stmt
2b30: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2b40: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
2b50: 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65  atabase (in page
2b60: 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  s) at stmt_begin
2b70: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  () */.  int nRec
2b80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ba0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
2bb0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
2bc0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
2bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2be0: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
2bf0: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
2c00: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
2c10: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c30: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
2c40: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
2c50: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
2c60: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
2c70: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
2c80: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
2c90: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
2ca0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
2cb0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
2cc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2cd0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
2ce0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
2cf0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2d00: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
2d10: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2d20: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2d30: 6e 4d 61 78 50 61 67 65 3b 20 20 20 20 20 20 20  nMaxPage;       
2d40: 20 20 20 20 20 20 20 20 2f 2a 20 48 69 67 68 20          /* High 
2d50: 77 61 74 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50  water mark of nP
2d60: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  age */.  int nRe
2d70: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2d80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d90: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2da0: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
2db0: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
2dc0: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2dd0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2de0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2df0: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
2e00: 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75   */.  u8 *aInJou
2e10: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
2e20: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
2e30: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
2e40: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e50: 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74  */.  u8 *aInStmt
2e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e70: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
2e80: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
2e90: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
2ea0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
2eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2ec0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2ed0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
2ee0: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
2ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2f00: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2f10: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2f20: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
2f30: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
2f40: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
2f50: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
2f60: 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a  es */.  OsFile *
2f70: 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  fd, *jfd;       
2f80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2f90: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
2fa0: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
2fb0: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74   */.  OsFile *st
2fc0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
2fd0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2fe0: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61  ptor for the sta
2ff0: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3000: 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65  l*/.  BusyHandle
3010: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
3020: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3030: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
3040: 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  er */.  PgHdr *p
3050: 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20  First, *pLast;  
3060: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
3070: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
3080: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
3090: 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ed;        /* Fi
30a0: 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69  rst free page wi
30b0: 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  th PgHdr.needSyn
30c0: 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  c==0 */.  PgHdr 
30d0: 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *pAll;          
30e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
30f0: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3100: 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20  PgHdr *pStmt;   
3110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3120: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
3130: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
3140: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67  bjournal */.  Pg
3150: 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20  Hdr *pDirty;    
3160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
3170: 74 20 6f 66 20 61 6c 6c 20 64 69 72 74 79 20 70  t of all dirty p
3180: 61 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  ages */.  i64 jo
3190: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
31a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
31b0: 20 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20   byte offset in 
31c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31d0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
31e0: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
31f0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
3200: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
3210: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
3220: 20 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b   i64 stmtHdrOff;
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3240: 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  First journal he
3250: 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 68 69  ader written thi
3260: 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
3270: 20 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20   i64 stmtCksum; 
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3290: 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73  cksumInit when s
32a0: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
32b0: 72 74 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74  rted */.  i64 st
32c0: 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20  mtJSize;        
32d0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
32e0: 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74   journal at stmt
32f0: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  _begin() */.  in
3300: 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  t sectorSize;   
3310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
3320: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
3330: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
3340: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
3350: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69  E_TEST.  int nHi
3360: 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b  t, nMiss, nOvfl;
3370: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
3380: 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64  ts, missing, and
3390: 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a   LRU overflows *
33a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57  /.  int nRead,nW
33b0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
33c0: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
33d0: 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a  s read/written *
33e0: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
33f0: 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76  (*xDestructor)(v
3400: 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61  oid*,int); /* Ca
3410: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
3420: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
3430: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
3440: 52 65 69 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c  Reiniter)(void*,
3450: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
3460: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3470: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
3480: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a 78  s */.  void *(*x
3490: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
34a0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
34b0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
34c0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
34d0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
34e0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
34f0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
3500: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
3510: 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20    int nHash;    
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3530: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   Size of the pag
3540: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  er hash table */
3550: 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68  .  PgHdr **aHash
3560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3570: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20  * Hash table to 
3580: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
3590: 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64  to PgHdr */.#ifd
35a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
35b0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
35c0: 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78  NT.  Pager *pNex
35d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
35e0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
35f0: 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68 69  of pagers in thi
3600: 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64  s thread */.#end
3610: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  if.};../*.** If 
3620: 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64  SQLITE_TEST is d
3630: 65 66 69 6e 65 64 20 74 68 65 6e 20 69 6e 63 72  efined then incr
3640: 65 6d 65 6e 74 20 74 68 65 20 76 61 72 69 61 62  ement the variab
3650: 6c 65 20 67 69 76 65 6e 20 69 6e 0a 2a 2a 20 74  le given in.** t
3660: 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23  he argument.*/.#
3670: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3680: 54 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54 5f  T.# define TEST_
3690: 49 4e 43 52 28 78 29 20 20 78 2b 2b 0a 23 65 6c  INCR(x)  x++.#el
36a0: 73 65 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54  se.# define TEST
36b0: 5f 49 4e 43 52 28 78 29 0a 23 65 6e 64 69 66 0a  _INCR(x).#endif.
36c0: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
36d0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
36e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
36f0: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
3700: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
3710: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
3720: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
3730: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
3740: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
3750: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
3760: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
3770: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
3780: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
3790: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
37a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
37b0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
37c0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
37d0: 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20  nal is begin.** 
37e0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
37f0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
3800: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
3810: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
3820: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
3830: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
3840: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
3850: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
3860: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
3870: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
3880: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
3890: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
38a0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
38b0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
38c0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
38d0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
38e0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
38f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
3900: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
3910: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
3920: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
3930: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
3940: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
3950: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
3960: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
3970: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
3980: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
3990: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
39a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
39b0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
39c0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
39d0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
39e0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
39f0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
3a00: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
3a10: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
3a20: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
3a30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
3a40: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
3a50: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
3a60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
3a70: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
3a80: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
3a90: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
3aa0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
3ab0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
3ac0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
3ad0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
3ae0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
3af0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
3b00: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
3b10: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
3b20: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
3b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
3b40: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
3b50: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
3b60: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
3b70: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
3b80: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
3b90: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
3ba0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
3bb0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
3bc0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
3bd0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
3be0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
3bf0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
3c00: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
3c10: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
3c20: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
3c30: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
3c40: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
3c50: 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65   header and of e
3c60: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
3c70: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72  journal is deter
3c80: 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  mined.** by the 
3c90: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
3ca0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
3cb0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
3cc0: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
3cd0: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
3ce0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
3cf0: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
3d00: 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74  this pager. In t
3d10: 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20  he future, this 
3d20: 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20  could be.** set 
3d30: 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65  to some value re
3d40: 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ad from the disk
3d50: 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65   controller. The
3d60: 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68   important.** ch
3d70: 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20  aracteristic is 
3d80: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73  that it is the s
3d90: 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69  ame size as a di
3da0: 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64  sk sector..*/.#d
3db0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
3dc0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
3dd0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
3de0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
3df0: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
3e00: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
3e10: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
3e20: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
3e30: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
3e40: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
3e50: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
3e60: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
3e70: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
3e80: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
3e90: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
3ea0: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
3eb0: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
3ec0: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
3ed0: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
3ee0: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
3ef0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
3f00: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
3f10: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
3f20: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
3f30: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
3f40: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 65 66  f../*.** The def
3f50: 61 75 6c 74 20 73 69 7a 65 20 6f 66 20 61 20 64  ault size of a d
3f60: 69 73 6b 20 73 65 63 74 6f 72 0a 2a 2f 0a 23 64  isk sector.*/.#d
3f70: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 45 43 54  efine PAGER_SECT
3f80: 4f 52 5f 53 49 5a 45 20 35 31 32 0a 0a 2f 2a 0a  OR_SIZE 512../*.
3f90: 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50  ** Page number P
3fa0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20  AGER_MJ_PGNO is 
3fb0: 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e  never used in an
3fc0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
3fd0: 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72   (it is.** reser
3fe0: 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20  ved for working 
3ff0: 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73  around a windows
4000: 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69  /posix incompati
4010: 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a  bility). It is.*
4020: 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f  * used in the jo
4030: 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79  urnal to signify
4040: 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e   that the remain
4050: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
4060: 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64  al file .** is d
4070: 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e  evoted to storin
4080: 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
4090: 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20  al name - there 
40a0: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65  are no more page
40b0: 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63  s to.** roll bac
40c0: 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  k. See comments 
40d0: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  for function wri
40e0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
40f0: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
4100: 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47  /./* #define PAG
4110: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50  ER_MJ_PGNO(x) (P
4120: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
4130: 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a  ->pageSize)) */.
4140: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
4150: 5f 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49  _PGNO(x) ((PENDI
4160: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
4170: 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a  geSize))+1)../*.
4180: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
4190: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
41a0: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
41b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
41c0: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
41d0: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  3647../*.** Enab
41e0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  le reference cou
41f0: 6e 74 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72  nt tracking (for
4200: 20 64 65 62 75 67 67 69 6e 67 29 20 68 65 72 65   debugging) here
4210: 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  :.*/.#ifdef SQLI
4220: 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 70  TE_DEBUG.  int p
4230: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
4240: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74  able = 0;.  stat
4250: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
4260: 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b  finfo(PgHdr *p){
4270: 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20  .    static int 
4280: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  cnt = 0;.    if(
4290: 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f   !pager3_refinfo
42a0: 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e  _enable ) return
42b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
42c0: 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
42d0: 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64   "REFCNT: %4d ad
42e0: 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
42f0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f  ,.       p->pgno
4300: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
4310: 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20  p), p->nRef.    
4320: 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20  );.    cnt++;   
4330: 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20  /* Something to 
4340: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
4350: 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66   on */.  }.# def
4360: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20  ine REFINFO(X)  
4370: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29  pager_refinfo(X)
4380: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4390: 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69  REFINFO(X).#endi
43a0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
43b0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
43c0: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
43d0: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
43e0: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
43f0: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
4400: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
4410: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
4420: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
4430: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
4440: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
4450: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
4460: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48  N-1))==0 );.  aH
4470: 61 73 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ash = sqliteMall
4480: 6f 63 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68  oc( sizeof(aHash
4490: 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20  [0])*N );.  if( 
44a0: 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  aHash==0 ){.    
44b0: 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65  /* Failure to re
44c0: 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65  hash is not an e
44d0: 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c  rror.  It is onl
44e0: 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  y a performance 
44f0: 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  hit. */.    retu
4500: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
4510: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
4520: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
4530: 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67  Hash = N;.  pPag
4540: 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73  er->aHash = aHas
4550: 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  h;.  for(pPg=pPa
4560: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
4570: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
4580: 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20  l){.    int h = 
4590: 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31  pPg->pgno & (N-1
45a0: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
45b0: 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d  tHash = aHash[h]
45c0: 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73 68 5b  ;.    if( aHash[
45d0: 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73  h] ){.      aHas
45e0: 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
45f0: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
4600: 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b   aHash[h] = pPg;
4610: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
4620: 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ash = 0;.  }.}..
4630: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
4640: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
4650: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
4660: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
4670: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
4680: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
4690: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
46a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
46b0: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
46c0: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
46d0: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
46e0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
46f0: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
4700: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
4710: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
4720: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4730: 65 61 64 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ead32bits(OsFile
4740: 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29   *fd, u32 *pRes)
4750: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
4760: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
4770: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
4780: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
4790: 28 61 63 29 29 3b 0a 20 20 69 66 28 20 72 63 3d  (ac));.  if( rc=
47a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
47b0: 20 20 2a 70 52 65 73 20 3d 20 28 61 63 5b 30 5d    *pRes = (ac[0]
47c0: 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c  <<24) | (ac[1]<<
47d0: 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29  16) | (ac[2]<<8)
47e0: 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20   | ac[3];.  }.  
47f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4800: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
4810: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
4820: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
4830: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
4840: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  te order..*/.sta
4850: 74 69 63 20 76 6f 69 64 20 70 75 74 33 32 62 69  tic void put32bi
4860: 74 73 28 63 68 61 72 20 2a 61 63 2c 20 75 33 32  ts(char *ac, u32
4870: 20 76 61 6c 29 7b 0a 20 20 61 63 5b 30 5d 20 3d   val){.  ac[0] =
4880: 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66   (val>>24) & 0xf
4890: 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61  f;.  ac[1] = (va
48a0: 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20  l>>16) & 0xff;. 
48b0: 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38   ac[2] = (val>>8
48c0: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33  ) & 0xff;.  ac[3
48d0: 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a  ] = val & 0xff;.
48e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
48f0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4900: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
4910: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
4920: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4930: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
4940: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
4950: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4960: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
4970: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
4980: 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20  its(OsFile *fd, 
4990: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
49a0: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
49b0: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
49c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
49d0: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29  Write(fd, ac, 4)
49e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
49f0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4a00: 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73   at offset 'offs
4a10: 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67  et' from the pag
4a20: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  e identified by.
4a30: 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27  ** page header '
4a40: 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  p'..*/.static u3
4a50: 32 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  2 retrieve32bits
4a60: 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f  (PgHdr *p, int o
4a70: 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e  ffset){.  unsign
4a80: 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61  ed char *ac;.  a
4a90: 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20  c = &((unsigned 
4aa0: 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
4ab0: 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b  ATA(p))[offset];
4ac0: 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b 30 5d  .  return (ac[0]
4ad0: 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c  <<24) | (ac[1]<<
4ae0: 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29  16) | (ac[2]<<8)
4af0: 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a   | ac[3];.}.../*
4b00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4b10: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
4b20: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
4b30: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
4b40: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
4b50: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
4b60: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
4b70: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
4b80: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
4b90: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
4ba0: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
4bb0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
4bc0: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
4bd0: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
4be0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
4bf0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
4c00: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
4c10: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
4c20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
4c30: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
4c40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
4c50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20  LITE_CORRUPT or 
4c60: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2c  SQLITE_PROTOCOL,
4c70: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
4c80: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
4c90: 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  . All subsequent
4ca0: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
4cb0: 69 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c  is Pager.** will
4cc0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
4cd0: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
4ce0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
4cf0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
4d00: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
4d10: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 61 73 73  , int rc){.  ass
4d20: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
4d30: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
4d40: 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  L || pPager->err
4d50: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
4d60: 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 72 63  );.  if( .    rc
4d70: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
4d80: 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f  .    rc==SQLITE_
4d90: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 3d  IOERR ||.    rc=
4da0: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
4db0: 7c 7c 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  ||.    rc==SQLIT
4dc0: 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29 7b 0a  E_PROTOCOL.  ){.
4dd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
4de0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
4df0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
4e00: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
4e10: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
4e20: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
4e30: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
4e40: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
4e50: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
4e60: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
4e70: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32  r *pPage){.  u32
4e80: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
4e90: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
4ea0: 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e  har *pData = (un
4eb0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47  signed char *)PG
4ec0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67  HDR_TO_DATA(pPag
4ed0: 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
4ee0: 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e  <pPage->pPager->
4ef0: 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a  pageSize; i++){.
4f00: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
4f10: 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20  +i)^pData[i];.  
4f20: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
4f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
4f40: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
4f50: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
4f60: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
4f70: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
4f80: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
4f90: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
4fa0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
4fb0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
4fc0: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
4fd0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
4fe0: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
4ff0: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
5000: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
5010: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
5020: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
5030: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
5040: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
5050: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
5060: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
5070: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
5080: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
5090: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
50a0: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45  r->errCode || ME
50b0: 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74  MDB || pPg->dirt
50c0: 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d  y || .      pPg-
50d0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
50e0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
50f0: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
5100: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
5110: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
5120: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
5130: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
5140: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
5150: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
5160: 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  n..** The master
5170: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5180: 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  me is read from 
5190: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
51a0: 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74  ile and .** writ
51b0: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
51c0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
51d0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70  liteMalloc(). *p
51e0: 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65  zMaster is.** se
51f0: 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  t to point at th
5200: 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  e memory and SQL
5210: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
5220: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5230: 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29  .** sqliteFree()
5240: 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a   *pzMaster..**.*
5250: 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  * If no master j
5260: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5270: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d   is present *pzM
5280: 61 73 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  aster is set to 
5290: 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  0 and.** SQLITE_
52a0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
52b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
52c0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46  asterJournal(OsF
52d0: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
52e0: 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20   **pzMaster){.  
52f0: 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65  int rc;.  u32 le
5300: 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20  n;.  i64 szJ;.  
5310: 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74  u32 cksum;.  int
5320: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
5330: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
5340: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
5350: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
5360: 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73  der */..  *pzMas
5370: 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  ter = 0;..  rc =
5380: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
5390: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
53a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
53b0: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
53c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
53d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
53e0: 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29  k(pJrnl, szJ-16)
53f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5400: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5410: 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64  c;. .  rc = read
5420: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c  32bits(pJrnl, &l
5430: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5440: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5450: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
5460: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
5470: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
5480: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5490: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
54a0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
54b0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
54c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
54d0: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
54e0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
54f0: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
5500: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5510: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
5520: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  rnl, szJ-16-len)
5530: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5540: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5550: 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  c;..  *pzMaster 
5560: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
5570: 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20  Malloc(len+1);. 
5580: 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20   if( !*pzMaster 
5590: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
55a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
55b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
55c0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d  Read(pJrnl, *pzM
55d0: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
55e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
55f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
5600: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
5610: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
5620: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
5630: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
5640: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
5650: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
5660: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
5670: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
5680: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
5690: 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65  sum -= (*pzMaste
56a0: 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  r)[i];.  }.  if(
56b0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
56c0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
56d0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
56e0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
56f0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
5700: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
5710: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
5720: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
5730: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5740: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
5750: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
5760: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
5770: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
5780: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
5790: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
57a0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
57b0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
57c0: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
57d0: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
57e0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c  aster = 0;.  }el
57f0: 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74  se{.    (*pzMast
5800: 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  er)[len] = '\0';
5810: 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72  .  }.   .  retur
5820: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5830: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a  /*.** Seek the j
5840: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
5850: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  riptor to the ne
5860: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
5870: 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f  ry where a.** jo
5880: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79  urnal header may
5890: 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
58a0: 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ten. Pager.journ
58b0: 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64  alOff is updated
58c0: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77   with.** the new
58d0: 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a   seek offset..**
58e0: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
58f0: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
5900: 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66  :.**.** Input Of
5910: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
5920: 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a    Output Offset.
5930: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20  ----------.** 0 
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5970: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32          0.** 512
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5990: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30         512.** 10
59a0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
59b0: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32          512.** 2
59c0: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
59d0: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
59e0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
59f0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
5a00: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5a10: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
5a20: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
5a30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5a40: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
5a50: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
5a60: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5a70: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
5a80: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5a90: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
5aa0: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
5ab0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
5ac0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5ad0: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
5ae0: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
5af0: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
5b00: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
5b10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5b20: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74   = offset;.  ret
5b30: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65  urn sqlite3OsSee
5b40: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
5b50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5b60: 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  f);.}../*.** The
5b70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
5b80: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
5b90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5ba0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
5bb0: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
5bc0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
5bd0: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
5be0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
5bf0: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
5c00: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
5c10: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
5c20: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
5c30: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
5c40: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
5c50: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
5c60: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
5c70: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
5c80: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
5c90: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
5ca0: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
5cb0: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
5cc0: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
5cd0: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
5ce0: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
5cf0: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
5d00: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
5d10: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
5d20: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
5d30: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
5d40: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
5d50: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
5d60: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
5d70: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
5d80: 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66  Z - 24) bytes of
5d90: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
5da0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
5db0: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
5dc0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63  er *pPager){.  c
5dd0: 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65  har zHeader[size
5de0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
5df0: 29 2b 31 36 5d 3b 0a 0a 20 20 69 6e 74 20 72 63  )+16];..  int rc
5e00: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5e10: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5e20: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5e30: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
5e40: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
5e50: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5e60: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
5e70: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
5e80: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
5e90: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
5ea0: 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70  rnalHdr;.  }.  p
5eb0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5ec0: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
5ed0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
5ee0: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
5ef0: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
5f00: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
5f10: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
5f20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
5f30: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
5f40: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
5f50: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
5f60: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
5f70: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
5f80: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
5f90: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
5fa0: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
5fb0: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
5fc0: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
5fd0: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
5fe0: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
5ff0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ..  */.  memcpy(
6000: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
6010: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
6020: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
6030: 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69    /* The nRec Fi
6040: 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20  eld. 0xFFFFFFFF 
6050: 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72  for no-sync jour
6060: 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32  nals. */.  put32
6070: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
6080: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6090: 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f  ic)], pPager->no
60a0: 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66  Sync ? 0xfffffff
60b0: 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65  f : 0);.  /* The
60c0: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
60d0: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
60e0: 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64  / .  sqlite3Rand
60f0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
6100: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6110: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
6120: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
6130: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6140: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6150: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
6160: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
6170: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
6180: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
6190: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
61a0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
61b0: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
61c0: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a  r->dbSize);.  /*
61d0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
61e0: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
61f0: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
6200: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6210: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6220: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
6230: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
6240: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
6250: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6260: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
6270: 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 3b 0a  zeof(zHeader));.
6280: 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
6290: 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65  l header has bee
62a0: 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73  n written succes
62b0: 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65  sfully. Seek the
62c0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
62d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
62e0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
62f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
6300: 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  ector..  */.  if
6310: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6320: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
6330: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
6340: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
6350: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20  ournalOff-1);.  
6360: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6370: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
6380: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
6390: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c  (pPager->jfd, "\
63a0: 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  000", 1);.    }.
63b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
63c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
63d0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
63e0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
63f0: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
6400: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
6410: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
6420: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
6430: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
6440: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
6450: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
6460: 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65   file. See comme
6470: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
6480: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
6490: 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72  dr() for a descr
64a0: 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  iption of.** the
64b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
64c0: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
64d0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
64e0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
64f0: 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74  , *nRec is set t
6500: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
6510: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
6520: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
6530: 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a  eader and *dbSiz
6540: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
6550: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
6560: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
6570: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
6580: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
6590: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
65a0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
65b0: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
65c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
65d0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
65e0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
65f0: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
6600: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
6610: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6620: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
6630: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
6640: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
6650: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52  returned and *nR
6660: 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61  ec and *dbSize a
6670: 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20  re not set.  If 
6680: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6690: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
66a0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
66b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
66c0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
66d0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
66e0: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
66f0: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
6700: 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f  Pager, .  i64 jo
6710: 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32  urnalSize,.  u32
6720: 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20   *pNRec, .  u32 
6730: 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e  *pDbSize.){.  in
6740: 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
6750: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
6760: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
6770: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
6780: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d  eader */..  rc =
6790: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
67a0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
67b0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
67c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
67d0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
67e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
67f0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
6800: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6810: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
6820: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
6830: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
6840: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
6850: 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72  Magic));.  if( r
6860: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6870: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
6880: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
6890: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
68a0: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
68b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
68c0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
68d0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
68e0: 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20  >jfd, pNRec);.  
68f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6900: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
6910: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
6920: 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  fd, &pPager->cks
6930: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
6940: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
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 70  s(pPager->jfd, p
6970: 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  DbSize);.  if( r
6980: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6990: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
69a0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
69b0: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
69c0: 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
69d0: 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
69e0: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
69f0: 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  is journal. If t
6a00: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  his journal was.
6a10: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
6a20: 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
6a30: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
6a40: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6a50: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  .  ** is being c
6a60: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
6a70: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6a80: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
6a90: 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65  lue.  ** of Page
6aa0: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
6ab0: 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
6ac0: 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
6ad0: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ine..  */.  rc =
6ae0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
6af0: 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29  er->jfd, (u32 *)
6b00: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
6b10: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
6b20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
6b30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6b40: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
6b50: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
6b60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
6b70: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
6b80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6b90: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  f);.  return rc;
6ba0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
6bb0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
6bc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6bd0: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
6be0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
6bf0: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
6c00: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
6c10: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
6c20: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
6c30: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
6c40: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
6c50: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
6c60: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
6c70: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
6c80: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
6c90: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
6ca0: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
6cb0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
6cc0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
6cd0: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
6ce0: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
6cf0: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
6d00: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
6d10: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e  _MJ_PGNO..** + N
6d20: 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f   bytes: length o
6d30: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
6d40: 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79   name..** + 4 by
6d50: 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79  tes: N.** + 4 by
6d60: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
6d70: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
6d80: 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a  m..** + 8 bytes:
6d90: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
6da0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
6db0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
6dc0: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
6dd0: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
6de0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
6df0: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  * journal name..
6e00: 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
6e10: 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
6e20: 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
6e30: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
6e40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
6e50: 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
6e60: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
6e70: 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
6e80: 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
6e90: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
6ea0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
6eb0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
6ec0: 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20  en; .  int i; . 
6ed0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a   u32 cksum = 0;.
6ee0: 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65    char zBuf[size
6ef0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6f00: 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21  )+2*4];..  if( !
6f10: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
6f20: 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65  r->setMaster) re
6f30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6f40: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
6f50: 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20  ter = 1;..  len 
6f60: 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  = strlen(zMaster
6f70: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6f80: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
6f90: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
6fa0: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  i];.  }..  /* If
6fb0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
6fc0: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
6fd0: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
6fe0: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
6ff0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
7000: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
7010: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
7020: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
7030: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
7040: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
7050: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
7060: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
7070: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
7080: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
7090: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
70a0: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
70b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
70c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
70d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
70e0: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
70f0: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
7100: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
7110: 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
7120: 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
7130: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7140: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7150: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7160: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
7170: 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20  Master, len);.  
7180: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7190: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
71a0: 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66    put32bits(zBuf
71b0: 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62  , len);.  put32b
71c0: 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b  its(&zBuf[4], ck
71d0: 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  sum);.  memcpy(&
71e0: 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61  zBuf[8], aJourna
71f0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
7200: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
7210: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7220: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
7230: 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f  d, zBuf, 8+sizeo
7240: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7250: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
7260: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
7270: 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72  >noSync;.  retur
7280: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
7290: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70  dd or remove a p
72a0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  age from the lis
72b0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74  t of all pages t
72c0: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a  hat are in the.*
72d0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
72e0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
72f0: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
7300: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
7310: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
7320: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
7330: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
7340: 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  al.  This helps 
7350: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
7360: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a  _stmt_commit().*
7370: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
7380: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
7390: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
73a0: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
73b0: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
73c0: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
73d0: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
73e0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
73f0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
7400: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
7410: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
7420: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
7430: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7440: 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  er;.  if( pPg->i
7450: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
7460: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7470: 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70  PrevStmt==0 && p
7480: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  Pg->pNextStmt==0
7490: 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   );.  pPg->pPrev
74a0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
74b0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b  pPager->pStmt ){
74c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
74d0: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
74e0: 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
74f0: 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67  pNextStmt = pPag
7500: 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61  er->pStmt;.  pPa
7510: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
7520: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
7530: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
7540: 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66  id page_remove_f
7550: 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  rom_stmt_list(Pg
7560: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
7570: 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20   !pPg->inStmt ) 
7580: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
7590: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a  g->pPrevStmt ){.
75a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
75b0: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
75c0: 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  tStmt==pPg );.  
75d0: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
75e0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
75f0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
7600: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
7610: 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
7620: 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pStmt==pPg );.  
7630: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
7640: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
7650: 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28  tStmt;.  }.  if(
7660: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7680: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
7690: 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b  PrevStmt==pPg );
76a0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53  .    pPg->pNextS
76b0: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
76c0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b   pPg->pPrevStmt;
76d0: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
76e0: 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  tStmt = 0;.  pPg
76f0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
7700: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
7710: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
7720: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
7730: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
7740: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
7750: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
7760: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
7770: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
7780: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
7790: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
77a0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
77b0: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
77c0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
77d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
77e0: 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  h==0 ) return 0;
77f0: 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  .  p = pPager->a
7800: 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61  Hash[pgno & (pPa
7810: 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a  ger->nHash-1)];.
7820: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
7830: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
7840: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
7850: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
7860: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
7870: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
7880: 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20  e and clear the 
7890: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
78a0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
78b0: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
78c0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
78d0: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
78e0: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
78f0: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
7900: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
7910: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
7920: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
7930: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
7940: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
7950: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
7960: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
7970: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
7980: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
7990: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
79a0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
79b0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
79c0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
79d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
79e0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
79f0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
7a00: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
7a10: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
7a20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
7a30: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
7a40: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
7a50: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
7a60: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
7a70: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
7a80: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
7a90: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73  ;.  pPager->nHas
7aa0: 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46  h = 0;.  sqliteF
7ab0: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
7ac0: 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  h);.  pPager->nP
7ad0: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
7ae0: 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20  r->aHash = 0;.  
7af0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
7b00: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
7b10: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
7b20: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
7b30: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
7b40: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
7b50: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
7b60: 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  K);.  pPager->st
7b70: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
7b80: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  CK;.  pPager->db
7b90: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61  Size = -1;.  pPa
7ba0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20  ger->nRef = 0;. 
7bb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7bc0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
7bd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  );.}../*.** When
7be0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7bf0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
7c00: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
7c10: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
7c20: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
7c30: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
7c40: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
7c50: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7c60: 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20  releases.** the 
7c70: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
7c80: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
7c90: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
7ca0: 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72  place.  The jour
7cb0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64  nal.** file is d
7cc0: 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  eleted and close
7cd0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
7ce0: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
7cf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7d00: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
7d10: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
7d20: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
7d30: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
7d40: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
7d50: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
7d60: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
7d70: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
7d80: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
7d90: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e  tic int pager_un
7da0: 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20  writelock(Pager 
7db0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
7dc0: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
7dd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
7de0: 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
7df0: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
7e00: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
7e10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7e20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70  ;.  }.  sqlite3p
7e30: 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
7e40: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
7e50: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
7e60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7e70: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7e80: 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  stfd);.    pPage
7e90: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
7ea0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
7eb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
7ec0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
7ed0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  lose(&pPager->jf
7ee0: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
7ef0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
7f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  .    sqlite3OsDe
7f10: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
7f20: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
7f30: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
7f40: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
7f50: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
7f60: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
7f70: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7f80: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
7f90: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
7fa0: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
7fb0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
7fc0: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
7fd0: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
7fe0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
7ff0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
8000: 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
8010: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
8020: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
8030: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  f.    }.    pPag
8040: 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
8050: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
8060: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
8070: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
8080: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
8090: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
80a0: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
80b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
80c0: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
80d0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65  0 || pPager->use
80e0: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
80f0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
8100: 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
8110: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
8120: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  );.  pPager->sta
8130: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
8140: 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69  D;.  pPager->ori
8150: 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  gDbSize = 0;.  p
8160: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
8170: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8180: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
8190: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
81a0: 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70  nced = pPager->p
81b0: 46 69 72 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  First;.  return 
81c0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
81d0: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
81e0: 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  a checksum for t
81f0: 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  he page of data.
8200: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
8210: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
8220: 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c  um.  It is reall
8230: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
8240: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
8250: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61   initial value a
8260: 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
8270: 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65  er.  We experime
8280: 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63  nted with.** a c
8290: 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65  hecksum of the e
82a0: 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20  ntire data, but 
82b0: 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74  that was found t
82c0: 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a  o be too slow..*
82d0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
82e0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
82f0: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
8300: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
8310: 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65  a and.** the che
8320: 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20  cksum is stored 
8330: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
8340: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  s is important. 
8350: 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63   If journal.** c
8360: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
8370: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
8380: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
8390: 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69  t likely scenari
83a0: 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65  o.** is that one
83b0: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
83c0: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
83d0: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
83e0: 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20    It is.** much 
83f0: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
8400: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
8410: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
8420: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
8430: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
8440: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
8450: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
8460: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
8470: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
8480: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
8490: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
84a0: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
84b0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  rruption..**.** 
84c0: 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65  FIX ME:  Conside
84d0: 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32  r adding every 2
84e0: 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74  00th (or so) byt
84f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f  e of the data to
8500: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
8510: 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61  .  That way if a
8520: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61   single page spa
8530: 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73  ns 3 or more dis
8540: 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a  k sectors and.**
8550: 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65   only the middle
8560: 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75   sector is corru
8570: 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c  pt, we will stil
8580: 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61  l have a reasona
8590: 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66  ble.** chance of
85a0: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65   failing the che
85b0: 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64  cksum and thus d
85c0: 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f  etecting the pro
85d0: 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blem..*/.static 
85e0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
85f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
8600: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
8610: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
8620: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8630: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
8640: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
8650: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
8660: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
8670: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
8680: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
8690: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
86a0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
86b0: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  tion */.static v
86c0: 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67  oid makeClean(Pg
86d0: 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  Hdr*);../*.** Re
86e0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
86f0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
8700: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
8710: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8720: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
8730: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
8740: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
8750: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
8760: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
8770: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
8780: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
8790: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
87a0: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
87b0: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
87c0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
87d0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
87e0: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
87f0: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
8800: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
8810: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
8820: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8830: 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74  OsFile *jfd, int
8840: 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e   useCksum){.  in
8850: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
8860: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
8870: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
8880: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
8890: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
88a0: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
88b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
88c0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
88d0: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
88e0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
88f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8900: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
8910: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
8920: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
8930: 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d  8 aData[SQLITE_M
8940: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20  AX_PAGE_SIZE];  
8950: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
8960: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
8970: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
8980: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
8990: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
89a0: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
89b0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
89c0: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
89d0: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
89e0: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
89f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
8a00: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
8a10: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
8a20: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 0a 0a  ger->stfd) );...
8a30: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
8a40: 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20  s(jfd, &pgno);. 
8a50: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8a60: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8a70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8a80: 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61  Read(jfd, &aData
8a90: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8aa0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
8ab0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8ac0: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
8ad0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
8ae0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
8af0: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
8b00: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
8b10: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
8b20: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
8b30: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
8b40: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
8b50: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
8b60: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
8b70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8b80: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
8b90: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
8ba0: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
8bb0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
8bc0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
8bd0: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
8be0: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
8bf0: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
8c00: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
8c10: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8c20: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
8c30: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
8c40: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
8c50: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8c60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8c70: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
8c80: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
8c90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8ca0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8cb0: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
8cc0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
8cd0: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b  d32bits(jfd, &ck
8ce0: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
8cf0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
8d00: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8d10: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69  lOff += 4;.    i
8d20: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
8d30: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
8d40: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
8d50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8d60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
8d70: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
8d80: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
8d90: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
8da0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
8db0: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
8dc0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
8dd0: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
8de0: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
8df0: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
8e00: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
8e10: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
8e20: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
8e30: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
8e40: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
8e50: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
8e60: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
8e70: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
8e80: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
8e90: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
8ea0: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
8eb0: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
8ec0: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
8ed0: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
8ee0: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
8ef0: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
8f00: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
8f10: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
8f20: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
8f30: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
8f40: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
8f50: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
8f60: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
8f70: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
8f80: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
8f90: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
8fa0: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
8fb0: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
8fc0: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
8fd0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
8fe0: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
8ff0: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
9000: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
9010: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
9020: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
9030: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
9040: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
9050: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
9060: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
9070: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
9080: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
9090: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
90a0: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
90b0: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
90c0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   in the main rol
90d0: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
90e0: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
90f0: 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41  if a full ROLLBA
9100: 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  CK occurs after 
9110: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  the statement.  
9120: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
9130: 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69  full ROLLBACK wi
9140: 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74  ll not restore t
9150: 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f  he page to its o
9160: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e  riginal.  ** con
9170: 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69  tent.  Two condi
9180: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65  tions must be me
9190: 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
91a0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
91b0: 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29  .  ** files. (1)
91c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
91d0: 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28  st be locked.  (
91e0: 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
91f0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
9200: 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  * page content i
9210: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
9220: 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
9230: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
9240: 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63   not in.  ** cac
9250: 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  he or else it is
9260: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
9270: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70  ync==0..  */.  p
9280: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
9290: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
92a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
92b0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
92c0: 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67  EXCLUSIVE || pPg
92d0: 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33 28  !=0 );.  TRACE3(
92e0: 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
92f0: 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
9300: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b  (pPager), pgno);
9310: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9320: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
9330: 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30  USIVE && (pPg==0
9340: 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   || pPg->needSyn
9350: 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20  c==0) ){.    rc 
9360: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
9370: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
9380: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
9390: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
93a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
93b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
93c0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
93d0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
93e0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
93f0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
9400: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
9410: 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
9420: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
9430: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
9440: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
9450: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
9460: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
9470: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
9480: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
9490: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
94a0: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
94b0: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
94c0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
94d0: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
94e0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
94f0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
9500: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
9510: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
9520: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
9530: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
9540: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
9550: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
9560: 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
9570: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
9580: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
9590: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d   /* assert( pPg-
95a0: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
95b0: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20  >pgno==1 ); */. 
95c0: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
95d0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
95e0: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
95f0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
9600: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
9610: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
9620: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
9630: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
9640: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
9650: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
9660: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
9670: 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
9680: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
9690: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
96a0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
96b0: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
96c0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
96d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f  );.#endif.    CO
96e0: 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
96f0: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
9700: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9710: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
9720: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
9730: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
9740: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9750: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
9760: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
9770: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
9780: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9790: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
97a0: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
97b0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
97c0: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
97d0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
97e0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
97f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
9800: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
9810: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  it is..**.** The
9820: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9830: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
9840: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63  e names of all c
9850: 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  hild journals..*
9860: 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d  * To tell if a m
9870: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61  aster journal ca
9880: 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68  n be deleted, ch
9890: 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74  eck to each of t
98a0: 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20  he.** children. 
98b0: 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   If all children
98c0: 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73 73   are either miss
98d0: 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65  ing or do not re
98e0: 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66  fer to.** a diff
98f0: 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75  erent master jou
9900: 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  rnal, then this 
9910: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
9920: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a  an be deleted..*
9930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
9940: 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e  er_delmaster(con
9950: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
9960: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
9970: 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  nt master_open =
9980: 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61   0;.  OsFile *ma
9990: 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  ster = 0;.  char
99a0: 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
99b0: 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
99c0: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
99d0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
99e0: 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
99f0: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
9a00: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
9a10: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
9a20: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
9a30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63  journal file exc
9a40: 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65  lusively in case
9a50: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
9a60: 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e  ess.  ** is runn
9a70: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
9a80: 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20   also. Not that 
9a90: 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63  it makes too muc
9aa0: 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  h difference..  
9ab0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
9ac0: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
9ad0: 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72  zMaster, &master
9ae0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9af0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
9b00: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d  lmaster_out;.  m
9b10: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
9b20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9b30: 46 69 6c 65 53 69 7a 65 28 6d 61 73 74 65 72 2c  FileSize(master,
9b40: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
9b50: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9b60: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
9b70: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
9b80: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
9b90: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
9ba0: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
9bb0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
9bc0: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f   = 0;..    /* Lo
9bd0: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
9be0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9bf0: 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
9c00: 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
9c10: 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  * sqliteMalloc()
9c20: 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
9c30: 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
9c40: 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  l. .    */.    z
9c50: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
9c60: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
9c70: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72  lloc(nMasterJour
9c80: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  nal);.    if( !z
9c90: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
9ca0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
9cb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
9cc0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
9cd0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
9ce0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
9cf0: 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  (master, zMaster
9d00: 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72  Journal, nMaster
9d10: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66  Journal);.    if
9d20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9d30: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
9d40: 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
9d50: 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
9d60: 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
9d70: 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
9d80: 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
9d90: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
9da0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
9db0: 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72  FileExists(zJour
9dc0: 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nal) ){.        
9dd0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
9de0: 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
9df0: 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
9e00: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
9e10: 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20          ** Open 
9e20: 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
9e30: 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
9e40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
9e50: 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   If.        ** s
9e60: 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
9e70: 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
9e80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9e90: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
9ea0: 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a         OsFile *j
9eb0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
9ec0: 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20      int c;..    
9ed0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9ee0: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a  OsOpenReadOnly(z
9ef0: 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61  Journal, &journa
9f00: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
9f10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
9f20: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
9f30: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9f40: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
9f50: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
9f60: 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c  rJournal(journal
9f70: 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a  , &zMasterPtr);.
9f80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
9f90: 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29  sClose(&journal)
9fa0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
9fb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9fc0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
9fd0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
9fe0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
9ff0: 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d  c = zMasterPtr!=
a000: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
a010: 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
a020: 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ==0;.        sql
a030: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50  iteFree(zMasterP
a040: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  tr);.        if(
a050: 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
a060: 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
a070: 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
a080: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
a090: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
a0a0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
a0b0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
a0c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a0d0: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
a0e0: 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c  (strlen(zJournal
a0f0: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
a100: 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65    .  sqlite3OsDe
a110: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a  lete(zMaster);..
a120: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
a130: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
a140: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
a150: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  eFree(zMasterJou
a160: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
a170: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
a180: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
a190: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
a1a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
a1b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76  }../*.** Make ev
a1c0: 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
a1d0: 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68  cache agree with
a1e0: 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
a1f0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
a200: 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65  s,.** reread the
a210: 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74   disk to reset t
a220: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
a230: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
a240: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a250: 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  led after a roll
a260: 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f  back in which so
a270: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20  me of the dirty 
a280: 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68  cache.** pages h
a290: 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ad never been wr
a2a0: 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73  itten out to dis
a2b0: 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  k.  We need to r
a2c0: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  oll back the.** 
a2d0: 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  cache content an
a2e0: 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61  d the easiest wa
a2f0: 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20  y to do that is 
a300: 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c  to reread the ol
a310: 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63  d content.** bac
a320: 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e  k from the disk.
a330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a340: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
a350: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
a360: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
a370: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a380: 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d  E_OK;.  for(pPg=
a390: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
a3a0: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
a3b0: 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20  tAll){.    char 
a3c0: 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f  zBuf[SQLITE_MAX_
a3d0: 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20  PAGE_SIZE];.    
a3e0: 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20  if( !pPg->dirty 
a3f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a400: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
a410: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
a420: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
a430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a440: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
a450: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a460: 65 2a 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e  e*(i64)(pPg->pgn
a470: 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  o-1));.      if(
a480: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
a490: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
a4a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
a4b0: 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
a4c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
a4d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a4e0: 54 52 41 43 45 33 28 22 52 45 46 45 54 43 48 20  TRACE3("REFETCH 
a4f0: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
a500: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
a510: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
a520: 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
a530: 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  ;.      CODEC1(p
a540: 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67  Pager, zBuf, pPg
a550: 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20  ->pgno, 2);.    
a560: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
a570: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50 61  set(zBuf, 0, pPa
a580: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a590: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
a5a0: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65  g->nRef==0 || me
a5b0: 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52  mcmp(zBuf, PGHDR
a5c0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
a5d0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
a5e0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
a5f0: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
a600: 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  Pg), zBuf, pPage
a610: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a620: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
a630: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
a640: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
a650: 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f  initer(PGHDR_TO_
a660: 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
a670: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a690: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
a6a0: 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
a6b0: 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72  ager), 0, pPager
a6c0: 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  ->nExtra);.     
a6d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
a6e0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
a6f0: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
a700: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
a710: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
a720: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
a730: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
a740: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
a750: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72  }.  pPager->pDir
a760: 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ty = 0;.  return
a770: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
a780: 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20  uncate the main 
a790: 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65  file of the give
a7a0: 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e  n pager to the n
a7b0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
a7c0: 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a  * indicated..*/.
a7d0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a7e0: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
a7f0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61  *pPager, int nPa
a800: 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
a810: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
a820: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
a830: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
a840: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
a850: 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
a860: 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
a870: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  age);.}../*.** P
a880: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
a890: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
a8a0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
a8b0: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
a8c0: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
a8d0: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
a8e0: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
a8f0: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
a900: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
a910: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
a920: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
a930: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
a940: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
a950: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
a960: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
a970: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
a980: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
a990: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
a9a0: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
a9b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
a9c0: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
a9d0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
a9e0: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
a9f0: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
aa00: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
aa10: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
aa20: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
aa30: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
aa40: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
aa50: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
aa60: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
aa70: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
aa80: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
aa90: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
aaa0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
aab0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
aac0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
aad0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
aae0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
aaf0: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
ab00: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
ab10: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
ab20: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
ab30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
ab40: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
ab50: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
ab60: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
ab70: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
ab80: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
ab90: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36  journal.).**  (6
aba0: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
abb0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
abc0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
abd0: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
abe0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
abf0: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
ac00: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
ac10: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
ac20: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
ac30: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
ac40: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
ac50: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
ac60: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
ac70: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
ac80: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
ac90: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
aca0: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
acb0: 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  7)  Zero or more
acc0: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
acd0: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
ace0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
acf0: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
ad00: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
ad10: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ad20: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
ad30: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
ad40: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
ad50: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
ad60: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
ad70: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
ad80: 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65   the first 6 ite
ad90: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
ada0: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
adb0: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
adc0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68  tance of the 7th
add0: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
ade0: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
adf0: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
ae00: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
ae10: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
ae20: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
ae30: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
ae40: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
ae50: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
ae60: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
ae70: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
ae80: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
ae90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
aea0: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
aeb0: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
aec0: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
aed0: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
aee0: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
aef0: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
af00: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
af10: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
af20: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
af30: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
af40: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
af50: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
af60: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
af70: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
af80: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
af90: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
afa0: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
afb0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
afc0: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
afd0: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
afe0: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
aff0: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
b000: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
b010: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
b020: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
b030: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
b040: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
b050: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
b060: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
b070: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
b080: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
b090: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
b0a0: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
b0b0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
b0c0: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
b0d0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
b0e0: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
b0f0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
b100: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
b110: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
b120: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
b130: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
b140: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
b150: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
b160: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
b170: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
b180: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
b190: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
b1a0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
b1b0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
b1c0: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
b1d0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
b1e0: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
b1f0: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
b200: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
b210: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
b220: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
b230: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
b240: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
b250: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
b260: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
b270: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
b280: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
b290: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
b2a0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
b2b0: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
b2c0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
b2d0: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
b2e0: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
b2f0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
b300: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
b310: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
b320: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
b330: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
b340: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
b350: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
b360: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b370: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
b380: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
b390: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b3a0: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
b3b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
b3c0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b3d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
b3e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
b3f0: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
b400: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b410: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
b420: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
b430: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
b440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b450: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
b460: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  ubroutine */.  c
b470: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
b480: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
b490: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
b4a0: 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
b4b0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
b4c0: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
b4d0: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
b4e0: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
b4f0: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
b500: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
b510: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
b520: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b530: 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
b540: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
b550: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
b560: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
b570: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b580: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
b590: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
b5a0: 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
b5b0: 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
b5c0: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
b5d0: 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
b5e0: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
b5f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
b600: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
b610: 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
b620: 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
b630: 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
b640: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
b650: 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
b660: 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
b670: 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
b680: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d   */.  rc = readM
b690: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
b6a0: 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74  ger->jfd, &zMast
b6b0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
b6c0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
b6d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b6e0: 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65  TE_OK || (zMaste
b6f0: 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46  r && !sqlite3OsF
b700: 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65  ileExists(zMaste
b710: 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r)) ){.    sqlit
b720: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
b730: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
b740: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
b750: 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20  ITE_DONE ) rc = 
b760: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
b770: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
b780: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
b790: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
b7a0: 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  d, 0);.  pPager-
b7b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
b7c0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
b7d0: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
b7e0: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
b7f0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
b800: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
b810: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
b820: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
b830: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
b840: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
b850: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
b860: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
b870: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
b880: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
b890: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
b8a0: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
b8b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
b8c0: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
b8d0: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
b8e0: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
b8f0: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
b900: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
b910: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
b920: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
b930: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
b940: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
b950: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
b960: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
b970: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
b980: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
b990: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
b9a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
b9b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b9c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
b9d0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b9e0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
b9f0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
ba00: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
ba10: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
ba20: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
ba30: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
ba40: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
ba50: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
ba60: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
ba70: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
ba80: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
ba90: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
baa0: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
bab0: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
bac0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
bad0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
bae0: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
baf0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
bb00: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
bb10: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
bb20: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
bb30: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
bb40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
bb50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
bb60: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
bb70: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
bb80: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
bb90: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
bba0: 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
bbb0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
bbc0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
bbd0: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
bbe0: 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
bbf0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
bc00: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
bc10: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
bc20: 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72   back to it's or
bc30: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
bc40: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
bc50: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
bc60: 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 0a 20  _EXCLUSIVE && . 
bc70: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
bc80: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
bc90: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
bca0: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
bcb0: 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  t( pPager->origD
bcc0: 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67  bSize==0 || pPag
bcd0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
bce0: 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63  mxPg );.      rc
bcf0: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
bd00: 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
bd10: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
bd20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bd30: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
bd40: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
bd50: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
bd60: 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
bd70: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
bd80: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
bd90: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
bda0: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
bdb0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bdc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
bdd0: 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b  (i=0; i<nRec; i+
bde0: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
bdf0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
be00: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
be10: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
be20: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
be30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
be40: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
be50: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
be60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
be70: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OK;.          pP
be80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
be90: 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
bea0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
beb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bec0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
bed0: 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
bee0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
bef0: 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
bf00: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
bf10: 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
bf20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bf30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
bf40: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
bf50: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
bf60: 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a   if( zMaster ){.
bf70: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
bf80: 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
bf90: 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
bfa0: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
bfb0: 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73  n true,.    ** s
bfc0: 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
bfd0: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
bfe0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
bff0: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
c000: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c010: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c020: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d  ger_delmaster(zM
c030: 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  aster);.    }.  
c040: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
c050: 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster);.  }..  /*
c060: 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
c070: 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
c080: 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
c090: 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
c0a0: 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
c0b0: 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
c0c0: 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
c0d0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 50 41 47   a different PAG
c0e0: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  ER_SECTOR_SIZE. 
c0f0: 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
c100: 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
c110: 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
c120: 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
c130: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
c140: 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43  Size = PAGER_SEC
c150: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75  TOR_SIZE;.  retu
c160: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c170: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61  Playback the sta
c180: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
c190: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
c1a0: 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
c1b0: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
c1c0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
c1d0: 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
c1e0: 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
c1f0: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
c200: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
c210: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
c220: 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
c230: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
c240: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
c250: 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
c260: 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74  r->stmtSize, not
c270: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
c280: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
c290: 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20  itself..**.**   
c2a0: 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f   (2)  In additio
c2b0: 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  n to playing bac
c2c0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
c2d0: 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a  journal, also.**
c2e0: 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63           playbac
c2f0: 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  k all pages of t
c300: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
c310: 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67  ournal beginning
c320: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f  .**         at o
c330: 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74  ffset pPager->st
c340: 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  mtJSize..*/.stat
c350: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d  ic int pager_stm
c360: 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  t_playback(Pager
c370: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
c380: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
c390: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
c3a0: 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
c3b0: 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66  l */.  i64 hdrOf
c3c0: 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  f;.  int nRec;  
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c3e0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
c3f0: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c420: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
c430: 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
c440: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64  ournalOff;.#ifnd
c450: 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20  ef NDEBUG .  {. 
c460: 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20     i64 os_szJ;. 
c470: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c480: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
c490: 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b  ->jfd, &os_szJ);
c4a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c4b0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
c4c0: 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
c4d0: 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20  szJ==os_szJ );. 
c4e0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
c4f0: 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65  Set hdrOff to be
c500: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c510: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
c520: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 0a   header written.
c530: 20 20 2a 2a 20 74 68 69 73 20 73 74 61 74 65 6d    ** this statem
c540: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
c550: 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74   or the end of t
c560: 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f  he file if no jo
c570: 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  urnal.  ** heade
c580: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20  r was written.. 
c590: 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70   */.  hdrOff = p
c5a0: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
c5b0: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f;.  assert( pPa
c5c0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c  ger->fullSync ||
c5d0: 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66   !hdrOff );.  if
c5e0: 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20  ( !hdrOff ){.   
c5f0: 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20   hdrOff = szJ;. 
c600: 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63   }.  .  /* Trunc
c610: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
c620: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
c630: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
c640: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
c650: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
c660: 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20  USIVE ){.    rc 
c670: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
c680: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
c690: 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 7d 0a  >stmtSize);.  }.
c6a0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
c6b0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
c6c0: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ize;..  /* Figur
c6d0: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
c6e0: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
c6f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
c700: 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
c710: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
c720: 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d  InUse && pPager-
c730: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
c740: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
c750: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
c760: 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65  ;.  nRec = pPage
c770: 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a  r->stmtNRec;.  .
c780: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
c790: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
c7a0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
c7b0: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
c7c0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
c7d0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
c7e0: 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
c7f0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69  ment journal omi
c800: 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f  ts checksums fro
c810: 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f  m.  ** each reco
c820: 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66  rd since power-f
c830: 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20  ailure recovery 
c840: 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  is not important
c850: 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20   to statement.  
c860: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ** journals..  *
c870: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
c880: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
c890: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
c8a0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
c8b0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
c8c0: 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  tfd, 0);.    ass
c8d0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
c8e0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
c8f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
c900: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
c910: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
c920: 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20  * Now roll some 
c930: 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  pages back from 
c940: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
c950: 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73  journal. Pager.s
c960: 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61  tmtJSize.  ** wa
c970: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
c980: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
c990: 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  hen this stateme
c9a0: 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  nt was started, 
c9b0: 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69  so.  ** everythi
c9c0: 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65  ng after that ne
c9d0: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
c9e0: 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e   back, either in
c9f0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
ca00: 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79  base, the memory
ca10: 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e   cache, or both.
ca20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74  .  **.  ** If it
ca30: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
ca40: 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72  en Pager.stmtHdr
ca50: 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65  Off is the offse
ca60: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
ca70: 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
ca80: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
ca90: 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74  written during t
caa0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
cab0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
cac0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cad0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
cae0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  , pPager->stmtJS
caf0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
cb00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cb10: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
cb20: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
cb30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cb40: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
cb50: 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
cb60: 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
cb70: 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
cb80: 20 20 61 73 73 65 72 74 28 20 4a 4f 55 52 4e 41    assert( JOURNA
cb90: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
cba0: 3c 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  <(pPager->pageSi
cbb0: 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c 65  ze+8) );.  while
cbc0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cbd0: 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d  lOff <= (hdrOff-
cbe0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
cbf0: 65 2b 38 29 29 20 29 7b 0a 20 20 20 20 72 63 20  e+8)) ){.    rc 
cc00: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
cc10: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
cc20: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31  , pPager->jfd, 1
cc30: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
cc40: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
cc50: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
cc60: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
cc70: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
cc80: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
cc90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cca0: 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
ccb0: 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20  u32 nJRec;      
ccc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ccd0: 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
cce0: 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
ccf0: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
cd00: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
cd10: 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
cd20: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
cd30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cd40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
cd50: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
cd60: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
cd70: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
cd80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a      }.    if( nJ
cd90: 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rec==0 ){.      
cda0: 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
cdb0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cdc0: 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61  f) / (pPager->pa
cdd0: 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d  geSize+8);.    }
cde0: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63  .    for(i=nJRec
cdf0: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
ce00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
ce10: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
ce20: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
ce30: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
ce40: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
ce50: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  fd, 1);.      as
ce60: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
ce70: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69  _DONE );.      i
ce80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ce90: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
cea0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
ceb0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
cec0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
ced0: 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c  ;.  .end_stmt_pl
cee0: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
cef0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20  ==SQLITE_OK) {. 
cf00: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cf10: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
cf20: 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64   /* pager_reload
cf30: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20  _cache(pPager); 
cf40: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
cf50: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
cf60: 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
cf70: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
cf80: 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
cf90: 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
cfa0: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
cfb0: 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50  _set_cachesize(P
cfc0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
cfd0: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
cfe0: 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
cff0: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
d000: 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c   = mxPage;.  }el
d010: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
d020: 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d  mxPage = 10;.  }
d030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
d040: 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
d050: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
d060: 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
d070: 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
d080: 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
d090: 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
d0a0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
d0b0: 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
d0c0: 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
d0d0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
d0e0: 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
d0f0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
d100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
d110: 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
d120: 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
d130: 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
d140: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
d150: 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
d160: 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
d170: 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
d180: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
d190: 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
d1a0: 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
d1b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
d1c0: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
d1d0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
d1e0: 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
d1f0: 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
d210: 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
d220: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
d230: 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
d240: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d250: 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
d260: 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
d270: 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
d280: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
d290: 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
d2a0: 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
d2b0: 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
d2c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
d2e0: 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
d2f0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
d300: 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
d310: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
d320: 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
d330: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
d340: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d350: 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
d360: 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
d370: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
d380: 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
d390: 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
d3a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
d3b0: 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
d3c0: 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
d3d0: 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
d3e0: 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
d3f0: 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
d400: 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
d410: 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
d420: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
d430: 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
d440: 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
d450: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d460: 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
d470: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
d480: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
d490: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
d4a0: 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
d4b0: 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
d4c0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
d4d0: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
d4e0: 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
d4f0: 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
d500: 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
d510: 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
d520: 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
d530: 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
d540: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
d550: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
d560: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
d570: 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28  et_safety_level(
d580: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
d590: 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
d5a0: 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61  ll_fsync){.  pPa
d5b0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c  ger->noSync =  l
d5c0: 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65  evel==1 || pPage
d5d0: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
d5e0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
d5f0: 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70  = level==3 && !p
d600: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
d610: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  .  pPager->full_
d620: 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79  fsync = full_fsy
d630: 6e 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  nc;.  if( pPager
d640: 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
d650: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
d660: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
d670: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
d680: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
d690: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
d6a0: 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
d6b0: 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
d6c0: 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
d6d0: 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
d6e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
d6f0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
d700: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
d710: 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  nly.  .*/.int sq
d720: 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
d730: 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  ount = 0;../*.**
d740: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
d750: 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  y file.  Write t
d760: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
d770: 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a  ile into zFile.*
d780: 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20 62 65  * (zFile must be
d790: 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45   at least SQLITE
d7a0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62  _TEMPNAME_SIZE b
d7b0: 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69  ytes long.)  Wri
d7c0: 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  te.** the file d
d7d0: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
d7e0: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
d7f0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
d800: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
d810: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
d820: 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54  we fail..**.** T
d830: 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
d840: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
d850: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
d860: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  le when it is.**
d870: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
d880: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61  ic int sqlite3pa
d890: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61  ger_opentemp(cha
d8a0: 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65  r *zFile, OsFile
d8b0: 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63   **pFd){.  int c
d8c0: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
d8d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
d8e0: 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
d8f0: 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
d900: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
d910: 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  only */.  do{.  
d920: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
d930: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
d940: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
d950: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
d960: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
d970: 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d 77 68  , pFd, 1);.  }wh
d980: 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63  ile( cnt>0 && rc
d990: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
d9a0: 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
d9b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
d9c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
d9d0: 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65  a new page cache
d9e0: 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
d9f0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63  er to the page c
da00: 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72  ache in *ppPager
da10: 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f  ..** The file to
da20: 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20   be cached need 
da30: 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20  not exist.  The 
da40: 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b  file is not lock
da50: 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20  ed until.** the 
da60: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
da70: 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
da80: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
da90: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
daa0: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
dab0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
dac0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
dad0: 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
dae0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
daf0: 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
db00: 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
db10: 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
db20: 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
db30: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
db40: 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
db50: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
db60: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
db70: 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
db80: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
db90: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
dba0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
dbb0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
dbc0: 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
dbd0: 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
dbe0: 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
dbf0: 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
dc00: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
dc10: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
dc20: 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
dc30: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a  ite3pager_open(.
dc40: 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
dc50: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
dc60: 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
dc70: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
dc80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
dc90: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
dca0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
dcb0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
dcc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
dcd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
dce0: 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
dcf0: 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
dd00: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
dd10: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
dd30: 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
dd40: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  his file */.){. 
dd50: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
dd60: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   0;.  char *zFul
dd70: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20  lPathname = 0;. 
dd80: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f   int nameLen;  /
dd90: 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72  * Compiler is wr
dda0: 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ong. This is alw
ddb0: 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
ddc0: 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20  before use */.  
ddd0: 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20 69 6e  OsFile *fd;.  in
dde0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ddf0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
de00: 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
de10: 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a   int memDb = 0;.
de20: 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
de30: 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   0;.  int useJou
de40: 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
de50: 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
de60: 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f  AL)==0;.  int no
de70: 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
de80: 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
de90: 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61  DLOCK)!=0;.  cha
dea0: 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
deb0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23  EMPNAME_SIZE];.#
dec0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ded0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
dee0: 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c  EMENT.  /* A mal
def0: 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  loc() cannot fai
df00: 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65  l in sqlite3Thre
df10: 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20  adData() as one 
df20: 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f  or more calls to
df30: 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20   .  ** malloc() 
df40: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
df50: 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74  y been made by t
df60: 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72  his thread befor
df70: 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74  e it gets.  ** t
df80: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68  o this point. Th
df90: 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72  is means the Thr
dfa0: 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76  eadData must hav
dfb0: 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  e been allocated
dfc0: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f   already.  ** so
dfd0: 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61   that ThreadData
dfe0: 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73  .nAlloc can be s
dff0: 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62 65 20  et. It would be 
e000: 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74 0a 20  nice to assert. 
e010: 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61 64 44   ** that ThreadD
e020: 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f  ata.nAlloc is no
e030: 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61 73  n-zero, but alas
e040: 20 74 68 69 73 20 62 72 65 61 6b 73 20 74 65 73   this breaks tes
e050: 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20 77 72  t cases .  ** wr
e060: 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20  itten to invoke 
e070: 74 68 65 20 70 61 67 65 72 20 64 69 72 65 63 74  the pager direct
e080: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61  ly..  */.  Threa
e090: 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
e0a0: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
e0b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73  );.  assert( pTs
e0c0: 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  d );.#endif..  /
e0d0: 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61  * If malloc() ha
e0e0: 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64  s already failed
e0f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e100: 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65 76 65  OMEM. Before eve
e110: 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 66  n.  ** testing f
e120: 6f 72 20 74 68 69 73 2c 20 73 65 74 20 2a 70 70  or this, set *pp
e130: 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20 73 6f  Pager to NULL so
e140: 20 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e 6f 77   the caller know
e150: 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  s the pager.  **
e160: 20 73 74 72 75 63 74 75 72 65 20 77 61 73 20 6e   structure was n
e170: 65 76 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20  ever allocated. 
e180: 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  .  */.  *ppPager
e190: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
e1a0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
e1b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e1c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e1d0: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66 64 2c 20  }.  memset(&fd, 
e1e0: 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a  0, sizeof(fd));.
e1f0: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
e200: 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65  ager file and se
e210: 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t zFullPathname 
e220: 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c  to point at mall
e230: 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d  oc()ed .  ** mem
e240: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
e250: 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65  he complete file
e260: 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75  name (i.e. inclu
e270: 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  ding the directo
e280: 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ry)..  */.  if( 
e290: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
e2a0: 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66  lename[0] ){.#if
e2b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e2c0: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
e2d0: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
e2e0: 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
e2f0: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
e300: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c   = 1;.      zFul
e310: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
e320: 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20  teStrDup("");.  
e330: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
e340: 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c     {.      zFull
e350: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
e360: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e370: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
e380: 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68     if( zFullPath
e390: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
e3a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
e3b0: 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c  enReadWrite(zFul
e3c0: 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20  lPathname, &fd, 
e3d0: 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20  &readOnly);.    
e3e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
e3f0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
e400: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
e410: 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20  p(zTemp, &fd);. 
e420: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
e430: 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50  Temp;.    zFullP
e440: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e450: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
e460: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
e470: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e480: 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46  K ){.      tempF
e490: 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ile = 1;.    }. 
e4a0: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
e4b0: 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
e4c0: 63 74 75 72 65 2e 20 41 73 20 70 61 72 74 20 6f  cture. As part o
e4d0: 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63  f the same alloc
e4e0: 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a  ation, allocate.
e4f0: 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74    ** space for t
e500: 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f 66  he full paths of
e510: 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65 63   the file, direc
e520: 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  tory and journal
e530: 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46   .  ** (Pager.zF
e540: 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a  ilename, Pager.z
e550: 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50 61  Directory and Pa
e560: 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20  ger.zJournal).. 
e570: 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50   */.  if( zFullP
e580: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e  athname ){.    n
e590: 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
e5a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e5b0: 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
e5c0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
e5d0: 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d  f(*pPager) + nam
e5e0: 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20  eLen*3 + 30 );. 
e5f0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
e600: 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
e610: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c  either of the bl
e620: 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65  ocks above, free
e630: 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20 20 2a   the memory .  *
e640: 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
e650: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 66  zFullPathname, f
e660: 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ree the Pager st
e670: 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
e680: 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 6c 65  e the .  ** file
e690: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
e6a0: 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  r is not allocat
e6b0: 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ed there is no n
e6c0: 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a  eed to set .  **
e6d0: 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61   any Pager.errMa
e6e0: 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  sk variables..  
e6f0: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  */.  if( !pPager
e700: 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61   || !zFullPathna
e710: 6d 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  me || rc!=SQLITE
e720: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
e730: 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
e740: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
e750: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e760: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
e770: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
e780: 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
e790: 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
e7a0: 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43  rc);.  }..  TRAC
e7b0: 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E3("OPEN %d %s\n
e7c0: 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
e7d0: 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  fd), zFullPathna
e7e0: 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  me);.  pPager->z
e7f0: 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
e800: 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20  *)&pPager[1];.  
e810: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e820: 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46  ry = &pPager->zF
e830: 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b  ilename[nameLen+
e840: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  1];.  pPager->zJ
e850: 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
e860: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d  ->zDirectory[nam
e870: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70  eLen+1];.  strcp
e880: 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
e890: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
e8a0: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50  me);.  strcpy(pP
e8b0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
e8c0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
e8d0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c  ;..  for(i=nameL
e8e0: 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65  en; i>0 && pPage
e8f0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
e900: 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
e910: 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
e920: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
e930: 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70  -1] = 0;.  strcp
e940: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
e950: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
e960: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
e970: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e980: 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65  .  strcpy(&pPage
e990: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
e9a0: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
e9b0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
e9c0: 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61 67 65  = fd;.  /* pPage
e9d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
e9e0: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
e9f0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
ea00: 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
ea10: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  Db;.  pPager->no
ea20: 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61  Readlock = noRea
ea30: 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
ea40: 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
ea50: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
ea60: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
ea70: 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
ea80: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
ea90: 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
eaa0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d  er->dbSize = mem
eab0: 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Db-1;.  pPager->
eac0: 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54  pageSize = SQLIT
ead0: 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
eae0: 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  IZE;.  /* pPager
eaf0: 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
eb00: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
eb10: 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
eb20: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
eb30: 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Page = 0; */.  /
eb40: 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61  * pPager->nMaxPa
eb50: 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
eb60: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
eb70: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  0;.  assert( PAG
eb80: 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a  ER_UNLOCK==0 );.
eb90: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
eba0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
ebb0: 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  K; */.  /* pPage
ebc0: 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
ebd0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
ebe0: 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65  pFile = tempFile
ebf0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
ec00: 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61  b = memDb;.  pPa
ec10: 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
ec20: 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
ec30: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
ec40: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
ec50: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
ec60: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
ec70: 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
ec80: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
ec90: 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
eca0: 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67  ?0:1);.  /* pPag
ecb0: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
ecc0: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
ecd0: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
ece0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
ecf0: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
ed00: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
ed10: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
ed20: 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50  NT(nExtra);.  pP
ed30: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
ed40: 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f   = PAGER_SECTOR_
ed50: 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65  SIZE;.  /* pPage
ed60: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
ed70: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d  = 0; */.  /* mem
ed80: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
ed90: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
eda0: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
edb0: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
edc0: 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c  ager;.#ifdef SQL
edd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
ede0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70  Y_MANAGEMENT.  p
edf0: 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Pager->pNext = p
ee00: 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70  Tsd->pPager;.  p
ee10: 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  Tsd->pPager = pP
ee20: 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ager;.#endif.  r
ee30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ee40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ee50: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
ee60: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
ee70: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
ee80: 74 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50 61  t_busyhandler(Pa
ee90: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73  ger *pPager, Bus
eea0: 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
eeb0: 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65  andler){.  pPage
eec0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
eed0: 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = pBusyHandler;.
eee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
eef0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
ef00: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
ef10: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
ef20: 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
ef30: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
ef40: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
ef50: 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
ef60: 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
ef70: 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
ef80: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
ef90: 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
efa0: 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
efb0: 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
efc0: 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
efd0: 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
efe0: 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
eff0: 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
f000: 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
f010: 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
f020: 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
f030: 65 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67  ed by sqlite3pag
f040: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  er_unref()..*/.v
f050: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
f060: 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28  _set_destructor(
f070: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
f080: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69  oid (*xDesc)(voi
f090: 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  d*,int)){.  pPag
f0a0: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
f0b0: 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
f0c0: 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
f0d0: 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
f0e0: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
f0f0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74  NULL, the reinit
f100: 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61  ializer.** is ca
f110: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  lled when the co
f120: 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20  ntent of a page 
f130: 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74  in cache is rest
f140: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
f150: 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73  inal.** value as
f160: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72   a result of a r
f170: 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61  ollback.  The ca
f180: 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67  llback gives hig
f190: 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a  her-level code.*
f1a0: 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  * an opportunity
f1b0: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
f1c0: 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
f1d0: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
f1e0: 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65  restored.** page
f1f0: 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73   data..*/.void s
f200: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
f210: 72 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a  reiniter(Pager *
f220: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
f230: 52 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e  Reinit)(void*,in
f240: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
f250: 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
f260: 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  it;.}../*.** Set
f270: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20   the page size. 
f280: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20   Return the new 
f290: 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75  size.  If the su
f2a0: 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a  ggest new page.*
f2b0: 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72  * size is inappr
f2c0: 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e  opriate, then an
f2d0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
f2e0: 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74  e size is select
f2f0: 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ed.** and return
f300: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
f310: 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e3pager_set_page
f320: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
f330: 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  er, int pageSize
f340: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ){.  assert( pag
f350: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
f360: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
f370: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
f380: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
f390: 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
f3a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
f3b0: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72  ageSize;.  }.  r
f3c0: 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61  eturn pPager->pa
f3d0: 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
f3e0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
f3f0: 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
f400: 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
f410: 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
f420: 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
f430: 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
f440: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
f450: 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
f460: 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
f470: 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
f480: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
f490: 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
f4a0: 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
f4b0: 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
f4c0: 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
f4d0: 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
f4e0: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
f4f0: 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
f500: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
f510: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
f520: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
f530: 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
f540: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f550: 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
f560: 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
f570: 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f  clear_simulated_
f580: 69 6f 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73 71  io_error(){.  sq
f590: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
f5a0: 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64  it = 0;.}.void d
f5b0: 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
f5c0: 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
f5d0: 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
f5e0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
f5f0: 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
f600: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
f610: 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
f620: 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
f630: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
f640: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
f650: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
f660: 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
f670: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6c 65  lse.# define cle
f680: 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  ar_simulated_io_
f690: 65 72 72 6f 72 28 29 0a 23 20 64 65 66 69 6e 65  error().# define
f6a0: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
f6b0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
f6c0: 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
f6d0: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
f6e0: 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
f6f0: 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
f700: 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
f710: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
f720: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
f730: 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
f740: 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
f750: 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68  *.** No error ch
f760: 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20  ecking is done. 
f770: 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72  The rational for
f780: 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
f790: 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
f7a0: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76  may be called ev
f7b0: 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  en if the file d
f7c0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
f7d0: 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65   contain a heade
f7e0: 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20  r. In .** these 
f7f0: 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52  cases sqlite3OsR
f800: 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72  ead() will retur
f810: 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77  n an error, to w
f820: 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74  hich the correct
f830: 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73   .** response is
f840: 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d   to zero the mem
f850: 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64  ory at pDest and
f860: 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65   continue.  A re
f870: 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  al IO error .** 
f880: 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20  will presumably 
f890: 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63  recur and be pic
f8a0: 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f  ked up later (To
f8b0: 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  do: Think about 
f8c0: 74 68 69 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  this)..*/.void s
f8d0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61 64  qlite3pager_read
f8e0: 5f 66 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  _fileheader(Page
f8f0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
f900: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
f910: 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65  *pDest){.  memse
f920: 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
f930: 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29    if( MEMDB==0 )
f940: 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  {.    disable_si
f950: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f960: 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
f970: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
f980: 64 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  d, 0);.    sqlit
f990: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
f9a0: 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a  >fd, pDest, N);.
f9b0: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
f9c0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
f9d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
f9e0: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
f9f0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
fa00: 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
fa10: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
fa20: 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a  .** pPager. .**.
fa30: 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e  ** If the PENDIN
fa40: 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74  G_BYTE lies on t
fa50: 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79  he page directly
fa60: 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
fa70: 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74  f the.** file, t
fa80: 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69  hen consider thi
fa90: 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74  s page part of t
faa0: 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72  he file too. For
fab0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
fac0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20  PENDING_BYTE is 
fad0: 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66  byte 4096 (the f
fae0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67  irst byte of pag
faf0: 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a  e 5) and the siz
fb00: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
fb10: 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20   is 4096 bytes, 
fb20: 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  5 is returned in
fb30: 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69  stead of 4..*/.i
fb40: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
fb50: 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  pagecount(Pager 
fb60: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
fb70: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
fb80: 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
fb90: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
fba0: 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61  0 ){.    n = pPa
fbb0: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
fbc0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 28 20   else {.    if( 
fbd0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
fbe0: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
fbf0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
fc00: 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
fc10: 72 28 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  r(pPager, SQLITE
fc20: 5f 49 4f 45 52 52 29 3b 0a 20 20 20 20 20 20 72  _IOERR);.      r
fc30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
fc40: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
fc50: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
fc60: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b   ){.      n = 1;
fc70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fc80: 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70    n /= pPager->p
fc90: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  ageSize;.    }. 
fca0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
fcb0: 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
fcc0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
fcd0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a  er->dbSize = n;.
fce0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
fcf0: 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  n==(PENDING_BYTE
fd00: 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
fd10: 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20  e) ){.    n++;. 
fd20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
fd30: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
fd40: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
fd50: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67  /*.** Clear a Pg
fd60: 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f  History block.*/
fd70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
fd80: 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74  arHistory(PgHist
fd90: 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73  ory *pHist){.  s
fda0: 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
fdb0: 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74  >pOrig);.  sqlit
fdc0: 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
fdd0: 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f  mt);.  pHist->pO
fde0: 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74  rig = 0;.  pHist
fdf0: 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23  ->pStmt = 0;.}.#
fe00: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65  else.#define cle
fe10: 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e  arHistory(x).#en
fe20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  dif../*.** Forwa
fe30: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
fe40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
fe50: 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29  cJournal(Pager*)
fe60: 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  ;../*.** Unlink 
fe70: 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
fe80: 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73  sh chain. Also s
fe90: 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  et the page numb
fea0: 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63  er to 0 to indic
feb0: 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ate.** that the 
fec0: 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74  page is not part
fed0: 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61   of any hash cha
fee0: 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  in. This is requ
fef0: 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65  ired because the
ff00: 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
ff10: 5f 6d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74  _movepage() rout
ff20: 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20  ine can leave a 
ff30: 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
ff40: 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46  pNextFree/pPrevF
ff50: 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  ree list that is
ff60: 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61   not a part of a
ff70: 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a  ny hash-chain..*
ff80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
ff90: 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61  linkHashChain(Pa
ffa0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
ffb0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
ffc0: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
ffd0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
ffe0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 7a 65 72  ge number is zer
fff0: 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  o, then this pag
10000 65 20 69 73 20 6e 6f 74 20 69 6e 20 61 6e 79 20  e is not in any 
10010 68 61 73 68 20 63 68 61 69 6e 2e 20 2a 2f 0a 20  hash chain. */. 
10020 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
10030 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
10040 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
10050 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
10060 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
10070 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  vHash;.  }.  if(
10080 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
10090 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
100a0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67  Pager->aHash[pPg
100b0 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
100c0 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67  ->nHash-1)]!=pPg
100d0 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
100e0 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73  evHash->pNextHas
100f0 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  h = pPg->pNextHa
10100 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sh;.  }else{.   
10110 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67   int h = pPg->pg
10120 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
10130 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65  ash-1);.    asse
10140 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
10150 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20  h[h]==pPg );.   
10160 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
10170 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
10180 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  sh;.  }.  if( ME
10190 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  MDB ){.    clear
101a0 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
101b0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
101c0 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  r));.  }.  pPg->
101d0 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
101e0 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
101f0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
10200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
10210 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
10220 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
10230 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
10240 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
10250 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
10260 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
10270 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
10280 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
10290 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
102a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
102b0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
102c0 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72  /* Keep the pFir
102d0 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72  stSynced pointer
102e0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
102f0 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69   first synchroni
10300 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  zed page */.  if
10310 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
10320 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
10330 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
10340 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10350 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
10360 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
10370 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
10380 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
10390 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
103a0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
103b0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
103c0 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  t */.  if( pPg->
103d0 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
103e0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
103f0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
10400 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
10410 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
10420 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
10430 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
10440 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
10450 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10460 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
10470 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  xtFree ){.    pP
10480 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
10490 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
104a0 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73  PrevFree;.  }els
104b0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
104c0 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
104d0 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
104e0 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
104f0 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70  revFree;.  }.  p
10500 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
10510 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
10520 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b   0;..  /* Unlink
10530 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
10540 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  ash table */.  u
10550 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
10560 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a  Pager, pPg);.}..
10570 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10580 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
10590 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
105a0 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
105b0 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
105c0 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65   database.  Dele
105d0 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20  te.** all pages 
105e0 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61  whose pgno is la
105f0 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
10600 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
10610 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
10620 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
10630 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
10640 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
10650 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74   zeroed..*/.stat
10660 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72  ic void memoryTr
10670 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
10680 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
10690 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
106a0 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
106b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
106c0 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
106d0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
106e0 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
106f0 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
10700 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
10710 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
10720 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
10730 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
10740 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
10750 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
10760 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
10770 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
10780 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
10790 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
107a0 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
107b0 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
107c0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
107d0 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
107e0 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  g);.      makeCl
107f0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ean(pPg);.      
10800 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
10810 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
10820 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
10830 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
10840 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  e memoryTruncate
10850 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (p).#endif../*.*
10860 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
10870 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
10880 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
10890 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
108a0 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
108b0 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
108c0 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
108d0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
108e0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
108f0 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
10900 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
10910 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
10920 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
10930 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
10940 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
10950 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
10960 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
10970 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
10980 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
10990 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
109a0 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
109b0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
109c0 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
109d0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
109e0 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
109f0 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
10a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
10a10 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
10a20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
10a30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
10a40 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
10a50 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
10a60 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
10a70 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
10a80 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
10a90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
10aa0 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
10ab0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
10ac0 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e  USY && sqlite3In
10ad0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
10ae0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
10af0 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  dler) );.    if(
10b00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10b10 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
10b20 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
10b30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10b40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10b50 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66  * Truncate the f
10b60 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ile to the numbe
10b70 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69  r of pages speci
10b80 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  fied..*/.int sql
10b90 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
10ba0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
10bb0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
10bc0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
10bd0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
10be0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
10bf0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
10c00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
10c10 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
10c20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10c30 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
10c40 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
10c50 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
10c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10c70 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
10c80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
10c90 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
10ca0 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
10cb0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
10cc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10cd0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63  .  }.  rc = sync
10ce0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
10cf0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10d00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
10d10 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
10d20 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   Get an exclusiv
10d30 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
10d40 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72  tabase before tr
10d50 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72  uncating. */.  r
10d60 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
10d70 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
10d80 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
10d90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10da0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
10db0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  n rc;.  }..  rc 
10dc0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
10dd0 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  (pPager, nPage);
10de0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10df0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
10e00 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
10e10 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ge;.  }.  return
10e20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
10e30 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
10e40 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
10e50 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
10e60 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
10e70 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
10e80 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
10e90 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
10ea0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
10eb0 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
10ec0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
10ed0 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
10ee0 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
10ef0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
10f00 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
10f10 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
10f20 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
10f30 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
10f40 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
10f50 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
10f60 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
10f70 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
10f80 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
10f90 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
10fa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
10fb0 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
10fc0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
10fd0 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
10fe0 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
10ff0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
11000 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
11010 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
11020 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
11030 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
11040 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
11050 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
11060 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
11070 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
11080 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11090 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65  pager_close(Page
110a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
110b0 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
110c0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
110d0 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
110e0 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20  NAGEMENT.  /* A 
110f0 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20  malloc() cannot 
11100 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54  fail in sqlite3T
11110 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f  hreadData() as o
11120 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73  ne or more calls
11130 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   to .  ** malloc
11140 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  () must have alr
11150 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62  eady been made b
11160 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65  y this thread be
11170 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a  fore it gets.  *
11180 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e  * to this point.
11190 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
111a0 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20  ThreadData must 
111b0 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61  have been alloca
111c0 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ted already.  **
111d0 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44   so that ThreadD
111e0 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62  ata.nAlloc can b
111f0 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68  e set..  */.  Th
11200 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d  readData *pTsd =
11210 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
11220 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta();.  assert( 
11230 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
11240 72 74 28 20 70 54 73 64 20 26 26 20 70 54 73 64  rt( pTsd && pTsd
11250 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64  ->nAlloc );.#end
11260 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 50  if..  switch( pP
11270 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20  ager->state ){. 
11280 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
11290 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SERVED:.    case
112a0 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a   PAGER_SYNCED: .
112b0 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45      case PAGER_E
112c0 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20  XCLUSIVE: {.    
112d0 20 20 2f 2a 20 57 65 20 69 67 6e 6f 72 65 20 61    /* We ignore a
112e0 6e 79 20 49 4f 20 65 72 72 6f 72 73 20 74 68 61  ny IO errors tha
112f0 74 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74  t occur during t
11300 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  he rollback.    
11310 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20    ** operation. 
11320 53 6f 20 64 69 73 61 62 6c 65 20 49 4f 20 65 72  So disable IO er
11330 72 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73  ror simulation s
11340 6f 20 74 68 61 74 20 74 65 73 74 69 6e 67 0a 20  o that testing. 
11350 20 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f       ** works mo
11360 72 65 20 65 61 73 69 6c 79 2e 0a 20 20 20 20 20  re easily..     
11370 20 2a 2f 0a 20 20 20 20 20 20 64 69 73 61 62 6c   */.      disabl
11380 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
11390 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 20 20 73  rrors();.      s
113a0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
113b0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
113c0 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
113d0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
113e0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d  ;.      if( !MEM
113f0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  DB ){.        sq
11400 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
11410 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
11420 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
11430 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11440 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
11450 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
11460 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
11470 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
11480 73 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a  se PAGER_SHARED:
11490 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45   {.      if( !ME
114a0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MDB ){.        s
114b0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
114c0 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
114d0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
114e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
114f0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11500 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
11510 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ng */.      brea
11520 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
11530 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
11540 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
11550 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44  ext){.#ifndef ND
11560 45 42 55 47 0a 20 20 20 20 69 66 28 20 4d 45 4d  EBUG.    if( MEM
11570 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69  DB ){.      PgHi
11580 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
11590 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
115a0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
115b0 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
115c0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
115d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
115e0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
115f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
11600 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
11610 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
11620 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
11630 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
11640 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
11650 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20    TRACE2("CLOSE 
11660 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
11670 50 61 67 65 72 29 29 3b 0a 20 20 61 73 73 65 72  Pager));.  asser
11680 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
11690 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  de || (pPager->j
116a0 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26  ournalOpen==0 &&
116b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
116c0 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  n==0) );.  if( p
116d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
116e0 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
116f0 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
11700 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  ->jfd);.  }.  sq
11710 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
11720 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
11730 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
11740 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
11750 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
11760 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20  er->stfd);.  }. 
11770 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11780 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
11790 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
117a0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
117b0 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
117c0 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
117d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
117e0 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44   **   sqlite3OsD
117f0 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
11800 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d  ilename);.  ** }
11810 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  .  */..#ifdef SQ
11820 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
11830 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
11840 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
11850 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e  ger from the lin
11860 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
11870 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a  rs starting at .
11880 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e    ** ThreadData.
11890 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79  pPager if memory
118a0 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65  -management is e
118b0 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  nabled..  */.  i
118c0 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d  f( pPager==pTsd-
118d0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70  >pPager ){.    p
118e0 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  Tsd->pPager = pP
118f0 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  ager->pNext;.  }
11900 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20  else{.    Pager 
11910 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70  *pTmp;.    for(p
11920 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67  Tmp = pTsd->pPag
11930 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21  er; pTmp->pNext!
11940 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54  =pPager; pTmp=pT
11950 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20  mp->pNext){}.   
11960 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70   pTmp->pNext = p
11970 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Pager->pNext;.  
11980 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
11990 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  eFree(pPager->aH
119a0 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ash);.  sqliteFr
119b0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
119c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
119d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
119e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
119f0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
11a00 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f  ge data..*/.Pgno
11a10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
11a20 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70  genumber(void *p
11a30 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
11a40 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  p = DATA_TO_PGHD
11a50 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
11a60 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  rn p->pgno;.}../
11a70 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65  *.** The page_re
11a80 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63  f() function inc
11a90 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65  rements the refe
11aa0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
11ab0 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68  a page..** If th
11ac0 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
11ad0 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
11ae0 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e  ist (the referen
11af0 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
11b00 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65  ) then.** remove
11b10 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65   it from the fre
11b20 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  elist..**.** For
11b30 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d   non-test system
11b40 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73  s, page_ref() is
11b50 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61   a macro that ca
11b60 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a  lls _page_ref().
11b70 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65  ** online of the
11b80 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
11b90 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74   is zero.  For t
11ba0 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
11bb0 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20  e_ref().** is a 
11bc0 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f  real function so
11bd0 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74   that we can set
11be0 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64   breakpoints and
11bf0 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74   trace it..*/.st
11c00 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f  atic void _page_
11c10 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
11c20 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
11c30 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
11c40 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
11c50 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
11c60 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e  ist.  Remove it.
11c70 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d   */.    if( pPg=
11c80 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46  =pPg->pPager->pF
11c90 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
11ca0 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
11cb0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
11cc0 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26       while( p &&
11cd0 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20   p->needSync ){ 
11ce0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65  p = p->pNextFree
11cf0 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  ; }.      pPg->p
11d00 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
11d10 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ced = p;.    }. 
11d20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
11d30 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
11d40 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
11d50 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
11d60 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d  pNextFree;.    }
11d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
11d80 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  >pPager->pFirst 
11d90 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
11da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11db0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
11dc0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  {.      pPg->pNe
11dd0 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
11de0 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
11df0 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ee;.    }else{. 
11e00 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
11e10 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
11e20 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a  PrevFree;.    }.
11e30 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
11e40 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
11e50 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45  Pg->nRef++;.  RE
11e60 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69  FINFO(pPg);.}.#i
11e70 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
11e80 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
11e90 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
11ea0 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50  pPg){.    if( pP
11eb0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
11ec0 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50      _page_ref(pP
11ed0 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
11ee0 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b       pPg->nRef++
11ef0 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28  ;.      REFINFO(
11f00 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
11f10 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
11f20 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50  age_ref(P)   ((P
11f30 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65  )->nRef==0?_page
11f40 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50  _ref(P):(void)(P
11f50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69  )->nRef++).#endi
11f60 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
11f70 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
11f80 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
11f90 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f  e.  The input po
11fa0 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65  inter is.** a re
11fb0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
11fc0 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  age data..*/.int
11fd0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
11fe0 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  f(void *pData){.
11ff0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
12000 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
12010 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  ta);.  page_ref(
12020 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
12030 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12040 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
12050 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  nal.  In other w
12060 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
12070 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
12080 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
12090 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
120a0 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
120b0 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
120c0 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
120d0 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20  ** disk.  It is 
120e0 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69  not safe to modi
120f0 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  fy the original 
12100 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
12110 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  til after.** the
12120 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
12130 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68  n synced.  If th
12140 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
12150 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ase is modified 
12160 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f  before.** the jo
12170 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
12180 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c  and a power fail
12190 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ure occurs, the 
121a0 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c  unsynced journal
121b0 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62  .** data would b
121c0 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f  e lost and we wo
121d0 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  uld be unable to
121e0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c   completely roll
121f0 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  back the.** data
12200 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44  base changes.  D
12210 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
12220 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a  on would occur..
12230 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
12240 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73  ine also updates
12250 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
12260 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
12270 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
12280 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f   (See comments o
12290 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  n the pager_play
122a0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  back() routine f
122b0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
122c0 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49  formation.).** I
122d0 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20  f the sync mode 
122e0 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e  is FULL, two syn
122f0 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20  cs will occur.  
12300 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20  First the whole 
12310 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79  journal.** is sy
12320 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e  nced, then the n
12330 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
12340 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63  ated, then a sec
12350 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e  ond sync occurs.
12360 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
12370 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20  rary databases, 
12380 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69  we do not care i
12390 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  f we are able to
123a0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74   rollback.** aft
123b0 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
123c0 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75  re, so sync occu
123d0 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rs..**.** This r
123e0 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
123f0 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64  e needSync field
12400 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63   of every page c
12410 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a  urrent held in.*
12420 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  * memory..*/.sta
12430 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
12440 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
12450 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
12460 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12470 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79  ITE_OK;..  /* Sy
12480 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
12490 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
124a0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
124b0 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
124c0 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
124d0 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
124e0 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
124f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
12500 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
12510 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
12520 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
12530 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12540 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
12550 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
12560 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
12570 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d  c ); // noSync m
12580 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73  ight be set if s
12590 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20  ynchronous.     
125a0 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f   ** was turned o
125b0 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ff after the tra
125c0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
125d0 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36  rted.  Ticket #6
125e0 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  15 */.#ifndef ND
125f0 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20  EBUG.      {.   
12600 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
12610 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52  e the pPager->nR
12620 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72  ec counter we ar
12630 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73  e keeping agrees
12640 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
12650 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74   the nRec comput
12660 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ed from the size
12670 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12680 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
12690 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a  .        i64 jSz
126a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
126b0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
126c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
126d0 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Sz);.        if(
126e0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
126f0 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rc;.        asse
12700 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
12710 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20  nalOff==jSz );. 
12720 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
12730 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
12740 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
12750 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
12760 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
12770 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
12780 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
12790 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
127a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
127b0 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
127c0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
127d0 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
127e0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
127f0 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
12800 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
12810 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
12820 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
12830 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20  r rollback. .   
12840 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
12850 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
12860 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
12870 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a    TRACE2("SYNC j
12880 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
12890 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
128a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
128b0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
128c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
128d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
128e0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
128f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12900 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12910 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
12920 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12940 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12950 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
12960 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
12970 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
12980 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
12990 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
129a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
129b0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
129c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
129d0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
129e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
129f0 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
12a00 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
12a10 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69  lOff);.        i
12a20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
12a30 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
12a40 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
12a50 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
12a60 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
12a70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12a80 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
12a90 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
12aa0 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20  full_fsync);.   
12ab0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
12ac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12ad0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
12ae0 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
12af0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
12b00 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
12b10 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65   /* Erase the ne
12b20 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d  edSync flag from
12b30 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20   every page..   
12b40 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   */.    for(pPg=
12b50 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
12b60 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
12b70 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
12b80 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
12b90 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
12ba0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
12bb0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
12bc0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
12bd0 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
12be0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
12bf0 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
12c00 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
12c10 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
12c20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
12c30 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
12c40 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
12c50 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
12c60 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
12c70 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72  .  else{.    for
12c80 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
12c90 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
12ca0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
12cb0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
12cc0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
12cd0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
12ce0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
12cf0 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46  nced==pPager->pF
12d00 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  irst );.  }.#end
12d10 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
12d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
12d30 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  a list of pages 
12d40 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68  (connected by th
12d50 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
12d60 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a  ointer) write.**
12d70 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68   every one of th
12d80 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f  ose pages out to
12d90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12da0 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d  le and mark them
12db0 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e   all.** as clean
12dc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12dd0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
12de0 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
12df0 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
12e00 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
12e10 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
12e20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12e30 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
12e40 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
12e50 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
12e60 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
12e70 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
12e80 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
12e90 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
12ea0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
12eb0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
12ec0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
12ed0 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
12ee0 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  g.  ** calls to 
12ef0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
12f00 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a  are no-ops..  **
12f10 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
12f20 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
12f30 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
12f40 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
12f50 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
12f60 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
12f70 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
12f80 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
12f90 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
12fa0 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
12fb0 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
12fc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
12fd0 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
12fe0 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
12ff0 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
13000 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
13010 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
13020 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
13030 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
13040 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
13050 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
13060 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
13070 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
13080 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
13090 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
130a0 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
130b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
130c0 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
130d0 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
130e0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
130f0 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
13100 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
13110 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
13120 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
13130 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
13140 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
13150 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
13160 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
13170 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
13180 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
13190 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
131a0 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
131b0 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
131c0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
131d0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
131e0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
131f0 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
13200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
13210 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
13220 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
13230 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
13240 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  st->dirty );.   
13250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
13260 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
13270 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
13280 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
13290 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
132a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
132b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
132c0 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
132d0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
132e0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
132f0 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
13300 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
13310 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
13320 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72   sqlite3pager_tr
13330 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
13340 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
13350 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
13360 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
13370 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
13380 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
13390 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
133a0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
133b0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
133c0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
133d0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
133e0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
133f0 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70  pData = CODEC2(p
13400 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
13410 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
13420 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20  st->pgno, 6);.  
13430 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4f 52      TRACE3("STOR
13440 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
13450 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
13460 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
13470 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13480 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
13490 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
134a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
134b0 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28        TEST_INCR(
134c0 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b  pPager->nWrite);
134d0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
134e0 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
134f0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4e 4f        TRACE3("NO
13500 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
13510 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13520 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
13530 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  o);.    }.#endif
13540 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
13550 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69  turn rc;.    pLi
13560 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  st->dirty = 0;.#
13570 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
13580 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69  CK_PAGES.    pLi
13590 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  st->pageHash = p
135a0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
135b0 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ist);.#endif.   
135c0 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
135d0 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65  pDirty;.  }.  re
135e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
135f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74  }../*.** Collect
13600 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67   every dirty pag
13610 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c  e into a dirty l
13620 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ist and.** retur
13630 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
13640 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20  he head of that 
13650 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73  list.  All pages
13660 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65   are.** collecte
13670 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61  d even if they a
13680 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e  re still in use.
13690 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
136a0 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f   *pager_get_all_
136b0 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65  dirty_pages(Page
136c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
136d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69  turn pPager->pDi
136e0 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
136f0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
13700 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
13710 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  nal on the given
13720 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74   pager..** A hot
13730 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
13740 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
13750 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a   played back..**
13760 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
13770 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
13780 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
13790 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
137a0 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
137b0 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
137c0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
137d0 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
137e0 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
137f0 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
13800 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c   name.  Just del
13810 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
13820 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
13830 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
13840 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
13850 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  f( !pPager->useJ
13860 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20  ournal ) return 
13870 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
13880 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
13890 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
138a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
138b0 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  ( sqlite3OsCheck
138c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
138d0 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75 72  ger->fd) ) retur
138e0 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 0;.  if( sqlit
138f0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
13900 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
13910 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
13920 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
13930 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  rnal);.    retur
13940 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
13950 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
13960 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
13970 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
13980 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61  he cache that ca
13990 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a  n be recycled. .
139a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
139b0 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ne may return SQ
139c0 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
139d0 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54  TE_FULL or SQLIT
139e0 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65  E_OK. It .** doe
139f0 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50  s not set the pP
13a00 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61  ager->errCode va
13a10 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
13a20 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79  c int pager_recy
13a30 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  cle(Pager *pPage
13a40 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50  r, int syncOk, P
13a50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20  gHdr **ppPg){.  
13a60 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70  PgHdr *pPg;.  *p
13a70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46  pPg = 0;..  /* F
13a80 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
13a90 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
13aa0 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
13ab0 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  t does not.  ** 
13ac0 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
13ad0 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
13ae0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  he journal..  */
13af0 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d  .  pPg = pPager-
13b00 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
13b10 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
13b20 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
13b30 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
13b40 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
13b50 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f  ).  ** on the jo
13b60 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
13b70 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
13b80 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
13b90 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f   a.  ** very slo
13ba0 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
13bb0 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
13bc0 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
13bd0 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74  ometimes.  ** it
13be0 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
13bf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
13c00 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
13c10 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20  First && syncOk 
13c20 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20  && !MEMDB){.    
13c30 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
13c40 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
13c50 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
13c60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13c70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
13c80 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
13c90 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e  {.      /* If in
13ca0 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
13cb0 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
13cc0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
13cd0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   the.      ** jo
13ce0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
13cf0 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
13d00 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
13d10 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
13d20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
13d30 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
13d40 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
13d50 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
13d60 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
13d70 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
13d80 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
13d90 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
13da0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   is.      ** tra
13db0 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
13dc0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
13dd0 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ted)..      */. 
13de0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
13df0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
13e00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13e10 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
13e20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
13e30 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
13e40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
13e60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
13e70 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
13e80 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
13e90 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
13ea0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
13eb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
13ec0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13ed0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
13ee0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
13ef0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
13f00 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
13f10 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ty..  */.  if( p
13f20 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
13f30 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
13f40 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
13f50 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b  nc==0 );.    mak
13f60 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
13f70 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
13f80 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
13f90 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
13fa0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
13fb0 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
13fc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13fd0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
13fe0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
13ff0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
14000 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  irty==0 );..  /*
14010 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20   If the page we 
14020 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73  are recycling is
14030 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
14040 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a  sRollback, then.
14050 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f    ** set the glo
14060 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  bal alwaysRollba
14070 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69  ck flag, thus di
14080 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a  sabling the.  **
14090 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c   sqlite_dont_rol
140a0 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61  lback() optimiza
140b0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73  tion for the res
140c0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
140d0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69  ction..  ** It i
140e0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
140f0 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
14100 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
14110 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
14120 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f  ** might be relo
14130 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20  aded at a later 
14140 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74  time but at that
14150 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20   point we won't 
14160 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
14170 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64  at is was marked
14180 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e   alwaysRollback.
14190 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
141a0 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  t all pages must
141b0 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20  .  ** be marked 
141c0 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
141d0 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f  k from here on o
141e0 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ut..  */.  if( p
141f0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
14200 63 6b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ck ){.    pPager
14210 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
14220 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
14230 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
14240 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
14250 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
14260 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  ash table.  */. 
14270 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
14280 3b 0a 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50  ;.  TEST_INCR(pP
14290 61 67 65 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20  ager->nOvfl);.. 
142a0 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20   *ppPg = pPg;.  
142b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
142c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
142d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
142e0 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72  ed to free super
142f0 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c  fluous dynamical
14300 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  ly allocated mem
14310 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74  ory.** held by t
14320 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e  he pager system.
14330 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   Memory in use b
14340 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67  y any SQLite pag
14350 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  er allocated.** 
14360 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
14370 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c  hread may be sql
14380 69 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a  iteFree()ed..**.
14390 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e  ** nReq is the n
143a0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
143b0 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  f memory require
143c0 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63  d. Once this muc
143d0 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65  h has.** been re
143e0 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63  leased, the func
143f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20  tion returns. A 
14400 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 66  negative value f
14410 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a  or nReq means.**
14420 20 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65   free as much me
14430 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
14440 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
14450 75 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  ue is the total 
14460 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79  number .** of by
14470 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  tes of memory re
14480 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  leased..*/.#ifde
14490 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
144a0 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
144b0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  T.int sqlite3pag
144c0 65 72 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  er_release_memor
144d0 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63  y(int nReq){.  c
144e0 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20  onst ThreadData 
144f0 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c 69 74 65  *pTsdro = sqlite
14500 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
14510 6e 6c 79 28 29 3b 0a 20 20 50 61 67 65 72 20 2a  nly();.  Pager *
14520 70 3b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73  p;.  int nReleas
14530 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ed = 0;.  int i;
14540 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 68  ..  /* If the th
14550 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  e global mutex i
14560 73 20 68 65 6c 64 2c 20 74 68 69 73 20 73 75 62  s held, this sub
14570 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20  routine becomes 
14580 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72  a.  ** o-op; zer
14590 6f 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  o bytes of memor
145a0 79 20 61 72 65 20 66 72 65 65 64 2e 20 20 54 68  y are freed.  Th
145b0 69 73 20 69 73 20 62 65 63 61 75 73 65 0a 20 20  is is because.  
145c0 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  ** some of the c
145d0 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ode invoked by t
145e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
145f0 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74   also.  ** try t
14600 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74  o obtain the mut
14610 65 78 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ex, resulting in
14620 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a   a deadlock..  *
14630 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  /.  if( sqlite3O
14640 73 49 6e 4d 75 74 65 78 28 30 29 20 29 7b 0a 20  sInMutex(0) ){. 
14650 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14660 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74  ..  /* Outermost
14670 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20 61   loop runs for a
14680 74 20 6d 6f 73 74 20 74 77 6f 20 69 74 65 72 61  t most two itera
14690 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 69 74 65  tions. First ite
146a0 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74  ration we.  ** t
146b0 72 79 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72  ry to find memor
146c0 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  y that can be re
146d0 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 20 63  leased without c
146e0 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e 20  alling fsync(). 
146f0 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72  Second.  ** iter
14700 61 74 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c  ation (which onl
14710 79 20 72 75 6e 73 20 69 66 20 74 68 65 20 66 69  y runs if the fi
14720 72 73 74 20 66 61 69 6c 65 64 20 74 6f 20 66 72  rst failed to fr
14730 65 65 20 6e 52 65 71 20 62 79 74 65 73 20 6f 66  ee nReq bytes of
14740 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73  .  ** memory) is
14750 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 63 61   permitted to ca
14760 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54 68 69 73  ll fsync(). This
14770 20 69 73 20 6f 66 20 63 6f 75 72 73 65 20 6d 75   is of course mu
14780 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78  ch more .  ** ex
14790 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  pensive..  */.  
147a0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69  for(i=0; i<=1; i
147b0 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f  ++){..    /* Loo
147c0 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  p through all th
147d0 65 20 53 51 4c 69 74 65 20 70 61 67 65 72 73 20  e SQLite pagers 
147e0 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 63 75  opened by the cu
147f0 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f  rrent thread. */
14800 0a 20 20 20 20 66 6f 72 28 70 3d 70 54 73 64 72  .    for(p=pTsdr
14810 6f 2d 3e 70 50 61 67 65 72 3b 20 70 20 26 26 20  o->pPager; p && 
14820 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65  (nReq<0 || nRele
14830 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d  ased<nReq); p=p-
14840 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50  >pNext){.      P
14850 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
14860 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20   int rc;..      
14870 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61 67 65  /* For each page
14880 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65 20 61  r, try to free a
14890 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61 73 20  s many pages as 
148a0 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68 6f 75  possible (withou
148b0 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  t .      ** call
148c0 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66 20 74  ing fsync() if t
148d0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
148e0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
148f0 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20 20  e outermost .   
14900 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20     ** loop)..   
14910 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c     */.      whil
14920 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  e( SQLITE_OK==(r
14930 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c  c = pager_recycl
14940 65 28 70 2c 20 69 2c 20 26 70 50 67 29 29 20 26  e(p, i, &pPg)) &
14950 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20  & pPg) {.       
14960 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20   /* We've found 
14970 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20  a page to free. 
14980 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
14990 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
149a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f  .        ** remo
149b0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ved from the pag
149c0 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72  e hash-table, fr
149d0 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63  ee-list and sync
149e0 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20  ed-list .       
149f0 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65   ** (pFirstSynce
14a00 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20  d). It is still 
14a10 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73  in the all pages
14a20 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20   (pAll) list. . 
14a30 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65         ** Remove
14a40 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69   it from this li
14a50 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  st before freein
14a60 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g..        **.  
14a70 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43        ** Todo: C
14a80 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70  heck the Pager.p
14a90 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b  Stmt list to mak
14aa0 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f  e sure this is O
14ab0 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a  k. It .        *
14ac0 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68  * probably is th
14ad0 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ough..        */
14ae0 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
14af0 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  pTmp;.        as
14b00 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20  sert( pPg );.   
14b10 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65       page_remove
14b20 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
14b30 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pPg);.        if
14b40 28 20 70 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29  ( pPg==p->pAll )
14b50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  {.           p->
14b60 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
14b70 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  tAll;.        }e
14b80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
14b90 6f 72 28 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c  or( pTmp=p->pAll
14ba0 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  ; pTmp->pNextAll
14bb0 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70  !=pPg; pTmp=pTmp
14bc0 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20  ->pNextAll ){}. 
14bd0 20 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70           pTmp->p
14be0 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  NextAll = pPg->p
14bf0 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
14c00 20 7d 0a 20 20 20 20 20 20 20 20 6e 52 65 6c 65   }.        nRele
14c10 61 73 65 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c  ased += sqliteAl
14c20 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b 0a 20 20  locSize(pPg);.  
14c30 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
14c40 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  (pPg);.      }..
14c50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14c70 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f     /* An error o
14c80 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72  ccured whilst wr
14c90 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
14ca0 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20  abase file or . 
14cb0 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
14cc0 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63  l in pager_recyc
14cd0 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20  le(). The error 
14ce0 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20  is not returned 
14cf0 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
14d00 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69  ** caller of thi
14d10 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74  s function. Inst
14d20 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67  ead, set the Pag
14d30 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
14d40 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble..        ** 
14d50 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
14d60 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
14d70 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73  e user (or users
14d80 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20  , in the case . 
14d90 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73         ** of a s
14da0 68 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68  hared pager cach
14db0 65 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e) of the pager 
14dc0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72  for which the er
14dd0 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20  ror occured..   
14de0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14df0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
14e00 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d  TE_IOERR || rc==
14e10 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20  SQLITE_FULL );. 
14e20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14e30 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
14e40 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20  ESERVED );.     
14e50 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
14e60 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
14e70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
14e80 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a  rn nReleased;.}.
14e90 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14ea0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
14eb0 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a  ANAGEMENT */../*
14ec0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
14ed0 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
14ee0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
14ef0 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
14f00 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
14f10 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
14f20 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
14f30 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
14f40 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
14f50 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
14f60 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77  ..**.** A _get w
14f70 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
14f80 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
14f90 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
14fa0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
14fb0 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
14fc0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
14fd0 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
14fe0 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
14ff0 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
15000 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
15010 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
15020 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
15030 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
15040 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
15050 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
15060 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
15070 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
15080 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
15090 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
150a0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
150b0 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
150c0 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
150d0 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
150e0 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
150f0 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
15100 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
15110 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
15120 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
15130 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
15140 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65  also sqlite3page
15150 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  r_lookup().  Bot
15160 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
15170 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74  nd _lookup() att
15180 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
15190 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
151a0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
151b0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
151c0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
151d0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
151e0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
151f0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
15200 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f   it in whereas _
15210 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  lookup().** just
15220 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
15230 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
15240 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
15250 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
15260 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
15270 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
15280 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
15290 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
152a0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
152b0 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e  ince _lookup() n
152c0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
152d0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
152e0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
152f0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
15300 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
15310 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
15320 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
15330 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
15340 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64  *ppPage){.  PgHd
15350 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
15360 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  ;..  /* The maxi
15370 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
15380 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
15390 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
153a0 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75  f a page.  ** nu
153b0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
153c0 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c  n this, or zero,
153d0 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
153e0 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50   */.  if( pgno>P
153f0 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
15400 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
15410 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
15420 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
15430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
15440 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
15450 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
15460 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
15470 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
15480 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
15490 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
154a0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
154b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
154c0 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
154d0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
154e0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
154f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
15500 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ode;.  }..  /* I
15510 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
15520 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
15530 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
15540 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
15550 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
15560 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
15570 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
15580 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  && !MEMDB ){.   
15590 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
155a0 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
155b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
155c0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
155d0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
155e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
155f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15600 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
15610 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
15620 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15630 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
15640 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
15650 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
15660 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
15670 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
15680 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
15690 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
156a0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
156b0 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
156c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
156d0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
156e0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
156f0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
15700 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
15710 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
15720 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
15730 69 73 0a 20 20 20 20 20 20 20 2a 2a 20 69 6d 70  is.       ** imp
15740 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
15750 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
15760 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
15770 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
15780 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
15790 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
157a0 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
157b0 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
157c0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74  he.       ** dat
157d0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
157e0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
157f0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
15800 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
15810 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
15820 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
15830 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
15840 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
15850 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 2a 2a  ng it .       **
15860 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a   back..       **
15870 20 0a 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61   .       ** Beca
15880 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
15890 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
158a0 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
158b0 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20  ted, the.       
158c0 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73  ** second proces
158d0 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68  s will get to th
158e0 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
158f0 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
15900 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69  .       ** obtai
15910 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55  n it's own EXCLU
15920 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
15930 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
15940 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
15960 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
15970 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
15980 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
15990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
159a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
159b0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
159c0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
159d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
159e0 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
159f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  K;.         retu
15a00 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
15a10 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
15a20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
15a30 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
15a40 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20  R_EXCLUSIVE;..  
15a50 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
15a60 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
15a70 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75  ding only.  Retu
15a80 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  rn SQLITE_BUSY i
15a90 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61  f.       ** we a
15aa0 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  re unable to ope
15ab0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
15ac0 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20  le. .       **. 
15ad0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
15ae0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
15af0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
15b00 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
15b10 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e.       ** jour
15b20 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
15b30 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68  r open unless th
15b40 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
15b50 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20  file holds.     
15b60 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
15b70 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
15b80 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
15b90 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
15ba0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
15bb0 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a  es opening the j
15bc0 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61  ournal at the sa
15bd0 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  me time..       
15be0 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73  */.       rc = s
15bf0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
15c00 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Only(pPager->zJo
15c10 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
15c20 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28  jfd);.       if(
15c30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15c40 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  {.         sqlit
15c50 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
15c60 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
15c70 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
15c80 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
15c90 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
15ca0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
15cb0 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20  USY;.       }.  
15cc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
15cd0 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
15ce0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
15cf0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
15d00 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
15d10 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
15d20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
15d30 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
15d40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
15d50 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20  rnalHdr = 0;..  
15d60 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
15d70 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
15d80 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
15d90 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
15da0 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  e.       ** lock
15db0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
15dc0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
15dd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
15de0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
15df0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
15e00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15e10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15e20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
15e30 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
15e40 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  .       }.    }.
15e50 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d      pPg = 0;.  }
15e60 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61  else{.    /* Sea
15e70 72 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20  rch for page in 
15e80 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67  cache */.    pPg
15e90 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
15ea0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
15eb0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20     if( MEMDB && 
15ec0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
15ed0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
15ee0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
15ef0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
15f00 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  D;.    }.  }.  i
15f10 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
15f20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
15f30 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
15f40 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
15f50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20   */.    int h;. 
15f60 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61     TEST_INCR(pPa
15f70 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
15f80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
15f90 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  ge<pPager->mxPag
15fa0 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69  e || pPager->pFi
15fb0 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20  rst==0 || MEMDB 
15fc0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ){.      /* Crea
15fd0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f  te a new page */
15fe0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
15ff0 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72  r->nPage>=pPager
16000 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20  ->nHash ){.     
16010 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
16020 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
16030 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 50  r,.           pP
16040 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20  ager->nHash<256 
16050 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e  ? 256 : pPager->
16060 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20  nHash*2);.      
16070 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48    if( pPager->nH
16080 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ash==0 ){.      
16090 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
160a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
160b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
160c0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
160d0 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
160e0 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70  pPg) + pPager->p
160f0 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20  ageSize.        
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75        + sizeof(u
16120 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  32) + pPager->nE
16130 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20  xtra.           
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f     + MEMDB*sizeo
16160 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a  f(PgHistory) );.
16170 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
16180 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
16190 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
161a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
161b0 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69  emset(pPg, 0, si
161c0 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20  zeof(*pPg));.   
161d0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
161e0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
161f0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
16200 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69  , pPager), 0, si
16210 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29  zeof(PgHistory))
16220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16230 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
16240 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d  ager;.      pPg-
16250 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67  >pNextAll = pPag
16260 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20  er->pAll;.      
16270 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70  pPager->pAll = p
16280 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  Pg;.      pPager
16290 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
162a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
162b0 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  ge>pPager->nMaxP
162c0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  age ){.        a
162d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
162e0 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65 72  MaxPage==(pPager
162f0 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20 20  ->nPage-1) );.  
16300 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d        pPager->nM
16310 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  axPage++;.      
16320 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
16330 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65     rc = pager_re
16340 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c  cycle(pPager, 1,
16350 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66   &pPg);.      if
16360 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16370 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
16380 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
16390 20 20 20 20 61 73 73 65 72 74 28 70 50 67 29 20      assert(pPg) 
163a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
163b0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
163c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
163d0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
163e0 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  )pgno<=pPager->o
163f0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
16400 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d     sqlite3CheckM
16410 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49  emory(pPager->aI
16420 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38  nJournal, pgno/8
16430 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16440 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16450 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50  Open );.      pP
16460 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  g->inJournal = (
16470 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
16480 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  al[pgno/8] & (1<
16490 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a  <(pgno&7)))!=0;.
164a0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
164b0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ync = 0;.    }el
164c0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  se{.      pPg->i
164d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
164e0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
164f0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
16500 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
16510 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e  Stmt && (int)pgn
16520 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
16530 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ize.            
16540 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e   && (pPager->aIn
16550 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  Stmt[pgno/8] & (
16560 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
16570 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61   ){.      page_a
16580 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
16590 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
165a0 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f  .      page_remo
165b0 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
165c0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
165d0 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
165e0 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20  ;.    pPg->nRef 
165f0 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f  = 1;.    REFINFO
16600 28 70 50 67 29 3b 0a 0a 20 20 20 20 70 50 61 67  (pPg);..    pPag
16610 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
16620 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
16630 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
16640 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
16650 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
16660 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
16670 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
16680 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
16690 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ode ){.      sql
166a0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
166b0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
166c0 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g));.      rc = 
166d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
166e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
166f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16700 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67  Populate the pag
16710 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74  e with data, eit
16720 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66  her by reading f
16730 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
16740 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72  .    ** file, or
16750 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
16760 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a  entire page to z
16770 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
16780 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72  if( sqlite3pager
16790 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
167a0 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  r)<(int)pgno || 
167b0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6d  MEMDB ){.      m
167c0 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
167d0 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
167e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
167f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16800 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d   assert( MEMDB==
16810 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
16820 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
16830 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d  ager->fd, (pgno-
16840 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
16850 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16860 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16870 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
16880 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
16890 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  (pPager->fd, PGH
168a0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
168b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
168d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
168e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
168f0 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64  TRACE3("FETCH %d
16900 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
16910 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
16920 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
16930 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50  CODEC1(pPager, P
16940 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16950 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
16960 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16980 20 20 20 20 20 69 36 34 20 66 69 6c 65 53 69 7a       i64 fileSiz
16990 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e;.        int r
169a0 63 32 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  c2 = sqlite3OsFi
169b0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
169c0 64 2c 20 26 66 69 6c 65 53 69 7a 65 29 3b 0a 20  d, &fileSize);. 
169d0 20 20 20 20 20 20 20 69 66 28 20 72 63 32 21 3d         if( rc2!=
169e0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 69 6c  SQLITE_OK || fil
169f0 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67  eSize>=pgno*pPag
16a00 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
16a10 09 20 20 2f 2a 20 41 6e 20 49 4f 20 65 72 72 6f  .  /* An IO erro
16a20 72 20 6f 63 63 75 72 65 64 20 69 6e 20 6f 6e 65  r occured in one
16a30 20 6f 66 20 74 68 65 20 74 68 65 20 73 71 6c 69   of the the sqli
16a40 74 65 33 4f 73 53 65 65 6b 28 29 20 6f 72 0a 20  te3OsSeek() or. 
16a50 20 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69           ** sqli
16a60 74 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c  te3OsRead() call
16a70 73 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  s above. */.    
16a80 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20        pPg->pgno 
16a90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 0;.          s
16aa0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
16ab0 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  f(PGHDR_TO_DATA(
16ac0 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20  pPg));.         
16ad0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16ae0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16af0 20 20 20 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c       clear_simul
16b00 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b  ated_io_error();
16b10 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
16b20 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
16b30 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
16b40 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
16b50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
16b60 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f  e{.        TEST_
16b70 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
16b80 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ad);.      }.   
16b90 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20   }..    /* Link 
16ba0 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
16bb0 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c  e page hash tabl
16bc0 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e  e */.    h = pgn
16bd0 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
16be0 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e  sh-1);.    pPg->
16bf0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
16c00 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
16c10 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
16c20 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  h] = pPg;.    if
16c30 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
16c40 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
16c50 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
16c60 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
16c70 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
16c80 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
16c90 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a  h = pPg;.    }..
16ca0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
16cb0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
16cc0 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
16cd0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
16ce0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
16cf0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
16d00 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
16d10 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
16d20 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53 54 5f 49  e. */.    TEST_I
16d30 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74  NCR(pPager->nHit
16d40 29 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28  );.    page_ref(
16d50 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
16d60 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  age = PGHDR_TO_D
16d70 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ATA(pPg);.  retu
16d80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16d90 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
16da0 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
16db0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
16dc0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
16dd0 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
16de0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
16df0 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
16e00 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
16e10 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
16e20 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16e30 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
16e40 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67   also sqlite3pag
16e50 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64  er_get().  The d
16e60 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
16e70 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
16e80 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67  * and sqlite3pag
16e90 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61 74  er_get() is that
16ea0 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
16eb0 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
16ec0 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
16ed0 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
16ee0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
16ef0 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
16f00 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
16f10 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
16f20 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
16f30 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
16f40 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
16f50 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
16f60 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
16f70 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  3pager_lookup(Pa
16f80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
16f90 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
16fa0 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
16fb0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
16fc0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
16fd0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
16fe0 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
16ff0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
17000 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
17010 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
17020 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
17030 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
17040 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
17050 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61  ) return 0;.  pa
17060 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
17070 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
17080 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
17090 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
170a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
170b0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
170c0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
170d0 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
170e0 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
170f0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
17100 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
17110 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
17120 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
17130 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
17140 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
17150 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
17160 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
17170 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
17180 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  t sqlite3pager_u
17190 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61  nref(void *pData
171a0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
171b0 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74  ..  /* Decrement
171c0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
171d0 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61  ount for this pa
171e0 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  ge.  */.  pPg = 
171f0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
17200 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
17210 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
17220 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pPg->nRef--;.  
17230 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
17240 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
17250 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
17260 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
17270 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
17280 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
17290 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
172a0 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
172b0 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
172c0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
172d0 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
172e0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
172f0 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
17300 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
17310 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
17320 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
17330 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
17340 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
17350 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
17360 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
17370 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
17380 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
17390 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
173a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
173b0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
173c0 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
173d0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
173e0 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
173f0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
17400 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
17410 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
17420 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
17430 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
17440 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
17450 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
17460 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50  ructor(pData, pP
17470 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
17480 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
17490 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   When all pages 
174a0 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69  reach the freeli
174b0 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61  st, drop the rea
174c0 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20  d lock from.    
174d0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
174e0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
174f0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b   pPager->nRef--;
17500 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
17510 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a  ger->nRef>=0 );.
17520 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17530 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44  nRef==0 && !MEMD
17540 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  B ){.      pager
17550 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
17560 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17570 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17580 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
17590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
175a0 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
175b0 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
175c0 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
175d0 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
175e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
175f0 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
17600 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
17610 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
17620 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
17630 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
17640 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
17650 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
17660 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
17670 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
17680 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
17690 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
176a0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
176b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
176c0 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
176d0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
176e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
176f0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
17700 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17710 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
17720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17730 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
17740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17750 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
17760 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
17770 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
17780 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
17790 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
177a0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
177b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
177c0 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
177d0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
177e0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
177f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17800 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
17810 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
17820 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
17830 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70  sOpenExclusive(p
17840 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
17850 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20   &pPager->jfd,. 
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17890 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
178a0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
178b0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
178c0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
178d0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
178e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
178f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
17900 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
17910 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71  ournal;.  }.  sq
17920 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79  lite3OsSetFullSy
17930 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
17940 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
17950 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  nc);.  sqlite3Os
17960 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67  SetFullSync(pPag
17970 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
17980 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73  full_fsync);.  s
17990 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65  qlite3OsOpenDire
179a0 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  ctory(pPager->jf
179b0 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  d, pPager->zDire
179c0 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67 65 72  ctory);.  pPager
179d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
179e0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
179f0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
17a00 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
17a10 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
17a20 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
17a30 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
17a40 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
17a50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17a60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
17a70 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
17a80 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
17a90 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
17aa0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
17ab0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
17ac0 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
17ad0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
17ae0 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
17af0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75  ( pPager->stmtAu
17b00 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51  toopen && rc==SQ
17b10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17b20 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
17b30 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61 67  _stmt_begin(pPag
17b40 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
17b50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
17b60 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
17b70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
17b80 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
17b90 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
17ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17bb0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
17bc0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
17bd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17be0 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
17bf0 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
17c00 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
17c10 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
17c20 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
17c30 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
17c40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
17c50 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
17c60 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
17c70 6c 75 72 65 2c 20 74 68 65 6e 20 77 65 20 77 69  lure, then we wi
17c80 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e  ll not be closin
17c90 67 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  g the pager.    
17ca0 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65  ** file. So dele
17cb0 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66  te any journal f
17cc0 69 6c 65 20 77 65 20 6d 61 79 20 68 61 76 65 20  ile we may have 
17cd0 6a 75 73 74 20 63 72 65 61 74 65 64 2e 20 4f 74  just created. Ot
17ce0 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20  herwise,.    ** 
17cf0 74 68 65 20 73 79 73 74 65 6d 20 77 69 6c 6c 20  the system will 
17d00 67 65 74 20 63 6f 6e 66 75 73 65 64 2c 20 77 65  get confused, we
17d10 20 68 61 76 65 20 61 20 72 65 61 64 2d 6c 6f 63   have a read-loc
17d20 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  k on the file an
17d30 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65  d a.    ** myste
17d40 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61  rious journal ha
17d50 73 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68  s appeared in th
17d60 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20  e filesystem..  
17d70 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
17d80 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
17d90 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 65  >zJournal);.  }e
17da0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
17db0 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
17dc0 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
17dd0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
17de0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
17df0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17e00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
17e10 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
17e20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
17e30 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
17e40 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
17e50 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
17e60 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
17e70 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
17e80 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20  3pager_commit() 
17e90 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
17ea0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
17eb0 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  rollback() is ca
17ec0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
17ed0 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
17ee0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
17ef0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
17f00 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61  er_unref() is ca
17f10 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79  lled to on every
17f20 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
17f30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
17f40 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  st parameter to 
17f50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17f60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79  a pointer to any
17f70 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68   open page of th
17f80 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
17f90 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61  le.  Nothing cha
17fa0 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70  nges about the p
17fb0 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64  age - it is used
17fc0 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63   merely to.** ac
17fd0 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20  quire a pointer 
17fe0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
17ff0 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72  ucture and as pr
18000 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69  oof that there i
18010 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72  s.** already a r
18020 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
18030 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
18040 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  The second param
18050 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68  eter indicates h
18060 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e  ow much space in
18070 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76   bytes to reserv
18080 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65  e for a.** maste
18090 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e  r journal file-n
180a0 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ame at the start
180b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
180c0 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74  when it is creat
180d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72  ed..**.** A jour
180e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
180f0 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ed if this is no
18100 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  t a temporary fi
18110 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61  le.  For tempora
18120 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65  ry.** files, the
18130 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20   opening of the 
18140 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
18150 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
18160 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63  here is an.** ac
18170 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69  tual need to wri
18180 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
18190 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
181a0 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
181b0 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72  ady reserved for
181c0 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72   writing, this r
181d0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
181e0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c  p..**.** If exFl
181f0 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61  ag is true, go a
18200 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20  head and get an 
18210 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
18220 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d  n the file.** im
18230 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61  mediately instea
18240 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74  d of waiting unt
18250 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75  il we try to flu
18260 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
18270 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20  he.** exFlag is 
18280 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61  ignored if a tra
18290 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
182a0 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69  ady active..*/.i
182b0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
182c0 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
182d0 61 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a  a, int exFlag){.
182e0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
182f0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
18300 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
18310 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
18320 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
18330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
18340 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
18350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18360 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
18370 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
18380 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
18390 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
183a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
183b0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
183c0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
183d0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
183e0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
183f0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
18400 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
18410 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
18420 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
18430 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
18440 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
18450 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
18460 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
18470 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18480 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
18490 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
184a0 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
184b0 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
184c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
184d0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
184e0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
184f0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
18500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18510 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18540 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
18550 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
18560 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  0;.      TRACE2(
18570 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
18580 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
18590 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  er));.      if( 
185a0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
185b0 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  al && !pPager->t
185c0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
185d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
185e0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
185f0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
18600 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
18610 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
18620 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20   a page dirty.  
18630 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c  Set its dirty fl
18640 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f  ag and add it to
18650 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61   the dirty.** pa
18660 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
18670 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74  ic void makeDirt
18680 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  y(PgHdr *pPg){. 
18690 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d   if( pPg->dirty=
186a0 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
186b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
186c0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
186d0 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
186e0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
186f0 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ger->pDirty;.   
18700 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69   if( pPager->pDi
18710 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61  rty ){.      pPa
18720 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  ger->pDirty->pPr
18730 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  evDirty = pPg;. 
18740 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
18750 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  revDirty = 0;.  
18760 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
18770 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = pPg;.  }.}../
18780 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
18790 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69   clean.  Clear i
187a0 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64  ts dirty bit and
187b0 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
187c0 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
187d0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
187e0 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
187f0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
18800 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
18810 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  {.    pPg->dirty
18820 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
18830 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  g->pDirty ){.   
18840 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e     pPg->pDirty->
18850 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
18860 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20  ->pPrevDirty;.  
18870 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
18880 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20  >pPrevDirty ){. 
18890 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44       pPg->pPrevD
188a0 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70  irty->pDirty = p
188b0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
188c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
188d0 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ->pPager->pDirty
188e0 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
188f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
18900 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
18910 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
18920 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
18930 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
18940 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
18950 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
18960 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
18970 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
18980 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
18990 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
189a0 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
189b0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
189c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
189d0 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
189e0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
189f0 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
18a00 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
18a10 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
18a20 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
18a30 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
18a40 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
18a50 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
18a60 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
18a70 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
18a80 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
18a90 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
18aa0 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
18ab0 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
18ac0 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
18ad0 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
18ae0 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
18af0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
18b00 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
18b10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
18b20 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
18b30 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
18b40 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
18b50 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
18b60 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
18b70 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
18b80 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
18b90 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
18ba0 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
18bb0 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
18bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
18bd0 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
18be0 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
18bf0 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
18c00 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61  t() or sqlite3pa
18c10 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74  ger_rollback() t
18c20 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69  o.** reset..*/.i
18c30 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
18c40 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74  write(void *pDat
18c50 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
18c60 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
18c70 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
18c80 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
18c90 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
18ca0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
18cb0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
18cc0 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
18cd0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
18ce0 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
18cf0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
18d00 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
18d10 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
18d20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18d30 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  PERM;.  }..  ass
18d40 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
18d50 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
18d60 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
18d70 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
18d80 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
18d90 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
18da0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
18db0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
18dc0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
18dd0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
18de0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b  away..  */.  mak
18df0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
18e00 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
18e10 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d  l && (pPg->inStm
18e20 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  t || pPager->stm
18e30 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
18e40 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
18e50 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ache = 1;.  }els
18e60 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
18e70 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
18e80 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
18e90 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
18ea0 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
18eb0 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
18ec0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
18ed0 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
18ee0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
18ef0 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
18f00 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
18f10 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
18f20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
18f30 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
18f40 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
18f50 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
18f60 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
18f70 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
18f80 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
18f90 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18fa0 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  e3pager_begin(pD
18fb0 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ata, 0);.    if(
18fc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18fd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
18fe0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
18ff0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
19000 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
19010 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
19020 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
19030 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
19040 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
19050 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
19060 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
19070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
19090 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
190a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
190b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
190c0 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
190d0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
190e0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
190f0 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
19100 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
19110 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
19120 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
19130 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
19140 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
19150 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
19160 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
19170 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
19180 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
19190 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
191a0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
191b0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
191c0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
191d0 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
191e0 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
191f0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45  useJournal || ME
19200 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66  MDB) ){.      if
19210 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
19220 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
19230 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
19240 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20    int szPg;.    
19250 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
19260 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73  .          PgHis
19270 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
19280 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
19290 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
192a0 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52      TRACE3("JOUR
192b0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
192c0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
192d0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
192e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
192f0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
19300 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
19310 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
19320 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
19330 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
19350 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
19360 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
19370 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
19380 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
19390 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
193a0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
193b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
193c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
193d0 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a  2 cksum, saved;.
193e0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
193f0 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20  pData2, *pEnd;. 
19400 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
19410 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
19420 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
19430 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
19440 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
19450 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
19460 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
19470 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
19480 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
19490 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
194a0 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
194b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
194c0 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
194d0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
194e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
194f0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
19500 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
19510 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
19520 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
19530 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
19540 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
19550 20 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20           pEnd = 
19560 70 44 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d  pData2 + pPager-
19570 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
19580 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34       pData2 -= 4
19590 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ;.          save
195a0 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b  d = *(u32*)pEnd;
195b0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32  .          put32
195c0 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d  bits(pEnd, cksum
195d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  );.          szP
195e0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g = pPager->page
195f0 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20  Size+8;.        
19600 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
19610 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
19620 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
19630 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
19640 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
19650 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20  2, szPg);.      
19660 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
19670 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a  nalOff += szPg;.
19680 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 34            TRACE4
19690 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
196a0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
196b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
196c0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
196d0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
196e0 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
196f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75  );.          *(u
19700 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64  32*)pEnd = saved
19710 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f  ;...  /* An erro
19720 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77 72  r has occured wr
19730 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
19740 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a  rnal file. The .
19750 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61            ** tra
19760 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
19770 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20   rolled back by 
19780 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e  the layer above.
19790 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
197a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
197b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
197c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
197d0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
197e0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
197f0 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
19800 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
19810 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
19820 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
19830 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
19840 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
19850 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
19860 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  &7);.          p
19870 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
19880 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
19890 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
198a0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
198b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
198c0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
198d0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
198e0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
198f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67  .            pag
19900 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
19910 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  st(pPg);.       
19920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
19930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19940 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
19950 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
19960 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
19970 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
19980 20 20 20 20 20 20 20 20 54 52 41 43 45 34 28 22          TRACE4("
19990 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
199a0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
199b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
199c0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
199d0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
199e0 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
199f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19a00 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
19a10 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
19a20 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
19a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
19a40 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
19a50 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
19a60 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
19a70 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
19a80 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
19a90 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
19aa0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
19ab0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
19ac0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
19ad0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
19ae0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
19af0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
19b00 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
19b10 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
19b20 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
19b30 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
19b40 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
19b50 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
19b60 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
19b70 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
19b80 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  tmtInUse && !pPg
19b90 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  ->inStmt && (int
19ba0 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
19bb0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a  er->stmtSize ){.
19bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
19bd0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
19be0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
19bf0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
19c00 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  e );.      if( M
19c10 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
19c20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
19c30 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
19c40 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
19c50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19c60 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29  Hist->pStmt==0 )
19c70 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
19c80 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  >pStmt = sqliteM
19c90 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
19ca0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
19cb0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
19cc0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
19cd0 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
19ce0 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54  ->pStmt, PGHDR_T
19cf0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
19d00 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19d10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19d20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a    TRACE3("STMT-J
19d30 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
19d40 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
19d50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
19d60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
19d70 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
19d80 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
19d90 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
19da0 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20  ->pgno, 7)-4;.  
19db0 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
19dc0 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e  pData2, pPg->pgn
19dd0 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
19de0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
19df0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44  pPager->stfd, pD
19e00 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
19e10 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20  geSize+4);.     
19e20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d     TRACE3("STMT-
19e30 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
19e40 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
19e50 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
19e60 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
19e70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19e80 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
19e90 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
19ea0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19eb0 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
19ec0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19ed0 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
19ee0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
19ef0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
19f00 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
19f10 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
19f20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f 61    }.      page_a
19f30 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
19f40 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
19f50 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
19f60 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
19f70 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
19f80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
19f90 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70  Size<(int)pPg->p
19fa0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
19fb0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
19fc0 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21  >pgno;.    if( !
19fd0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
19fe0 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47  >dbSize==PENDING
19ff0 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
1a000 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
1a010 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b  pPager->dbSize++
1a020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1a030 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a040 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
1a050 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
1a060 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1a070 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
1a080 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
1a090 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
1a0a0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1a0b0 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
1a0c0 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
1a0d0 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
1a0e0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
1a0f0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
1a100 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  UG.int sqlite3pa
1a110 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28  ger_iswriteable(
1a120 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
1a130 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
1a140 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
1a150 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  );.  return pPg-
1a160 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66  >dirty;.}.#endif
1a170 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a180 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a  _OMIT_VACUUM./*.
1a190 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
1a1a0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67  ontent of a sing
1a1b0 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65  le page with the
1a1c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
1a1d0 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67  the third.** arg
1a1e0 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
1a1f0 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77  lite3pager_overw
1a200 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
1a210 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76  er, Pgno pgno, v
1a220 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76  oid *pData){.  v
1a230 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  oid *pPage;.  in
1a240 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  t rc;..  rc = sq
1a250 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1a260 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
1a270 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
1a280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a290 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1a2a0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1a2b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a2c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a2d0 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44  memcpy(pPage, pD
1a2e0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
1a2f0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
1a300 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
1a310 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d  nref(pPage);.  }
1a320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a330 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
1a340 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1a350 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1a360 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
1a370 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1a380 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
1a390 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
1a3a0 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f  e "pgno" back to
1a3b0 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
1a3c0 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
1a3d0 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
1a3e0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a  ked as dirty..**
1a3f0 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
1a400 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
1a410 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
1a420 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
1a430 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
1a440 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
1a450 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61   unused.  The pa
1a460 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
1a470 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
1a480 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
1a490 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
1a4a0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
1a4b0 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
1a4c0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  is optimization,
1a4d0 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
1a4e0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67  he.** sqlite3pag
1a4f0 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
1a500 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
1a510 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
1a520 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
1a530 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
1a540 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
1a550 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
1a560 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
1a570 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1a580 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1a590 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
1a5a0 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
1a5b0 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
1a5c0 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
1a5d0 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
1a5e0 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
1a5f0 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
1a600 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
1a610 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
1a620 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
1a630 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
1a640 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
1a650 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
1a660 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1a670 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
1a680 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
1a690 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
1a6a0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
1a6b0 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
1a6c0 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
1a6d0 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
1a6e0 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
1a6f0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
1a700 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
1a710 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
1a720 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1a730 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
1a740 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
1a750 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
1a760 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
1a770 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1a780 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
1a790 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
1a7a0 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64  ns.** critical d
1a7b0 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
1a7c0 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
1a7d0 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63   gets rolled bac
1a7e0 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66  k in spite.** of
1a7f0 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
1a800 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f  ck() call..*/.vo
1a810 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
1a820 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72  dont_write(Pager
1a830 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
1a840 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1a850 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  Pg;..  if( MEMDB
1a860 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50   ) return;..  pP
1a870 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
1a880 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
1a890 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
1a8a0 20 29 3b 20 20 2f 2a 20 57 65 20 6e 65 76 65 72   );  /* We never
1a8b0 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f 77 72 69 74   call _dont_writ
1a8c0 65 20 75 6e 6c 65 73 73 20 74 68 65 20 70 61 67  e unless the pag
1a8d0 65 20 69 73 20 69 6e 20 6d 65 6d 20 2a 2f 0a 20  e is in mem */. 
1a8e0 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1a8f0 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20  back = 1;.  if( 
1a900 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70  pPg->dirty && !p
1a910 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1a920 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1a930 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
1a940 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
1a950 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1a960 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
1a970 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1a980 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
1a990 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
1a9a0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a9b0 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
1a9c0 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
1a9d0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1a9e0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
1a9f0 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
1aa00 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
1aa10 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
1aa20 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
1aa30 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
1aa40 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
1aa50 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
1aa60 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
1aa70 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
1aa80 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
1aa90 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
1aaa0 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
1aab0 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
1aac0 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
1aad0 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
1aae0 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
1aaf0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
1ab00 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
1ab10 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
1ab20 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
1ab30 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
1ab40 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
1ab50 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
1ab60 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1ab70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52   }else{.      TR
1ab80 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
1ab90 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
1aba0 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  ", pgno, PAGERID
1abb0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1abc0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
1abd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1abe0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
1abf0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
1ac00 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1ac10 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
1ac20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1ac30 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
1ac40 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
1ac50 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
1ac60 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1ac70 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
1ac80 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
1ac90 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
1aca0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
1acb0 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
1acc0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
1acd0 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
1ace0 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
1acf0 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
1ad00 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1ad10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ad20 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
1ad30 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ack(void *pData)
1ad40 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
1ad50 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1ad60 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
1ad70 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1ad80 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61  ager;..  if( pPa
1ad90 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1ada0 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
1adb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1adc0 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  en==0 ) return;.
1add0 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
1ade0 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
1adf0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1ae00 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72  ack || MEMDB ) r
1ae10 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
1ae20 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
1ae30 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
1ae40 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
1ae50 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
1ae60 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
1ae70 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
1ae80 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1ae90 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
1aea0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1aeb0 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  o&7);.    pPg->i
1aec0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
1aed0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1aee0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
1aef0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1af00 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1af10 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1af20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  );.      page_ad
1af30 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1af40 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  Pg);.    }.    T
1af50 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE3("DONT_ROLL
1af60 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20  BACK page %d of 
1af70 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
1af80 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1af90 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ));.  }.  if( pP
1afa0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1afb0 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
1afc0 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
1afd0 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
1afe0 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
1aff0 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1b000 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
1b010 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1b020 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
1b030 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1b040 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
1b050 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1b060 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1b070 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1b080 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74  ;.    page_add_t
1b090 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1b0a0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
1b0b0 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67  Commit all chang
1b0c0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1b0d0 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  se and release t
1b0e0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a  he write lock..*
1b0f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d  *.** If the comm
1b100 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  it fails for any
1b110 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62   reason, a rollb
1b120 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d  ack attempt is m
1b130 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ade.** and an er
1b140 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1b150 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f  rned.  If the co
1b160 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c  mmit worked, SQL
1b170 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
1b180 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
1b190 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
1b1a0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
1b1b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
1b1c0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
1b1d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1b1e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1b1f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1b200 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1b210 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
1b220 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
1b230 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1b240 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28  R;.  }.  TRACE2(
1b250 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
1b260 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1b270 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1b280 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1b290 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1b2a0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1b2b0 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
1b2c0 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
1b2d0 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
1b2e0 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
1b2f0 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
1b300 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1b310 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
1b320 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
1b330 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1b340 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1b350 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
1b360 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
1b370 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1b380 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
1b390 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  y;.    }.    pPa
1b3a0 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
1b3b0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1b3c0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
1b3d0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
1b3e0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
1b3f0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
1b400 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1b410 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1b420 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
1b430 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
1b440 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
1b450 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
1b460 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
1b470 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
1b480 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
1b490 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
1b4a0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
1b4b0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1b4c0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
1b4d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b4e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1b4f0 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
1b500 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ache==0 ){.    /
1b510 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69  * Exit early (wi
1b520 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20  thout doing the 
1b530 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73  time-consuming s
1b540 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63  qlite3OsSync() c
1b550 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20  alls).    ** if 
1b560 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
1b570 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  no changes to th
1b580 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b590 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1b5a0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1b5b0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
1b5c0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1b5d0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
1b5e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1b5f0 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
1b600 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
1b610 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b620 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
1b630 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
1b640 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
1b650 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b660 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1b670 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1b680 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
1b690 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1b6a0 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
1b6b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
1b6c0 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
1b6d0 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
1b6e0 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
1b6f0 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
1b700 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
1b710 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
1b720 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
1b730 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
1b740 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
1b750 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
1b760 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1b770 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
1b780 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
1b790 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
1b7a0 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
1b7b0 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
1b7c0 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51  ing protocol (SQ
1b7d0 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f  LITE_PROTOCOL) o
1b7e0 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
1b7f0 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
1b800 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
1b810 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1b820 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
1b830 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
1b840 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
1b850 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
1b860 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
1b870 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
1b880 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
1b890 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
1b8a0 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
1b8b0 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
1b8c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1b8d0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1b8e0 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
1b8f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1b900 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41  .  int rc;.  TRA
1b910 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE2("ROLLBACK %d
1b920 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1b930 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
1b940 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
1b950 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50  *p;.    for(p=pP
1b960 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
1b970 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
1b980 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1b990 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73  pHist;.      ass
1b9a0 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52  ert( !p->alwaysR
1b9b0 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
1b9c0 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29   if( !p->dirty )
1b9d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1b9e0 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
1b9f0 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
1ba00 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69  , pPager))->pOri
1ba10 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
1ba20 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
1ba30 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
1ba40 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
1ba50 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
1ba60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ba70 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d  }..      pHist =
1ba80 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1ba90 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1baa0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
1bab0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  g ){.        mem
1bac0 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
1bad0 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72  A(p), pHist->pOr
1bae0 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ig, pPager->page
1baf0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54  Size);.        T
1bb00 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d  RACE3("ROLLBACK-
1bb10 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22  PAGE %d of %d\n"
1bb20 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
1bb30 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1bb40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bb50 20 20 54 52 41 43 45 33 28 22 50 41 47 45 20 25    TRACE3("PAGE %
1bb60 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64  d is clean on %d
1bb70 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
1bb80 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1bb90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
1bba0 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74  earHistory(pHist
1bbb0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74  );.      p->dirt
1bbc0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
1bbd0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
1bbe0 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d       p->inStmt =
1bbf0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   0;.      p->pPr
1bc00 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78  evStmt = p->pNex
1bc10 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
1bc20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
1bc30 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
1bc40 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1bc50 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
1bc60 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  A(p), pPager->pa
1bc70 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
1bc80 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
1bc90 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
1bca0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
1bcb0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1bcc0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
1bcd0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20  r->origDbSize;. 
1bce0 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
1bcf0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
1bd00 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1bd10 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1bd20 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1bd30 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
1bd40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1bd50 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
1bd60 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
1bd70 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1bd80 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
1bd90 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
1bda0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1bdb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1bdc0 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
1bdd0 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rc;.  }..  if( p
1bde0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
1bdf0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1be00 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
1be10 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
1be20 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
1be30 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
1be40 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
1be50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1be60 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1be70 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1be80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1be90 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
1bea0 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  VED ){.    int r
1beb0 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c2;.    rc = pag
1bec0 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
1bed0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32  pPager);.    rc2
1bee0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
1bef0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1bf00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bf10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1bf20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
1bf30 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
1bf40 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
1bf50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61  ager);.  }.  pPa
1bf60 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1bf70 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
1bf80 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
1bf90 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65  g a ROLLBACK, we
1bfa0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74   can no longer t
1bfb0 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20  rust the pager. 
1bfc0 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
1bfd0 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
1bfe0 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
1bff0 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
1c000 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65  r .  ** persiste
1c010 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  nt..  */.  retur
1c020 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1c030 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
1c040 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1c050 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1c060 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
1c070 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
1c080 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
1c090 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
1c0a0 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
1c0b0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
1c0c0 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e  e3pager_isreadon
1c0d0 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
1c0e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1c0f0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
1c100 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1c110 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
1c120 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
1c130 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
1c140 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t *sqlite3pager_
1c150 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  stats(Pager *pPa
1c160 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
1c170 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
1c180 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
1c190 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
1c1a0 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
1c1b0 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
1c1c0 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
1c1d0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
1c1e0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
1c1f0 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
1c200 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 23 69 66  er->errCode;.#if
1c210 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1c220 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
1c230 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
1c240 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
1c250 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[8] = pPager->
1c260 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20  nOvfl;.  a[9] = 
1c270 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
1c280 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
1c290 3e 6e 57 72 69 74 65 3b 0a 23 65 6e 64 69 66 0a  >nWrite;.#endif.
1c2a0 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f    return a;.}../
1c2b0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
1c2c0 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
1c2d0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
1c2e0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
1c2f0 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
1c300 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c310 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
1c320 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
1c330 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1c340 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
1c350 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
1c360 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
1c370 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
1c380 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
1c390 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
1c3a0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
1c3b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1c3c0 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  mt_begin(Pager *
1c3d0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1c3e0 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  c;.  char zTemp[
1c3f0 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
1c400 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28  SIZE];.  assert(
1c410 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
1c420 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
1c430 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
1c440 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22  =0 );.  TRACE2("
1c450 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
1c460 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c470 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1c480 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
1c490 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
1c4a0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
1c4b0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1c4c0 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
1c4d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c4e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
1c4f0 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
1c500 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1c510 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
1c520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c530 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1c540 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1c550 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  en );.  pPager->
1c560 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  aInStmt = sqlite
1c570 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
1c580 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
1c590 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
1c5a0 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
1c5b0 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  /* sqlite3OsLock
1c5c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
1c5d0 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20  RED_LOCK); */.  
1c5e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c5f0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64  NOMEM;.  }.#ifnd
1c600 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d  ef NDEBUG.  rc =
1c610 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1c620 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1c630 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69  &pPager->stmtJSi
1c640 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
1c650 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
1c660 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74  failed;.  assert
1c670 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  ( pPager->stmtJS
1c680 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a  ize == pPager->j
1c690 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e  ournalOff );.#en
1c6a0 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  dif.  pPager->st
1c6b0 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
1c6c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
1c6d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1c6e0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1c6f0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
1c700 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
1c710 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
1c720 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
1c730 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
1c740 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
1c750 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c760 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
1c770 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e  zTemp, &pPager->
1c780 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  stfd);.    if( r
1c790 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
1c7a0 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
1c7b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1c7c0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1c7d0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
1c7e0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
1c7f0 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
1c800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c810 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
1c820 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
1c830 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
1c840 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
1c850 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
1c860 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1c870 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
1c880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c890 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
1c8a0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
1c8b0 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1c8c0 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
1c8d0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
1c8e0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1c8f0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
1c900 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52  , *pNext;.    TR
1c910 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE2("STMT-COMMI
1c920 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
1c930 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
1c940 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
1c950 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
1c960 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
1c970 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  );.      /* sqli
1c980 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
1c990 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20  ager->stfd, 0); 
1c9a0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
1c9b0 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
1c9c0 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
1c9d0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
1c9e0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1c9f0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
1ca00 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  mt; pPg; pPg=pNe
1ca10 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74  xt){.      pNext
1ca20 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1ca30 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1ca40 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a   pPg->inStmt );.
1ca50 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
1ca60 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
1ca70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
1ca80 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
1ca90 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
1caa0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
1cab0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1cac0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1cad0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1cae0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1caf0 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
1cb00 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1cb10 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
1cb20 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1cb30 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
1cb40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1cb50 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
1cb60 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1cb70 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1cb80 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
1cb90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1cba0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
1cbb0 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
1cbc0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1cbd0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f  te3pager_stmt_ro
1cbe0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
1cbf0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1cc00 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1cc10 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1cc20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c  TRACE2("STMT-ROL
1cc30 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
1cc40 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1cc50 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1cc60 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
1cc70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
1cc80 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
1cc90 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1cca0 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
1ccb0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1ccc0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1ccd0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1cce0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1ccf0 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
1cd00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
1cd10 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1cd20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
1cd30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1cd40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1cd50 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
1cd60 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
1cd70 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
1cd80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cd90 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1cda0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
1cdb0 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20  r->stmtSize;.   
1cdc0 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
1cdd0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
1cde0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cdf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ce00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
1ce10 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
1ce20 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
1ce30 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1ce40 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  commit(pPager);.
1ce50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1ce60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1ce70 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
1ce80 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
1ce90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cea0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
1ceb0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1cec0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ced0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1cee0 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69  *sqlite3pager_fi
1cef0 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
1cf00 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1cf10 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1cf20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
1cf30 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
1cf40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1cf50 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1cf60 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1cf70 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72  er_dirname(Pager
1cf80 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1cf90 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
1cfa0 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
1cfb0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
1cfc0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
1cfd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
1cfe0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1cff0 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e  lite3pager_journ
1d000 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
1d010 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1d020 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1d030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d040 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
1d050 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
1d060 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
1d070 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
1d080 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
1d090 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
1d0a0 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
1d0b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6e 6f 73  sqlite3pager_nos
1d0c0 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
1d0d0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1d0e0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
1d0f0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
1d100 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
1d110 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
1d120 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65  e3pager_set_code
1d130 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
1d140 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
1d150 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
1d160 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
1d170 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
1d180 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
1d190 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
1d1a0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
1d1b0 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
1d1c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1d1d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
1d1e0 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64   increment the d
1d1f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
1d200 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20  nge-counter,.** 
1d210 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32  stored at byte 2
1d220 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  4 of the pager f
1d230 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1d240 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
1d250 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
1d260 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f  r *pPager){.  vo
1d270 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48  id *pPage;.  PgH
1d280 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
1d290 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1d2a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
1d2b0 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
1d2c0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
1d2d0 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d  iting. */.  rc =
1d2e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1d2f0 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
1d300 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1d310 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1d320 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
1d330 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1d340 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
1d350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1d360 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
1d370 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74  Read the current
1d380 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32   value at byte 2
1d390 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d  4. */.  pPgHdr =
1d3a0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1d3b0 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f  Page);.  change_
1d3c0 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65  counter = retrie
1d3d0 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72 2c  ve32bits(pPgHdr,
1d3e0 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72   24);..  /* Incr
1d3f0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1d400 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1d410 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1d420 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1d430 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
1d440 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1d450 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
1d460 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68  (pPgHdr))+24, ch
1d470 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
1d480 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
1d490 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
1d4a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67   */.  sqlite3pag
1d4b0 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
1d4c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d4d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
1d4e0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1d4f0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
1d500 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
1d510 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
1d520 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
1d530 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1d540 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1d550 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1d560 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
1d570 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
1d580 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
1d590 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
1d5a0 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
1d5b0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
1d5c0 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
1d5d0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
1d5e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1d5f0 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
1d600 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1d610 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74  synced, all dirt
1d620 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  y pages written.
1d630 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
1d640 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
1d650 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
1d660 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74  nced. The only t
1d670 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d  hing that.** rem
1d680 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
1d690 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
1d6a0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
1d6b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
1d6c0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1d6d0 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
1d6e0 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
1d6f0 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
1d700 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
1d710 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
1d720 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
1d730 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
1d740 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  n sqlite3pager_s
1d750 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  ync() call..**.*
1d760 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
1d770 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Trunc is non-zer
1d780 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  o, then the page
1d790 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  r file is trunca
1d7a0 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63  ted to.** nTrunc
1d7b0 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20   pages (this is 
1d7c0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
1d7d0 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a  uum databases)..
1d7e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1d7f0 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a  ger_sync(Pager *
1d800 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
1d810 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e  ar *zMaster, Pgn
1d820 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74  o nTrunc){.  int
1d830 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d840 0a 0a 20 20 54 52 41 43 45 34 28 22 44 41 54 41  ..  TRACE4("DATA
1d850 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
1d860 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
1d870 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
1d880 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
1d890 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
1d8a0 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  Trunc);..  /* If
1d8b0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1d8c0 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
1d8d0 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
1d8e0 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
1d8f0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1d900 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1d910 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
1d920 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1d930 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1d940 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
1d950 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
1d960 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1d970 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1d980 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Pg;.    assert( 
1d990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d9a0 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  pen );..    /* I
1d9b0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1d9c0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
1d9d0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1d9e0 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20  itten to the.   
1d9f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
1da00 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69  , then no sync i
1da10 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  s required. This
1da20 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74   happens when it
1da30 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   is.    ** writt
1da40 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  en, then the pro
1da50 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70  cess fails to up
1da60 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
1da70 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20  ERVED to an.    
1da80 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
1da90 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65  k. The next time
1daa0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69   the process tri
1dab0 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  es to commit the
1dac0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1dad0 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65  ion the m-j name
1dae0 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
1daf0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e  dy been written.
1db00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1db10 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
1db20 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  er ){.      rc =
1db30 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1db40 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
1db50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1db60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1db70 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66  o sync_exit;.#if
1db80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1db90 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1dba0 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
1dbb0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
1dbc0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1dbd0 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
1dbe0 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
1dbf0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
1dc00 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67          ** being
1dc10 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
1dc20 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
1dc30 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
1dc40 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1dc50 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
1dc60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1dc70 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20  Pgno i;.        
1dc80 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20  void *pPage;.   
1dc90 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d       int iSkip =
1dca0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
1dcb0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1dcc0 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b  for( i=nTrunc+1;
1dcd0 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67   i<=pPager->orig
1dce0 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20  DbSize; i++ ){. 
1dcf0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
1dd00 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1dd10 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26  l[i/8] & (1<<(i&
1dd20 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70  7))) && i!=iSkip
1dd30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dd40 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1dd50 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 69 2c  r_get(pPager, i,
1dd60 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
1dd70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1dd80 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1dd90 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1dda0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ddb0 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
1ddc0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1ddd0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
1dde0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
1ddf0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1de00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1de10 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1de20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1de30 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   } .      }.#end
1de40 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  if.      rc = wr
1de50 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
1de60 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1de70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1de80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1de90 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1dea0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
1deb0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1dec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ded0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1dee0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69  _exit;.    }..#i
1def0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1df00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1df10 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1df20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1df30 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
1df40 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
1df50 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
1df60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1df70 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1df80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1df90 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
1dfa0 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
1dfb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1dfc0 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
1dfd0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
1dfe0 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
1dff0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1e000 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
1e010 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e020 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1e030 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  ync_exit;..    /
1e040 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
1e050 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
1e060 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
1e070 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
1e080 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1e090 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b  (pPager->fd, 0);
1e0a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
1e0b0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1e0c0 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73  R_SYNCED;.  }els
1e0d0 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e  e if( MEMDB && n
1e0e0 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1e0f0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1e100 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
1e110 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a  r, nTrunc);.  }.
1e120 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65  .sync_exit:.  re
1e130 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1e140 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e150 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
1e160 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 69   Move the page i
1e170 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 61  dentified by pDa
1e180 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  ta to location p
1e190 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
1e1a0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75   .**.** There mu
1e1b0 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
1e1c0 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72 65  ces to the curre
1e1d0 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66  nt page pgno. If
1e1e0 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a   current page.**
1e1f0 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
1e200 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  eady in the roll
1e210 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
1e220 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
1e230 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74  there by.** by t
1e240 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65  his routine. The
1e250 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f   same applies to
1e260 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61 20   the page pData 
1e270 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74  refers to on ent
1e280 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ry to.** this ro
1e290 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
1e2a0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
1e2b0 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  age refered to b
1e2c0 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76  y pData remain v
1e2d0 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
1e2e0 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
1e2f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e300 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e  page pData (i.e.
1e310 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
1e320 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
1e330 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
1e340 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
1e350 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
1e360 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1e370 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
1e380 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1e390 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
1e3a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e3b0 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
1e3c0 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
1e3d0 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
1e3e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
1e3f0 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
1e400 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
1e410 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
1e420 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
1e430 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
1e440 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
1e450 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
1e460 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
1e470 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tive)..*/.int sq
1e480 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70  lite3pager_movep
1e490 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
1e4a0 72 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  r, void *pData, 
1e4b0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1e4c0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
1e4d0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
1e4e0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
1e4f0 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67  ; .  int h;.  Pg
1e500 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  no needSyncPgno 
1e510 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1e520 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
1e530 20 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25    TRACE5("MOVE %
1e540 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
1e550 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
1e560 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
1e570 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1e580 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
1e590 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b  needSync, pgno);
1e5a0 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  ..  if( pPg->nee
1e5b0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65  dSync ){.    nee
1e5c0 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
1e5d0 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
1e5e0 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1e5f0 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
1e600 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20   pPg->dirty );. 
1e610 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e620 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
1e630 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
1e640 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
1e650 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e  sh-chain */.  un
1e660 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
1e670 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f  ager, pPg);..  /
1e680 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63  * If the cache c
1e690 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77  ontains a page w
1e6a0 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ith page-number 
1e6b0 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a  pgno, remove it.
1e6c0 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68    ** from it's h
1e6d0 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
1e6e0 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
1e6f0 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
1e700 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
1e710 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
1e720 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
1e730 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
1e740 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
1e750 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
1e760 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
1e770 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
1e780 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1e790 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
1e7a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e7b0 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
1e7c0 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
1e7d0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
1e7e0 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65  PgOld);.    make
1e7f0 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20  Clean(pPgOld);. 
1e800 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e     if( pPgOld->n
1e810 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
1e820 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
1e830 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  >inJournal );.  
1e840 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1e850 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  al = 1;.      pP
1e860 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  g->needSync = 1;
1e870 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e880 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1e890 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1e8a0 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  /* Change the pa
1e8b0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50  ge number for pP
1e8c0 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  g and insert it 
1e8d0 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73  into the new has
1e8e0 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 70 50  h-chain. */.  pP
1e8f0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
1e900 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50    h = pgno & (pP
1e910 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
1e920 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
1e930 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
1e940 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
1e950 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
1e960 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
1e970 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
1e980 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
1e990 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
1e9a0 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
1e9b0 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
1e9c0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
1e9d0 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
1e9e0 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44  sh = 0;..  makeD
1e9f0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
1ea00 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1ea10 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
1ea20 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
1ea30 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
1ea40 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
1ea50 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1ea60 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
1ea70 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
1ea80 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
1ea90 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1eaa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1eab0 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
1eac0 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
1ead0 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
1eae0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
1eaf0 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
1eb00 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
1eb10 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  aInJournal bit h
1eb20 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
1eb30 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
1eb40 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
1eb50 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
1eb60 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
1eb70 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
1eb80 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
1eb90 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
1eba0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
1ebb0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
1ebc0 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
1ebd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
1ebe0 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
1ebf0 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
1ec00 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
1ec10 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
1ec20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
1ec30 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64 53      void *pNeedS
1ec40 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ync;.    assert(
1ec50 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1ec60 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
1ec70 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1ec80 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
1ec90 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63 29  gno, &pNeedSync)
1eca0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ecb0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1ecc0 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
1ecd0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1ece0 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52     DATA_TO_PGHDR
1ecf0 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65  (pNeedSync)->nee
1ed00 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44  dSync = 1;.    D
1ed10 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
1ed20 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e  edSync)->inJourn
1ed30 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65  al = 1;.    make
1ed40 44 69 72 74 79 28 44 41 54 41 5f 54 4f 5f 50 47  Dirty(DATA_TO_PG
1ed50 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29 29 3b  HDR(pNeedSync));
1ed60 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
1ed70 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79 6e  r_unref(pNeedSyn
1ed80 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
1ed90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1eda0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1edb0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1edc0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1edd0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
1ede0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
1edf0 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66  t state of the f
1ee00 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65  ile lock for the
1ee10 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
1ee20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1ee30 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c  e is one of NO_L
1ee40 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  OCK, SHARED_LOCK
1ee50 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c  , RESERVED_LOCK,
1ee60 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  .** PENDING_LOCK
1ee70 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  , or EXCLUSIVE_L
1ee80 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  OCK..*/.int sqli
1ee90 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61  te3pager_locksta
1eea0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
1eeb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1eec0 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70  te3OsLockState(p
1eed0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65  Pager->fd);.}.#e
1eee0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1eef0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1ef00 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
1ef10 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
1ef20 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
1ef30 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
1ef40 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
1ef50 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20  r_refdump(Pager 
1ef60 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
1ef70 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50  r *pPg;.  for(pP
1ef80 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
1ef90 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
1efa0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28  extAll){.    if(
1efb0 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20   pPg->nRef<=0 ) 
1efc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71  continue;.    sq
1efd0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1efe0 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d  ("PAGE %3d addr=
1eff0 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a  %p nRef=%d\n", .
1f000 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
1f010 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1f020 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29  pPg), pPg->nRef)
1f030 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
1f040 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1f050 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.