/ Hex Artifact Content
Login

Artifact bb0891d49b9068711e4b8bab14db2959f56f5be9:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 31 20 44 2e 20 52 69 63 68  (c) 2001 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61  lic.** License a
00b0: 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 20 74  s published by t
00c0: 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 72 65  he Free Software
00d0: 20 46 6f 75 6e 64 61 74 69 6f 6e 3b 20 65 69 74   Foundation; eit
00e0: 68 65 72 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 32  her.** version 2
00f0: 20 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c   of the License,
0100: 20 6f 72 20 28 61 74 20 79 6f 75 72 20 6f 70 74   or (at your opt
0110: 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 76  ion) any later v
0120: 65 72 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ersion..**.** Th
0130: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0140: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0150: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0160: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a  ll be useful,.**
0170: 20 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59   but WITHOUT ANY
0180: 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f   WARRANTY; witho
0190: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
01a0: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
01b0: 2a 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49  ** MERCHANTABILI
01c0: 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f  TY or FITNESS FO
01d0: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
01e0: 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65  URPOSE.  See the
01f0: 20 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20   GNU.** General 
0200: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66  Public License f
0210: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e  or more details.
0220: 0a 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75  .** .** You shou
0230: 6c 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64  ld have received
0240: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47   a copy of the G
0250: 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69  NU General Publi
0260: 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f  c.** License alo
0270: 6e 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62  ng with this lib
0280: 72 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72  rary; if not, wr
0290: 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72  ite to the.** Fr
02a0: 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e  ee Software Foun
02b0: 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39  dation, Inc., 59
02c0: 20 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20   Temple Place - 
02d0: 53 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f  Suite 330,.** Bo
02e0: 73 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d  ston, MA  02111-
02f0: 31 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a  1307, USA..**.**
0300: 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20   Author contact 
0310: 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20  information:.** 
0320: 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a    drh@hwaci.com.
0330: 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e  **   http://www.
0340: 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a  hwaci.com/drh/.*
0350: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
03a0: 68 69 73 20 69 73 20 74 68 65 20 69 6d 70 6c 65  his is the imple
03b0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
03c0: 20 70 61 67 65 20 63 61 63 68 65 20 73 75 62 73   page cache subs
03d0: 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ystem..** .** Th
03e0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
03f0: 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 61  used to access a
0400: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
0410: 20 54 68 65 20 70 61 67 65 72 20 6a 6f 75 72 6e   The pager journ
0420: 61 6c 73 0a 2a 2a 20 61 6c 6c 20 77 72 69 74 65  als.** all write
0430: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 75  s in order to su
0440: 70 70 6f 72 74 20 72 6f 6c 6c 62 61 63 6b 2e 20  pport rollback. 
0450: 20 4c 6f 63 6b 69 6e 67 20 69 73 20 75 73 65 64   Locking is used
0460: 20 74 6f 20 6c 69 6d 69 74 0a 2a 2a 20 61 63 63   to limit.** acc
0470: 65 73 73 20 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  ess to one or mo
0480: 72 65 20 72 65 61 64 65 72 20 6f 72 20 74 6f 20  re reader or to 
0490: 6f 6e 65 20 77 72 69 74 65 72 2e 0a 2a 2a 0a 2a  one writer..**.*
04a0: 2a 20 40 28 23 29 20 24 49 64 3a 20 70 61 67 65  * @(#) $Id: page
04b0: 72 2e 63 2c 76 20 31 2e 31 38 20 32 30 30 31 2f  r.c,v 1.18 2001/
04c0: 30 39 2f 31 34 20 31 38 3a 35 34 3a 30 39 20 64  09/14 18:54:09 d
04d0: 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  rh Exp $.*/.#inc
04e0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
04f0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67  h".#include "pag
0500: 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  er.h".#include <
0510: 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64  fcntl.h>.#includ
0520: 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23  e <sys/stat.h>.#
0530: 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e  include <unistd.
0540: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
0550: 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ert.h>.#include 
0560: 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a  <string.h>../*.*
0570: 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65  * The page cache
0580: 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61   as a whole is a
0590: 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20  lways in one of 
05a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
05b0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
05c0: 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 20   SQLITE_UNLOCK  
05d0: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
05e0: 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  che is not curre
05f0: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
0600: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0610: 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e            writin
0620: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
0630: 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ile.  There is n
0640: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
0650: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
0660: 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  held in memory. 
0670: 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   This is the ini
0680: 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  tial.**         
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
06a0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  ate..**.**   SQL
06b0: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 20 20 20  ITE_READLOCK    
06c0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
06d0: 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  is reading the d
06e0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74    Writing is not
0710: 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65   permitted.  The
0720: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20  re can be.**    
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64     multiple read
0750: 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68  ers accessing th
0760: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a  e same database.
0770: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0780: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74           file at
0790: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
07a0: 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 57  **.**   SQLITE_W
07b0: 52 49 54 45 4c 4f 43 4b 20 20 20 20 54 68 65 20  RITELOCK    The 
07c0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 77 72  page cache is wr
07d0: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
07e0: 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se..**          
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 63 63               Acc
0800: 65 73 73 20 69 73 20 65 78 63 6c 75 73 69 76 65  ess is exclusive
0810: 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63  .  No other proc
0820: 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20  esses or.**     
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 20 74 68 72 65 61 64 73 20 63 61 6e 20 62 65    threads can be
0850: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
0860: 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a  ing while one.**
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 20 69         process i
0890: 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s writing..**.**
08a0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
08b0: 63 6f 6d 65 73 20 75 70 20 69 6e 20 53 51 4c 49  comes up in SQLI
08c0: 54 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  TE_UNLOCK.  The 
08d0: 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20  first time a.** 
08e0: 73 71 6c 69 74 65 5f 70 61 67 65 5f 67 65 74 28  sqlite_page_get(
08f0: 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74  ) occurs, the st
0900: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0910: 74 6f 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f  to SQLITE_READLO
0920: 43 4b 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c  CK..** After all
0930: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0940: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
0950: 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65  sqlite_page_unre
0960: 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74  f(),.** the stat
0970: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61  e transitions ba
0980: 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 55 4e 4c  ck to SQLITE_UNL
0990: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
09a0: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
09b0: 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29  ite_page_write()
09c0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
09d0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
09e0: 73 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 57  s to.** SQLITE_W
09f0: 52 49 54 45 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65  RITELOCK.  (Note
0a00: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0a10: 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e  e_write() can on
0a20: 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20  ly be.** called 
0a30: 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  on an outstandin
0a40: 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61  g page which mea
0a50: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
0a60: 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20  r must.** be in 
0a70: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20  SQLITE_READLOCK 
0a80: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
0a90: 74 69 6f 6e 73 20 74 6f 20 53 51 4c 49 54 45 5f  tions to SQLITE_
0aa0: 57 52 49 54 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54  WRITELOCK.).** T
0ab0: 68 65 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 72  he sqlite_page_r
0ac0: 6f 6c 6c 62 61 63 6b 28 29 20 61 6e 64 20 73 71  ollback() and sq
0ad0: 6c 69 74 65 5f 70 61 67 65 5f 63 6f 6d 6d 69 74  lite_page_commit
0ae0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a  () functions .**
0af0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20   transition the 
0b00: 73 74 61 74 65 20 66 72 6f 6d 20 53 51 4c 49 54  state from SQLIT
0b10: 45 5f 57 52 49 54 45 4c 4f 43 4b 20 62 61 63 6b  E_WRITELOCK back
0b20: 20 74 6f 20 53 51 4c 49 54 45 5f 52 45 41 44 4c   to SQLITE_READL
0b30: 4f 43 4b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  OCK..*/.#define 
0b40: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20  SQLITE_UNLOCK   
0b50: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 51 4c     0.#define SQL
0b60: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 20 20 20  ITE_READLOCK    
0b70: 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  1.#define SQLITE
0b80: 5f 57 52 49 54 45 4c 4f 43 4b 20 20 20 32 0a 0a  _WRITELOCK   2..
0b90: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d  ./*.** Each in-m
0ba0: 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61  emory image of a
0bb0: 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74   page begins wit
0bc0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
0bd0: 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20  header..** This 
0be0: 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76  header is only v
0bf0: 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70  isible to this p
0c00: 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68  ager module.  Th
0c10: 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65  e client.** code
0c20: 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65   that calls page
0c30: 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20  r sees only the 
0c40: 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
0c50: 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f  s the header..*/
0c60: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0c70: 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74 72  PgHdr PgHdr;.str
0c80: 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61  uct PgHdr {.  Pa
0c90: 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0cb0: 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68 69  The pager to whi
0cc0: 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65 6c  ch this page bel
0cd0: 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ongs */.  Pgno p
0ce0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
0cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d00: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
0d10: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
0d20: 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c  gHdr *pNextHash,
0d30: 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a   *pPrevHash;  /*
0d40: 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   Hash collision 
0d50: 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e  chain for PgHdr.
0d60: 70 67 6e 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  pgno */.  int nR
0d70: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
0d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0d90: 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74  er of users of t
0da0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
0db0: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
0dc0: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
0dd0: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
0de0: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
0df0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
0e00: 74 41 6c 6c 2c 20 2a 70 50 72 65 76 41 6c 6c 3b  tAll, *pPrevAll;
0e10: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
0e20: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
0e30: 63 68 61 72 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20  char inJournal; 
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0e50: 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65  * TRUE if has be
0e60: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  en written to jo
0e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 63 68 61 72 20  urnal */.  char 
0e80: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
0e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
0ea0: 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  E if we need to 
0eb0: 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67  write back chang
0ec0: 65 73 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54  es */.  /* SQLIT
0ed0: 45 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65  E_PAGE_SIZE byte
0ee0: 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66  s of page data f
0ef0: 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65  ollow this heade
0f00: 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e  r */.  /* Pager.
0f10: 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
0f20: 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f  local data follo
0f30: 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  w the page data 
0f40: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  */.};../*.** Con
0f50: 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74  vert a pointer t
0f60: 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61  o a PgHdr into a
0f70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20   pointer to its 
0f80: 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b  data.** and back
0f90: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69   again..*/.#defi
0fa0: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ne PGHDR_TO_DATA
0fb0: 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28  (P)  ((void*)(&(
0fc0: 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20  P)[1])).#define 
0fd0: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29  DATA_TO_PGHDR(D)
0fe0: 20 20 28 26 28 28 50 67 48 64 72 2a 29 28 44 29    (&((PgHdr*)(D)
0ff0: 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50  )[-1]).#define P
1000: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29  GHDR_TO_EXTRA(P)
1010: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
1020: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c  *)(&(P)[1]))[SQL
1030: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a  ITE_PAGE_SIZE]).
1040: 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74  ./*.** How big t
1050: 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
1060: 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c  table used for l
1070: 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72  ocating in-memor
1080: 79 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61  y pages.** by pa
1090: 67 65 20 6e 75 6d 62 65 72 2e 20 20 4b 6e 75 74  ge number.  Knut
10a0: 68 20 73 61 79 73 20 74 68 69 73 20 73 68 6f 75  h says this shou
10b0: 6c 64 20 62 65 20 61 20 70 72 69 6d 65 20 6e 75  ld be a prime nu
10c0: 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mber..*/.#define
10d0: 20 4e 5f 50 47 5f 48 41 53 48 20 39 30 37 0a 0a   N_PG_HASH 907..
10e0: 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67  /*.** A open pag
10f0: 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e  e cache is an in
1100: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1110: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1120: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  e..*/.struct Pag
1130: 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  er {.  char *zFi
1140: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
1150: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1160: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1170: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
1180: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
1190: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
11a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
11b0: 20 20 69 6e 74 20 66 64 2c 20 6a 66 64 3b 20 20    int fd, jfd;  
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
11e0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
11f0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
1200: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
1210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1220: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1230: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
1240: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
1250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
1260: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
1270: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
1280: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
12b0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
12c0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
12d0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  /.  void (*xDest
12e0: 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 29 3b 20  ructor)(void*); 
12f0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
1300: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
1310: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  g pages */.  int
1320: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1330: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1340: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  l number of in-m
1350: 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20  emory pages */. 
1360: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1380: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  Number of in-mem
1390: 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50  ory pages with P
13a0: 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20  gHdr.nRef>0 */. 
13b0: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
13e0: 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20  f pages to hold 
13f0: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e  in cache */.  in
1400: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e  t nHit, nMiss, n
1410: 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63  Ovfl;     /* Cac
1420: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67  he hits, missing
1430: 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c  , and LRU overfl
1440: 6f 77 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ows */.  unsigne
1450: 64 20 63 68 61 72 20 73 74 61 74 65 3b 20 20 20  d char state;   
1460: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 55       /* SQLITE_U
1470: 4e 4c 4f 43 4b 2c 20 5f 52 45 41 44 4c 4f 43 4b  NLOCK, _READLOCK
1480: 20 6f 72 20 5f 57 52 49 54 45 4c 4f 43 4b 20 2a   or _WRITELOCK *
1490: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
14a0: 72 20 65 72 72 4d 61 73 6b 3b 20 20 20 20 20 20  r errMask;      
14b0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
14c0: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
14d0: 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
14e0: 63 68 61 72 20 74 65 6d 70 46 69 6c 65 3b 20 20  char tempFile;  
14f0: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
1500: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
1510: 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ile */.  unsigne
1520: 64 20 63 68 61 72 20 72 65 61 64 4f 6e 6c 79 3b  d char readOnly;
1530: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1540: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1550: 61 62 61 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67  abase */.  unsig
1560: 6e 65 64 20 63 68 61 72 20 6e 65 65 64 53 79 6e  ned char needSyn
1570: 63 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  c;     /* True i
1580: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
1590: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
15a0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  urnal */.  unsig
15b0: 6e 65 64 20 63 68 61 72 20 2a 61 49 6e 4a 6f 75  ned char *aInJou
15c0: 72 6e 61 6c 3b 20 20 2f 2a 20 4f 6e 65 20 62 69  rnal;  /* One bi
15d0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
15e0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
15f0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  file */.  PgHdr 
1600: 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b  *pFirst, *pLast;
1610: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1620: 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20   free pages */. 
1630: 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20   PgHdr *pAll;   
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1650: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  List of all page
1660: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48  s */.  PgHdr *aH
1670: 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20  ash[N_PG_HASH]; 
1680: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
1690: 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d   to map page num
16a0: 62 65 72 20 6f 66 20 50 67 48 64 72 20 2a 2f 0a  ber of PgHdr */.
16b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  };../*.** These 
16c0: 61 72 65 20 62 69 74 73 20 74 68 61 74 20 63 61  are bits that ca
16d0: 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61 67 65  n be set in Page
16e0: 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64  r.errMask..*/.#d
16f0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
1700: 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f  FULL     0x01  /
1710: 2a 20 61 20 77 72 69 74 65 28 29 20 66 61 69 6c  * a write() fail
1720: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ed */.#define PA
1730: 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20  GER_ERR_MEM     
1740: 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63   0x02  /* malloc
1750: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65  () failed */.#de
1760: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c  fine PAGER_ERR_L
1770: 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a  OCK     0x04  /*
1780: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f   error in the lo
1790: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a  cking protocol *
17a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
17b0: 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30  ERR_CORRUPT  0x0
17c0: 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f  8  /* database o
17d0: 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  r journal corrup
17e0: 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  tion */../*.** T
17f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1800: 63 6f 6e 74 61 69 6e 73 20 70 61 67 65 20 72 65  contains page re
1810: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 66 6f 6c  cords in the fol
1820: 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72 6d 61 74  lowing.** format
1830: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1840: 75 63 74 20 50 61 67 65 52 65 63 6f 72 64 20 50  uct PageRecord P
1850: 61 67 65 52 65 63 6f 72 64 3b 0a 73 74 72 75 63  ageRecord;.struc
1860: 74 20 50 61 67 65 52 65 63 6f 72 64 20 7b 0a 20  t PageRecord {. 
1870: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
18a0: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 61 44 61  er */.  char aDa
18b0: 74 61 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ta[SQLITE_PAGE_S
18c0: 49 5a 45 5d 3b 20 20 2f 2a 20 4f 72 69 67 69 6e  IZE];  /* Origin
18d0: 61 6c 20 64 61 74 61 20 66 6f 72 20 70 61 67 65  al data for page
18e0: 20 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   pgno */.};../*.
18f0: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
1900: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
1910: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
1920: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
1930: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
1940: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
1950: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
1960: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
1970: 20 63 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   check..*/.stati
1980: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
1990: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
19a0: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
19b0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
19c0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
19d0: 30 78 36 33 2c 20 30 78 64 34 2c 0a 7d 3b 0a 0a  0x63, 0xd4,.};..
19e0: 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20 70 61 67  /*.** Hash a pag
19f0: 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66  e number.*/.#def
1a00: 69 6e 65 20 70 61 67 65 72 5f 68 61 73 68 28 50  ine pager_hash(P
1a10: 4e 29 20 20 28 28 50 4e 29 25 4e 5f 50 47 5f 48  N)  ((PN)%N_PG_H
1a20: 41 53 48 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  ASH)../*.** Enab
1a30: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  le reference cou
1a40: 6e 74 20 74 72 61 63 6b 69 6e 67 20 68 65 72 65  nt tracking here
1a50: 3a 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  :.*/.#if SQLITE_
1a60: 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72  TEST.  int pager
1a70: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
1a80: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f  = 0;.  static vo
1a90: 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  id pager_refinfo
1aa0: 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20  (PgHdr *p){.    
1ab0: 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d  static int cnt =
1ac0: 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67   0;.    if( !pag
1ad0: 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  er_refinfo_enabl
1ae0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
1af0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  printf(.       "
1b00: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
1b10: 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c  =0x%08x nRef=%d\
1b20: 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67  n",.       p->pg
1b30: 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54  no, (int)PGHDR_T
1b40: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
1b50: 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e  ef.    );.    cn
1b60: 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68  t++;   /* Someth
1b70: 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65  ing to set a bre
1b80: 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20  akpoint on */.  
1b90: 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e  }.# define REFIN
1ba0: 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66  FO(X)  pager_ref
1bb0: 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20  info(X).#else.# 
1bc0: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
1bd0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1be0: 41 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  Attempt to acqui
1bf0: 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 28  re a read lock (
1c00: 69 66 20 77 72 6c 6f 63 6b 3d 3d 30 29 20 6f 72  if wrlock==0) or
1c10: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 28 69   a write lock (i
1c20: 66 20 77 72 6c 6f 63 6b 3d 3d 31 29 0a 2a 2a 20  f wrlock==1).** 
1c30: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1c40: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 30 20  file.  Return 0 
1c50: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 6e  on success and n
1c60: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c  on-zero if the l
1c70: 6f 63 6b 20 0a 2a 2a 20 63 6f 75 6c 64 20 6e 6f  ock .** could no
1c80: 74 20 62 65 20 61 63 71 75 69 72 65 64 2e 0a 2a  t be acquired..*
1c90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1ca0: 65 72 5f 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20  er_lock(int fd, 
1cb0: 69 6e 74 20 77 72 6c 6f 63 6b 29 7b 0a 20 20 69  int wrlock){.  i
1cc0: 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
1cd0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 6c 6f  flock lock;.  lo
1ce0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 77 72 6c 6f  ck.l_type = wrlo
1cf0: 63 6b 20 3f 20 46 5f 57 52 4c 43 4b 20 3a 20 46  ck ? F_WRLCK : F
1d00: 5f 52 44 4c 43 4b 3b 0a 20 20 6c 6f 63 6b 2e 6c  _RDLCK;.  lock.l
1d10: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
1d20: 45 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ET;.  lock.l_sta
1d30: 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
1d40: 3d 20 30 4c 3b 0a 20 20 72 63 20 3d 20 66 63 6e  = 0L;.  rc = fcn
1d50: 74 6c 28 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20  tl(fd, F_SETLK, 
1d60: 26 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e  &lock);.  return
1d70: 20 72 63 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   rc!=0;.}../*.**
1d80: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
1d90: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
1da0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75  atic int pager_u
1db0: 6e 6c 6f 63 6b 28 66 64 29 7b 0a 20 20 69 6e 74  nlock(fd){.  int
1dc0: 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 66 6c   rc;.  struct fl
1dd0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 6c 6f 63 6b  ock lock;.  lock
1de0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
1df0: 4b 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  K;.  lock.l_when
1e00: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
1e10: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
1e20: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
1e30: 0a 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64  .  rc = fcntl(fd
1e40: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
1e50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 21 3d  );.  return rc!=
1e60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
1e70: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
1e80: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1e90: 66 64 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20  fd to the point 
1ea0: 77 68 65 72 65 74 6f 20 66 72 6f 6d 0a 2a 2a 20  whereto from.** 
1eb0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1ec0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
1ed0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
1ee0: 65 65 6b 28 69 6e 74 20 66 64 2c 20 6f 66 66 5f  eek(int fd, off_
1ef0: 74 20 77 68 65 72 65 74 6f 29 7b 0a 20 20 2f 2a  t whereto){.  /*
1f00: 70 72 69 6e 74 66 28 22 53 45 45 4b 20 74 6f 20  printf("SEEK to 
1f10: 70 61 67 65 20 25 64 5c 6e 22 2c 20 77 68 65 72  page %d\n", wher
1f20: 65 74 6f 2f 53 51 4c 49 54 45 5f 50 41 47 45 5f  eto/SQLITE_PAGE_
1f30: 53 49 5a 45 20 2b 20 31 29 3b 2a 2f 0a 20 20 6c  SIZE + 1);*/.  l
1f40: 73 65 65 6b 28 66 64 2c 20 77 68 65 72 65 74 6f  seek(fd, whereto
1f50: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 72  , SEEK_SET);.  r
1f60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1f80: 74 65 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  te the given fil
1f90: 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  e so that it con
1fa0: 74 61 69 6e 73 20 65 78 61 63 74 6c 79 20 6d 78  tains exactly mx
1fb0: 50 67 20 70 61 67 65 73 0a 2a 2a 20 6f 66 20 64  Pg pages.** of d
1fc0: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ata..*/.static i
1fd0: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
1fe0: 65 28 69 6e 74 20 66 64 2c 20 50 67 6e 6f 20 6d  e(int fd, Pgno m
1ff0: 78 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  xPg){.  int rc;.
2000: 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65    rc = ftruncate
2010: 28 66 64 2c 20 6d 78 50 67 2a 53 51 4c 49 54 45  (fd, mxPg*SQLITE
2020: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 72  _PAGE_SIZE);.  r
2030: 65 74 75 72 6e 20 72 63 21 3d 30 20 3f 20 53 51  eturn rc!=0 ? SQ
2040: 4c 49 54 45 5f 49 4f 45 52 52 20 3a 20 53 51 4c  LITE_IOERR : SQL
2050: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2060: 20 52 65 61 64 20 6e 42 79 74 65 73 20 6f 66 20   Read nBytes of 
2070: 64 61 74 61 20 66 72 6f 6d 20 66 64 20 69 6e 74  data from fd int
2080: 6f 20 70 42 75 66 2e 20 20 49 66 20 74 68 65 20  o pBuf.  If the 
2090: 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  data cannot be.*
20a0: 2a 20 72 65 61 64 20 6f 72 20 6f 6e 6c 79 20 61  * read or only a
20b0: 20 70 61 72 74 69 61 6c 20 72 65 61 64 20 6f 63   partial read oc
20c0: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 75  curs, then the u
20d0: 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 0a 2a  nread parts of.*
20e0: 2a 20 70 42 75 66 20 61 72 65 20 66 69 6c 6c 65  * pBuf are fille
20f0: 64 20 77 69 74 68 20 7a 65 72 6f 73 20 61 6e 64  d with zeros and
2100: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2110: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 49 4f 45  turns SQLITE_IOE
2120: 52 52 2e 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  RR..** If the re
2130: 61 64 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  ad is completely
2140: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
2150: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
2160: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2170: 65 72 5f 72 65 61 64 28 69 6e 74 20 66 64 2c 20  er_read(int fd, 
2180: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
2190: 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  nByte){.  int rc
21a0: 3b 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 52  ;.  /* printf("R
21b0: 45 41 44 5c 6e 22 29 3b 2a 2f 0a 20 20 72 63 20  EAD\n");*/.  rc 
21c0: 3d 20 72 65 61 64 28 66 64 2c 20 70 42 75 66 2c  = read(fd, pBuf,
21d0: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72   nByte);.  if( r
21e0: 63 3c 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  c<0 ){.    memse
21f0: 74 28 70 42 75 66 2c 20 30 2c 20 6e 42 79 74 65  t(pBuf, 0, nByte
2200: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2210: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
2220: 20 20 69 66 28 20 72 63 3c 6e 42 79 74 65 20 29    if( rc<nByte )
2230: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  {.    memset(&((
2240: 63 68 61 72 2a 29 70 42 75 66 29 5b 72 63 5d 2c  char*)pBuf)[rc],
2250: 20 30 2c 20 6e 42 79 74 65 20 2d 20 72 63 29 3b   0, nByte - rc);
2260: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2270: 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 6c 73 65 7b  _IOERR;.  }else{
2280: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2290: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
22a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
22b0: 72 69 74 65 20 6e 42 79 74 65 73 20 6f 66 20 64  rite nBytes of d
22c0: 61 74 61 20 69 6e 74 6f 20 66 64 2e 20 20 49 66  ata into fd.  If
22d0: 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 6f 63 63   any problem occ
22e0: 75 72 73 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a  urs or if the.**
22f0: 20 77 72 69 74 65 20 69 73 20 69 6e 63 6f 6d 70   write is incomp
2300: 6c 65 74 65 2c 20 53 51 4c 49 54 45 5f 49 4f 45  lete, SQLITE_IOE
2310: 52 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  RR is returned. 
2320: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
2330: 20 72 65 74 75 72 6e 65 64 20 75 70 6f 6e 20 63   returned upon c
2340: 6f 6d 70 6c 65 74 65 20 73 75 63 63 65 73 73 2e  omplete success.
2350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2360: 61 67 65 72 5f 77 72 69 74 65 28 69 6e 74 20 66  ager_write(int f
2370: 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  d, const void *p
2380: 42 75 66 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  Buf, int nByte){
2390: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 2f 2a 70  .  int rc;.  /*p
23a0: 72 69 6e 74 66 28 22 57 52 49 54 45 5c 6e 22 29  rintf("WRITE\n")
23b0: 3b 2a 2f 0a 20 20 72 63 20 3d 20 77 72 69 74 65  ;*/.  rc = write
23c0: 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  (fd, pBuf, nByte
23d0: 29 3b 0a 20 20 69 66 28 20 72 63 3c 6e 42 79 74  );.  if( rc<nByt
23e0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23f0: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
2400: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2410: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2420: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
2430: 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
2440: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2450: 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72   into an appropr
2460: 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f  ate.** return co
2470: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
2480: 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  t pager_errcode(
2490: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
24a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24b0: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
24c0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
24d0: 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20  GER_ERR_LOCK )  
24e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
24f0: 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50  OTOCOL;.  if( pP
2500: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
2510: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29  PAGER_ERR_FULL )
2520: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2530: 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67  FULL;.  if( pPag
2540: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
2550: 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20  GER_ERR_MEM )   
2560: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2570: 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  MEM;.  if( pPage
2580: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
2590: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29  ER_ERR_CORRUPT )
25a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
25b0: 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72  RUPT;.  return r
25c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
25d0: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
25e0: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
25f0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
2600: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
2610: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
2620: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
2630: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
2640: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
2650: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
2660: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
2670: 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50  .  PgHdr *p = pP
2680: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
2690: 20 25 20 4e 5f 50 47 5f 48 41 53 48 5d 3b 0a 20   % N_PG_HASH];. 
26a0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
26b0: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
26c0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
26d0: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
26e0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
26f0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
2700: 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69   and clear the i
2710: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
2720: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
2730: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
2740: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
2750: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
2760: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
2770: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
2780: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
2790: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
27a0: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
27b0: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
27c0: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
27d0: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
27e0: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
27f0: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
2800: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
2810: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
2820: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
2830: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
2840: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
2850: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
2860: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
2870: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
2880: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
2890: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
28a0: 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50  pFirst = 0;.  pP
28b0: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
28c0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
28d0: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50  = 0;.  memset(pP
28e0: 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
28f0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
2900: 48 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72  Hash));.  pPager
2910: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  ->nPage = 0;.  i
2920: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2930: 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  ==SQLITE_WRITELO
2940: 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CK ){.    sqlite
2950: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
2960: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70 61  Pager);.  }.  pa
2970: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
2980: 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65 72  r->fd);.  pPager
2990: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
29a0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
29b0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
29c0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
29d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65   0;.}../*.** Whe
29e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
29f0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
2a00: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
2a10: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
2a20: 64 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63  d.** a write loc
2a30: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2a40: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2a50: 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 64 61   releases the da
2a60: 74 61 62 61 73 65 0a 2a 2a 20 77 72 69 74 65 20  tabase.** write 
2a70: 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65  lock and acquire
2a80: 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 6e  s a read lock in
2a90: 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65   its place.  The
2aa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2ab0: 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20   is deleted and 
2ac0: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 65  closed..**.** We
2ad0: 20 68 61 76 65 20 74 6f 20 72 65 6c 65 61 73 65   have to release
2ae0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
2af0: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
2b00: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2c 0a   the read lock,.
2b10: 2a 2a 20 73 6f 20 74 68 65 72 65 20 69 73 20 61  ** so there is a
2b20: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
2b30: 77 68 65 72 65 20 61 6e 6f 74 68 65 72 20 70 72  where another pr
2b40: 6f 63 65 73 73 20 63 61 6e 20 67 65 74 20 74 68  ocess can get th
2b50: 65 20 6c 6f 63 6b 0a 2a 2a 20 77 68 69 6c 65 20  e lock.** while 
2b60: 77 65 20 61 72 65 20 6e 6f 74 20 68 6f 6c 64 69  we are not holdi
2b70: 6e 67 20 69 74 2e 20 20 42 75 74 2c 20 6e 6f 20  ng it.  But, no 
2b80: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 73 68  other process sh
2b90: 6f 75 6c 64 20 64 6f 20 74 68 69 73 0a 2a 2a 20  ould do this.** 
2ba0: 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
2bb0: 6c 73 6f 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  lso holding a lo
2bc0: 63 6b 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ck on the journa
2bd0: 6c 2c 20 61 6e 64 20 6e 6f 20 70 72 6f 63 65 73  l, and no proces
2be0: 73 0a 2a 2a 20 73 68 6f 75 6c 64 20 67 65 74 20  s.** should get 
2bf0: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
2c00: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 74  the database wit
2c10: 68 6f 75 74 20 66 69 72 73 74 20 67 65 74 74 69  hout first getti
2c20: 6e 67 20 61 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  ng a lock.** on 
2c30: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f  the journal.  So
2c40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   this routine sh
2c50: 6f 75 6c 64 20 6e 65 76 65 72 20 66 61 69 6c 2e  ould never fail.
2c60: 20 20 42 75 74 20 69 74 20 63 61 6e 20 66 61 69    But it can fai
2c70: 6c 0a 2a 2a 20 69 66 20 61 6e 6f 74 68 65 72 20  l.** if another 
2c80: 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 70  process is not p
2c90: 6c 61 79 69 6e 67 20 62 79 20 74 68 65 20 72 75  laying by the ru
2ca0: 6c 65 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73  les.  If it does
2cb0: 20 66 61 69 6c 2c 0a 2a 2a 20 61 6c 6c 20 69 6e   fail,.** all in
2cc0: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
2cd0: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
2ce0: 74 65 64 2c 20 74 68 65 20 50 41 47 45 52 5f 45  ted, the PAGER_E
2cf0: 52 52 5f 4c 4f 43 4b 20 62 69 74 0a 2a 2a 20 69  RR_LOCK bit.** i
2d00: 73 20 73 65 74 20 69 6e 20 70 50 61 67 65 72 2d  s set in pPager-
2d10: 3e 65 72 72 4d 61 73 6b 2c 20 61 6e 64 20 74 68  >errMask, and th
2d20: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2d30: 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  ns SQLITE_PROTOC
2d40: 4f 4c 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  OL..** SQLITE_OK
2d50: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
2d60: 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
2d70: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77  ic int pager_unw
2d80: 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a  ritelock(Pager *
2d90: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2da0: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
2db0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
2dc0: 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49  tate!=SQLITE_WRI
2dd0: 54 45 4c 4f 43 4b 20 29 20 72 65 74 75 72 6e 20  TELOCK ) return 
2de0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67  SQLITE_OK;.  pag
2df0: 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
2e00: 2d 3e 66 64 29 3b 0a 20 20 72 63 20 3d 20 70 61  ->fd);.  rc = pa
2e10: 67 65 72 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2d  ger_lock(pPager-
2e20: 3e 66 64 2c 20 30 29 3b 0a 20 20 75 6e 6c 69 6e  >fd, 0);.  unlin
2e30: 6b 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  k(pPager->zJourn
2e40: 61 6c 29 3b 0a 20 20 63 6c 6f 73 65 28 70 50 61  al);.  close(pPa
2e50: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61  ger->jfd);.  pPa
2e60: 67 65 72 2d 3e 6a 66 64 20 3d 20 2d 31 3b 0a 20  ger->jfd = -1;. 
2e70: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
2e80: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
2e90: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
2ea0: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 66  Journal = 0;.  f
2eb0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
2ec0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
2ed0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
2ee0: 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
2ef0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
2f00: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
2f10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f20: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
2f30: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
2f40: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  UNLOCK;.    rc =
2f50: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
2f60: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
2f70: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
2f80: 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65  RR_LOCK;.  }else
2f90: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2fa0: 45 5f 4f 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  E_OK;.    pPager
2fb0: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
2fc0: 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  _READLOCK;.  }. 
2fd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2fe0: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
2ff0: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
3000: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
3010: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
3020: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
3030: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
3040: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
3050: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
3060: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
3070: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
3080: 6f 6c 6c 6f 77 73 3a 20 20 54 68 65 72 65 20 69  ollows:  There i
3090: 73 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a 20  s an initial.** 
30a0: 66 69 6c 65 2d 74 79 70 65 20 73 74 72 69 6e 67  file-type string
30b0: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
30c0: 6b 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 65 72  king.  Then ther
30d0: 65 20 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  e is a single.**
30e0: 20 50 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68 69   Pgno number whi
30f0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
3100: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
3110: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
3120: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 77 65 72 65  .** changes were
3130: 20 6d 61 64 65 2e 20 20 54 68 65 20 64 61 74 61   made.  The data
3140: 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65  base is truncate
3150: 64 20 74 6f 20 74 68 69 73 20 73 69 7a 65 2e 0a  d to this size..
3160: 2a 2a 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65 72  ** Next come zer
3170: 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 20 72  o or more page r
3180: 65 63 6f 72 64 73 20 77 68 65 72 65 20 65 61 63  ecords where eac
3190: 68 20 70 61 67 65 20 72 65 63 6f 72 64 0a 2a 2a  h page record.**
31a0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 50   consists of a P
31b0: 67 6e 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f 50  gno and SQLITE_P
31c0: 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f  AGE_SIZE bytes o
31d0: 66 20 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a 20  f data.  See.** 
31e0: 74 68 65 20 50 61 67 65 52 65 63 6f 72 64 20 73  the PageRecord s
31f0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 64 65 74  tructure for det
3200: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ails..**.** For 
3210: 70 6c 61 79 62 61 63 6b 2c 20 74 68 65 20 70 61  playback, the pa
3220: 67 65 73 20 68 61 76 65 20 74 6f 20 62 65 20 72  ges have to be r
3230: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
3240: 72 6e 61 6c 20 69 6e 0a 2a 2a 20 72 65 76 65 72  rnal in.** rever
3250: 73 65 20 6f 72 64 65 72 20 61 6e 64 20 70 75 74  se order and put
3260: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f   back into the o
3270: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
3280: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
3290: 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
32a0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
32b0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
32c0: 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
32d0: 6e 61 6c 20 66 69 6c 65 20 28 61 73 20 64 65 74  nal file (as det
32e0: 65 72 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b 69  ermined by looki
32f0: 6e 67 20 61 74 20 74 68 65 20 6d 61 67 69 63 20  ng at the magic 
3300: 6e 75 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68 65  number.** at the
3310: 20 62 65 67 69 6e 6e 69 6e 67 29 20 74 68 65 6e   beginning) then
3320: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
3330: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f  turns SQLITE_PRO
3340: 54 4f 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e 79  TOCOL..** If any
3350: 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 6f 63   other errors oc
3360: 63 75 72 20 64 75 72 69 6e 67 20 70 6c 61 79 62  cur during playb
3370: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
3380: 65 20 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c 79  e will.** likely
3390: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 73   be corrupted, s
33a0: 6f 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f  o the PAGER_ERR_
33b0: 43 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73  CORRUPT bit is s
33c0: 65 74 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72 2d  et in.** pPager-
33d0: 3e 65 72 72 4d 61 73 6b 20 61 6e 64 20 53 51 4c  >errMask and SQL
33e0: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
33f0: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20  eturned.  If it 
3400: 61 6c 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74 68  all.** works, th
3410: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
3420: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
3430: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
3440: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
3450: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
3460: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
3470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3480: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
3490: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34b0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
34c0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
34d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
34e0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
34f0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
3500: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  s */.  struct st
3510: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
3520: 2f 2a 20 55 73 65 64 20 74 6f 20 73 69 7a 65 20  /* Used to size 
3530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
3540: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
3550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
3560: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
3570: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
3580: 50 61 67 65 52 65 63 6f 72 64 20 70 67 52 65 63  PageRecord pgRec
3590: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
35a0: 72 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f 66 28  r aMagic[sizeof(
35b0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 3b  aJournalMagic)];
35c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
35d0: 20 52 65 61 64 20 74 68 65 20 62 65 67 69 6e 6e   Read the beginn
35e0: 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
35f0: 61 6c 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20  al and truncate 
3600: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
3610: 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
3620: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
3630: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
3640: 20 70 50 61 67 65 72 2d 3e 6a 66 64 3e 3d 30 20   pPager->jfd>=0 
3650: 29 3b 0a 20 20 70 61 67 65 72 5f 73 65 65 6b 28  );.  pager_seek(
3660: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
3670: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65  .  rc = pager_re
3680: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
3690: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
36a0: 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72  Magic));.  if( r
36b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
36c0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 61 4a  memcmp(aMagic,aJ
36d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 73 69 7a 65  ournalMagic,size
36e0: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
36f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
3700: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
3710: 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72  }.  rc = pager_r
3720: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
3730: 20 26 6d 78 50 67 2c 20 73 69 7a 65 6f 66 28 6d   &mxPg, sizeof(m
3740: 78 50 67 29 29 3b 0a 20 20 69 66 28 20 72 63 21  xPg));.  if( rc!
3750: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3760: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3770: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 7d 0a 20 20  PROTOCOL;.  }.  
3780: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
3790: 50 61 67 65 72 2d 3e 66 64 2c 20 6d 78 50 67 29  Pager->fd, mxPg)
37a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
37b0: 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20  ze = mxPg;.  .  
37c0: 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
37d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 67   the journal beg
37e0: 69 6e 6e 69 6e 67 20 61 74 20 74 68 65 20 65 6e  inning at the en
37f0: 64 20 61 6e 64 20 6d 6f 76 69 6e 67 0a 20 20 2a  d and moving.  *
3800: 2a 20 74 6f 77 61 72 64 20 74 68 65 20 62 65 67  * toward the beg
3810: 69 6e 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69  inning..  */.  i
3820: 66 28 20 66 73 74 61 74 28 70 50 61 67 65 72 2d  f( fstat(pPager-
3830: 3e 6a 66 64 2c 20 26 73 74 61 74 62 75 66 29 21  >jfd, &statbuf)!
3840: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3850: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
3860: 20 20 6e 52 65 63 20 3d 20 28 73 74 61 74 62 75    nRec = (statbu
3870: 66 2e 73 74 5f 73 69 7a 65 20 2d 20 28 73 69 7a  f.st_size - (siz
3880: 65 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65  eof(aMagic)+size
3890: 6f 66 28 50 67 6e 6f 29 29 29 20 2f 20 73 69 7a  of(Pgno))) / siz
38a0: 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b  eof(PageRecord);
38b0: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 73  ..  /* Process s
38c0: 65 67 6d 65 6e 74 73 20 62 65 67 69 6e 6e 69 6e  egments beginnin
38d0: 67 20 77 69 74 68 20 74 68 65 20 6c 61 73 74 20  g with the last 
38e0: 61 6e 64 20 77 6f 72 6b 69 6e 67 20 62 61 63 6b  and working back
38f0: 77 61 72 64 73 0a 20 20 2a 2a 20 74 6f 20 74 68  wards.  ** to th
3900: 65 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  e first..  */.  
3910: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
3920: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 2f 2a  =0; i--){.    /*
3930: 20 53 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67   Seek to the beg
3940: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 73 65  inning of the se
3950: 67 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 6f 66 66  gment */.    off
3960: 5f 74 20 6f 66 73 74 3b 0a 20 20 20 20 6f 66 73  _t ofst;.    ofs
3970: 74 20 3d 20 69 2a 73 69 7a 65 6f 66 28 50 61 67  t = i*sizeof(Pag
3980: 65 52 65 63 6f 72 64 29 20 2b 20 73 69 7a 65 6f  eRecord) + sizeo
3990: 66 28 61 4d 61 67 69 63 29 20 2b 20 73 69 7a 65  f(aMagic) + size
39a0: 6f 66 28 50 67 6e 6f 29 3b 0a 20 20 20 20 72 63  of(Pgno);.    rc
39b0: 20 3d 20 70 61 67 65 72 5f 73 65 65 6b 28 70 50   = pager_seek(pP
39c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 73 74 29  ager->jfd, ofst)
39d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
39e0: 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
39f0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
3a00: 72 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  read(pPager->jfd
3a10: 2c 20 26 70 67 52 65 63 2c 20 73 69 7a 65 6f 66  , &pgRec, sizeof
3a20: 28 70 67 52 65 63 29 29 3b 0a 20 20 20 20 69 66  (pgRec));.    if
3a30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3a40: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
3a50: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
3a60: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
3a70: 20 20 20 20 69 66 28 20 70 67 52 65 63 2e 70 67      if( pgRec.pg
3a80: 6e 6f 3e 6d 78 50 67 20 7c 7c 20 70 67 52 65 63  no>mxPg || pgRec
3a90: 2e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  .pgno==0 ){.    
3aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
3ab0: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 62 72 65  RRUPT;.      bre
3ac0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
3ad0: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 70  * Playback the p
3ae0: 61 67 65 2e 20 20 55 70 64 61 74 65 20 74 68 65  age.  Update the
3af0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 70 79 20   in-memory copy 
3b00: 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  of the page.    
3b10: 2a 2a 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  ** at the same t
3b20: 69 6d 65 2c 20 69 66 20 74 68 65 72 65 20 69 73  ime, if there is
3b30: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
3b40: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
3b50: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 52 65  kup(pPager, pgRe
3b60: 63 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  c.pgno);.    if(
3b70: 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 65   pPg ){.      me
3b80: 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
3b90: 54 41 28 70 50 67 29 2c 20 70 67 52 65 63 2e 61  TA(pPg), pgRec.a
3ba0: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47  Data, SQLITE_PAG
3bb0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 6d  E_SIZE);.      m
3bc0: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
3bd0: 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50  XTRA(pPg), 0, pP
3be0: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
3bf0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 61     }.    rc = pa
3c00: 67 65 72 5f 73 65 65 6b 28 70 50 61 67 65 72 2d  ger_seek(pPager-
3c10: 3e 66 64 2c 20 28 70 67 52 65 63 2e 70 67 6e 6f  >fd, (pgRec.pgno
3c20: 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  -1)*SQLITE_PAGE_
3c30: 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72  SIZE);.    if( r
3c40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
3c50: 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 70  reak;.    rc = p
3c60: 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
3c70: 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61 44 61  r->fd, pgRec.aDa
3c80: 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ta, SQLITE_PAGE_
3c90: 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72  SIZE);.    if( r
3ca0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
3cb0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
3cc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3cd0: 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69  .    pager_unwri
3ce0: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
3cf0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
3d00: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
3d10: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
3d20: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
3d30: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
3d40: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
3d50: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
3d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
3d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
3d80: 20 61 20 64 69 72 65 63 74 6f 72 79 20 77 68 65   a directory whe
3d90: 72 65 20 77 65 20 63 61 6e 20 70 6f 74 65 6e 74  re we can potent
3da0: 69 61 6c 6c 79 20 63 72 65 61 74 65 20 61 20 74  ially create a t
3db0: 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
3dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
3dd0: 74 20 63 68 61 72 20 2a 66 69 6e 64 54 65 6d 70  t char *findTemp
3de0: 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  Dir(void){.  sta
3df0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3e00: 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
3e10: 20 20 22 2e 22 2c 0a 20 20 20 20 20 22 2f 76 61    ".",.     "/va
3e20: 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
3e30: 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
3e40: 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 65 6d  tmp",.     "/tem
3e50: 70 22 2c 0a 20 20 20 20 20 22 2e 2f 74 65 6d 70  p",.     "./temp
3e60: 22 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  ",.  };.  int i;
3e70: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
3e80: 75 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  uf;.  for(i=0; i
3e90: 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
3ea0: 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
3eb0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
3ec0: 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c   stat(azDirs[i],
3ed0: 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
3ee0: 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
3ef0: 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
3f00: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3f10: 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69   if( access(azDi
3f20: 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e  rs[i], 07) ) con
3f30: 74 69 6e 75 65 3b 0a 20 20 20 20 72 65 74 75 72  tinue;.    retur
3f40: 6e 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 7d  n azDirs[i];.  }
3f50: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3f60: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3f70: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3f80: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
3f90: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
3fa0: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
3fb0: 69 74 65 70 61 67 65 72 5f 73 65 74 5f 63 61 63  itepager_set_cac
3fc0: 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
3fd0: 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
3fe0: 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
3ff0: 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
4000: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
4010: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
4020: 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
4030: 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20  e cache and put 
4040: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4050: 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a   page cache in *
4060: 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  ppPager..** The 
4070: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
4080: 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74  d need not exist
4090: 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  .  The file is n
40a0: 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a  ot locked until.
40b0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ** the first cal
40c0: 6c 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72  l to sqlitepager
40d0: 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  _get() and is on
40e0: 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
40f0: 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
4100: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
4110: 75 73 69 6e 67 20 73 71 6c 69 74 65 70 61 67 65  using sqlitepage
4120: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 69 6e  r_unref()..*/.in
4130: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70  t sqlitepager_op
4140: 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70  en(.  Pager **pp
4150: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
4160: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
4170: 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
4180: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
4190: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
41a0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
41b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
41c0: 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  open */.  int mx
41d0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
41e0: 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72     /* Max number
41f0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61   of in-memory ca
4200: 63 68 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  che pages */.  i
4210: 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20  nt nExtra       
4220: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
4230: 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
4240: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
4250: 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  page */.){.  Pag
4260: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e  er *pPager;.  in
4270: 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 69 6e 74  t nameLen;.  int
4280: 20 66 64 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46   fd;.  int tempF
4290: 69 6c 65 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  ile;.  int readO
42a0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  nly = 0;.  char 
42b0: 7a 54 65 6d 70 5b 33 30 30 5d 3b 0a 0a 20 20 2a  zTemp[300];..  *
42c0: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  ppPager = 0;.  i
42d0: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
42e0: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  _failed ){.    r
42f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
4300: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
4310: 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ilename ){.    f
4320: 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  d = open(zFilena
4330: 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  me, O_RDWR|O_CRE
4340: 41 54 2c 20 30 36 34 34 29 3b 0a 20 20 20 20 69  AT, 0644);.    i
4350: 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
4360: 20 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65   fd = open(zFile
4370: 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  name, O_RDONLY, 
4380: 30 29 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e  0);.      readOn
4390: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ly = 1;.    }.  
43a0: 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a    tempFile = 0;.
43b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
43c0: 20 63 6e 74 20 3d 20 38 3b 0a 20 20 20 20 63 6f   cnt = 8;.    co
43d0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
43e0: 20 66 69 6e 64 54 65 6d 70 44 69 72 28 29 3b 0a   findTempDir();.
43f0: 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20      if( zDir==0 
4400: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
4410: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 64 6f  CANTOPEN;.    do
4420: 7b 0a 20 20 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  {.      cnt--;. 
4430: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54 65       sprintf(zTe
4440: 6d 70 2c 22 25 73 2f 5f 73 71 6c 69 74 65 5f 25  mp,"%s/_sqlite_%
4450: 75 22 2c 20 7a 44 69 72 2c 20 28 75 6e 73 69 67  u", zDir, (unsig
4460: 6e 65 64 29 73 71 6c 69 74 65 52 61 6e 64 6f 6d  ned)sqliteRandom
4470: 49 6e 74 65 67 65 72 28 29 29 3b 0a 20 20 20 20  Integer());.    
4480: 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 54 65 6d    fd = open(zTem
4490: 70 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  p, O_RDWR|O_CREA
44a0: 54 7c 4f 5f 45 58 43 4c 2c 20 30 36 30 30 29 3b  T|O_EXCL, 0600);
44b0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 63 6e 74  .    }while( cnt
44c0: 3e 30 20 26 26 20 66 64 3c 30 20 29 3b 0a 20 20  >0 && fd<0 );.  
44d0: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54    zFilename = zT
44e0: 65 6d 70 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c  emp;.    tempFil
44f0: 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 1;.  }.  if(
4500: 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74   fd<0 ){.    ret
4510: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
4520: 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c  PEN;.  }.  nameL
4530: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c  en = strlen(zFil
4540: 65 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72  ename);.  pPager
4550: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
4560: 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
4570: 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32 20 2b 20 33   + nameLen*2 + 3
4580: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
4590: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73  r==0 ){.    clos
45a0: 65 28 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72  e(fd);.    retur
45b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
45c0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46    }.  pPager->zF
45d0: 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
45e0: 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
45f0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
4600: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
4610: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
4620: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
4630: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 69  ->zFilename, zFi
4640: 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  lename);.  strcp
4650: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
4660: 61 6c 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  al, zFilename);.
4670: 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72    strcpy(&pPager
4680: 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c  ->zJournal[nameL
4690: 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29  en], "-journal")
46a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
46b0: 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   fd;.  pPager->j
46c0: 66 64 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  fd = -1;.  pPage
46d0: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70  r->nRef = 0;.  p
46e0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
46f0: 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  -1;.  pPager->nP
4700: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
4710: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
4720: 67 65 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a 20  ge>5 ? mxPage : 
4730: 31 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  10;.  pPager->st
4740: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c  ate = SQLITE_UNL
4750: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  OCK;.  pPager->e
4760: 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50  rrMask = 0;.  pP
4770: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
4780: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61   tempFile;.  pPa
4790: 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
47a0: 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67  readOnly;.  pPag
47b0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
47c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
47d0: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
47e0: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  ->pLast = 0;.  p
47f0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
4800: 6e 45 78 74 72 61 3b 0a 20 20 6d 65 6d 73 65 74  nExtra;.  memset
4810: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
4820: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
4830: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70  ->aHash));.  *pp
4840: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
4850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4860: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
4870: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
4880: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
4890: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
48a0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
48b0: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
48c0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
48d0: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
48e0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
48f0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
4900: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
4910: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
4920: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
4930: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
4940: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
4950: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
4960: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
4970: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
4980: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73  sqlitepager_clos
4990: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
49a0: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
49b0: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 70  alled by sqlitep
49c0: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f  ager_unref()..*/
49d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65  .void sqlitepage
49e0: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
49f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
4a00: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
4a10: 69 64 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  id*)){.  pPager-
4a20: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
4a30: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Desc;.}../*.** R
4a40: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
4a50: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
4a60: 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
4a70: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4a80: 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69  .** pPager..*/.i
4a90: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70  nt sqlitepager_p
4aa0: 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
4ab0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e  pPager){.  int n
4ac0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
4ad0: 73 74 61 74 62 75 66 3b 0a 20 20 61 73 73 65 72  statbuf;.  asser
4ae0: 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
4af0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
4b00: 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72  Size>=0 ){.    r
4b10: 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64 62  eturn pPager->db
4b20: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Size;.  }.  if( 
4b30: 66 73 74 61 74 28 70 50 61 67 65 72 2d 3e 66 64  fstat(pPager->fd
4b40: 2c 20 26 73 74 61 74 62 75 66 29 21 3d 30 20 29  , &statbuf)!=0 )
4b50: 7b 0a 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 7d  {.    n = 0;.  }
4b60: 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20 73 74  else{.    n = st
4b70: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 2f 53 51  atbuf.st_size/SQ
4b80: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  LITE_PAGE_SIZE;.
4b90: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
4ba0: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
4bb0: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50  UNLOCK ){.    pP
4bc0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
4bd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
4be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
4bf0: 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
4c00: 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
4c10: 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
4c20: 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
4c30: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
4c40: 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
4c50: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
4c60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
4c70: 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
4c80: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
4c90: 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
4ca0: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
4cb0: 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
4cc0: 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
4cd0: 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
4ce0: 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
4cf0: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
4d00: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
4d10: 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
4d20: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4d30: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
4d40: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
4d50: 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dump..*/.int sql
4d60: 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 50  itepager_close(P
4d70: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
4d80: 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
4d90: 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  ext;.  switch( p
4da0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a  Pager->state ){.
4db0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4dc0: 57 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20 20 20  WRITELOCK: {.   
4dd0: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72     sqlitepager_r
4de0: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
4df0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  .      pager_unl
4e00: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ock(pPager->fd);
4e10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4e20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
4e30: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a  ITE_READLOCK: {.
4e40: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
4e50: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ck(pPager->fd);.
4e60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4e70: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
4e80: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
4e90: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
4ea0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4eb0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
4ec0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
4ed0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
4ee0: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
4ef0: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
4f00: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ee(pPg);.  }.  i
4f10: 66 28 20 70 50 61 67 65 72 2d 3e 66 64 3e 3d 30  f( pPager->fd>=0
4f20: 20 29 20 63 6c 6f 73 65 28 70 50 61 67 65 72 2d   ) close(pPager-
4f30: 3e 66 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >fd);.  assert( 
4f40: 70 50 61 67 65 72 2d 3e 6a 66 64 3c 30 20 29 3b  pPager->jfd<0 );
4f50: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
4f60: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 75  empFile ){.    u
4f70: 6e 6c 69 6e 6b 28 70 50 61 67 65 72 2d 3e 7a 46  nlink(pPager->zF
4f80: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ilename);.  }.  
4f90: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
4fa0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
4fb0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4fc0: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
4fd0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
4fe0: 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
4ff0: 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 70  .*/.Pgno sqlitep
5000: 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
5010: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
5020: 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f  PgHdr *p = DATA_
5030: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
5040: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
5050: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  o;.}../*.** Incr
5060: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
5070: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
5080: 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
5090: 67 65 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  ge is.** current
50a0: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
50b0: 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
50c0: 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
50d0: 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
50e0: 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
50f0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
5100: 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
5110: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
5120: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
5130: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
5140: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
5150: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
5160: 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  Remove it. */.  
5170: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
5180: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
5190: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
51a0: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
51b0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
51c0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
51d0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
51e0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
51f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5200: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
5210: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
5220: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
5230: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
5240: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
5250: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
5260: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
5270: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
5280: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
5290: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
52a0: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
52b0: 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  INFO(pPg);.}../*
52c0: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
52d0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
52e0: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
52f0: 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
5300: 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
5310: 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
5320: 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
5330: 74 65 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64  tepager_ref(void
5340: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
5350: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
5360: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
5370: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
5380: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5390: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
53a0: 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  uire a page..**.
53b0: 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ** A read lock o
53c0: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
53d0: 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e  is obtained when
53e0: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
53f0: 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
5400: 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
5410: 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
5420: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
5430: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  leased..**.** A 
5440: 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61  _get works for a
5450: 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
5460: 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
5470: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
5480: 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
5490: 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
54a0: 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
54b0: 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
54c0: 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
54d0: 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
54e0: 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
54f0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
5500: 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
5510: 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
5520: 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
5530: 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
5540: 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
5550: 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
5560: 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
5570: 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
5580: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
5590: 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
55a0: 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
55b0: 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
55c0: 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
55d0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
55e0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
55f0: 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
5600: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
5610: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
5620: 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e  epager_lookup().
5630: 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
5640: 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28  ine and _lookup(
5650: 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
5660: 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
5670: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
5680: 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
5690: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
56a0: 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
56b0: 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
56c0: 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
56d0: 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
56e0: 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a  eas _lookup().**
56f0: 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
5700: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
5710: 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
5720: 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
5730: 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
5740: 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
5750: 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
5760: 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
5770: 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
5780: 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75  .** Since _looku
5790: 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
57a0: 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
57b0: 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
57c0: 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
57d0: 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
57e0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
57f0: 67 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  get(Pager *pPage
5800: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
5810: 69 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20  id **ppPage){.  
5820: 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
5830: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
5840: 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
5850: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
5860: 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 50 61  .  */ .  if( pPa
5870: 67 65 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  ger==0 || pgno==
5880: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5890: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
58a0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
58b0: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
58c0: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
58d0: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
58e0: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
58f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
5900: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
5910: 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
5920: 68 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c  hen get a read l
5930: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
5940: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
5950: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
5960: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
5970: 20 69 66 28 20 70 61 67 65 72 5f 6c 6f 63 6b 28   if( pager_lock(
5980: 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 21 3d  pPager->fd, 0)!=
5990: 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61  0 ){.      *ppPa
59a0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
59b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
59c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
59d0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
59e0: 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20  TE_READLOCK;..  
59f0: 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
5a00: 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
5a10: 72 79 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61  ry to play it ba
5a20: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ck..    */.    i
5a30: 66 28 20 61 63 63 65 73 73 28 70 50 61 67 65 72  f( access(pPager
5a40: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 30 29 3d 3d 30  ->zJournal,0)==0
5a50: 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72   ){.       int r
5a60: 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70  c;..       /* Op
5a70: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
5a80: 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
5a90: 65 73 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ess.  Return SQL
5aa0: 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20  ITE_BUSY if.    
5ab0: 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20     ** we cannot 
5ac0: 67 65 74 20 65 78 63 6c 75 73 69 76 65 20 61 63  get exclusive ac
5ad0: 63 65 73 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  cess to the jour
5ae0: 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  nal file.       
5af0: 2a 2f 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  */.       pPager
5b00: 2d 3e 6a 66 64 20 3d 20 6f 70 65 6e 28 70 50 61  ->jfd = open(pPa
5b10: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 4f  ger->zJournal, O
5b20: 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  _RDONLY, 0);.   
5b30: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
5b40: 6a 66 64 3c 30 20 7c 7c 20 70 61 67 65 72 5f 6c  jfd<0 || pager_l
5b50: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ock(pPager->jfd,
5b60: 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   1)!=0 ){.      
5b70: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
5b80: 66 64 3e 3d 30 20 29 7b 20 63 6c 6f 73 65 28 70  fd>=0 ){ close(p
5b90: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 20 70 50 61  Pager->jfd); pPa
5ba0: 67 65 72 2d 3e 6a 66 64 20 3d 20 2d 31 3b 20 7d  ger->jfd = -1; }
5bb0: 0a 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  .         pager_
5bc0: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  unlock(pPager->f
5bd0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 2a 70 70  d);.         *pp
5be0: 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
5bf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5c00: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a  _BUSY;.       }.
5c10: 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  .       /* Get a
5c20: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
5c30: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
5c40: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
5c50: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ck(pPager->fd);.
5c60: 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
5c70: 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  _lock(pPager->fd
5c80: 2c 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 1)!=0 ){.     
5c90: 20 20 20 20 63 6c 6f 73 65 28 70 50 61 67 65 72      close(pPager
5ca0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
5cb0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 2d   pPager->jfd = -
5cc0: 31 3b 0a 20 20 20 20 20 20 20 20 20 2a 70 70 50  1;.         *ppP
5cd0: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
5ce0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5cf0: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 20 20  PROTOCOL;.      
5d00: 20 7d 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c   }..       /* Pl
5d10: 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
5d20: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
5d30: 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
5d40: 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a  e write.       *
5d50: 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
5d60: 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
5d70: 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ck..       */.  
5d80: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
5d90: 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
5da0: 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
5db0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5dc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
5dd0: 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ;.       }.    }
5de0: 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
5df0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65  }else{.    /* Se
5e00: 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e  arch for page in
5e10: 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50   cache */.    pP
5e20: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
5e30: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
5e40: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
5e50: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
5e60: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
5e70: 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65   not in the page
5e80: 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69   cache. */.    i
5e90: 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72  nt h;.    pPager
5ea0: 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69  ->nMiss++;.    i
5eb0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
5ec0: 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20  <pPager->mxPage 
5ed0: 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  || pPager->pFirs
5ee0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
5ef0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
5f00: 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20  ge */.      pPg 
5f10: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
5f20: 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 53  sizeof(*pPg) + S
5f30: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20  QLITE_PAGE_SIZE 
5f40: 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
5f50: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
5f60: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
5f70: 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
5f80: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69       pager_unwri
5f90: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
5fa0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
5fb0: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
5fc0: 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20  _ERR_MEM;.      
5fd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5fe0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
5ff0: 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
6000: 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20   = pPager;.     
6010: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d   pPg->pNextAll =
6020: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20   pPager->pAll;. 
6030: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
6040: 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  >pAll ){.       
6050: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 2d 3e 70   pPager->pAll->p
6060: 50 72 65 76 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  PrevAll = pPg;. 
6070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
6080: 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 30 3b 0a  ->pPrevAll = 0;.
6090: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
60a0: 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ll = pPg;.      
60b0: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
60c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
60d0: 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20    /* Recycle an 
60e0: 6f 6c 64 65 72 20 70 61 67 65 2e 20 20 46 69 72  older page.  Fir
60f0: 73 74 20 6c 6f 63 61 74 65 20 74 68 65 20 70 61  st locate the pa
6100: 67 65 20 74 6f 20 62 65 20 72 65 63 79 63 6c 65  ge to be recycle
6110: 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 72 79 20  d..      ** Try 
6120: 74 6f 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74  to find one that
6130: 20 69 73 20 6e 6f 74 20 64 69 72 74 79 20 61 6e   is not dirty an
6140: 64 20 69 73 20 6e 65 61 72 20 74 68 65 20 68 65  d is near the he
6150: 61 64 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 6f  ad of.      ** o
6160: 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  f the free list 
6170: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 69 6e 74 20  */.      /* int 
6180: 63 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78  cnt = pPager->mx
6190: 50 61 67 65 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  Page/2; */.     
61a0: 20 69 6e 74 20 63 6e 74 20 3d 20 31 30 3b 0a 20   int cnt = 10;. 
61b0: 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
61c0: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  r->pFirst;.     
61d0: 20 77 68 69 6c 65 28 20 70 50 67 2d 3e 64 69 72   while( pPg->dir
61e0: 74 79 20 26 26 20 30 3c 63 6e 74 2d 2d 20 26 26  ty && 0<cnt-- &&
61f0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
6200: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d  ){.        pPg =
6210: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
6220: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6230: 66 28 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67  f( pPg==0 || pPg
6240: 2d 3e 64 69 72 74 79 20 29 20 70 50 67 20 3d 20  ->dirty ) pPg = 
6250: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
6260: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
6270: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
6280: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
6290: 61 67 65 20 74 6f 20 62 65 20 72 65 63 79 63 6c  age to be recycl
62a0: 65 64 20 69 73 20 64 69 72 74 79 2c 20 73 79 6e  ed is dirty, syn
62b0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  c the journal an
62c0: 64 20 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a  d write .      *
62d0: 2a 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 69  * the old page i
62e0: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
62f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
6300: 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
6310: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
6320: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
6330: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 3d 3d 31 20 29  ->inJournal==1 )
6340: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6350: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
6360: 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  =SQLITE_WRITELOC
6370: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  K );.        if(
6380: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
6390: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
63a0: 63 20 3d 20 66 73 79 6e 63 28 70 50 61 67 65 72  c = fsync(pPager
63b0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
63c0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
63d0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
63e0: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
63f0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
6400: 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67            *ppPag
6410: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
6420: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6430: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49  E_OK ) rc = SQLI
6440: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
6450: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6460: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6470: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
6480: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
6490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
64a0: 61 67 65 72 5f 73 65 65 6b 28 70 50 61 67 65 72  ager_seek(pPager
64b0: 2d 3e 66 64 2c 20 28 70 50 67 2d 3e 70 67 6e 6f  ->fd, (pPg->pgno
64c0: 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  -1)*SQLITE_PAGE_
64d0: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 72  SIZE);.        r
64e0: 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
64f0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
6500: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
6510: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
6520: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
6530: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6540: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
6550: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
6560: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
6570: 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
6580: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
6590: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
65a0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55  ) rc = SQLITE_FU
65b0: 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  LL;.          re
65c0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
65d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
65e0: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
65f0: 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68  old page from th
6600: 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20  e free list and 
6610: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20  the hash table. 
6620: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
6630: 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
6640: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
6650: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
6660: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
6670: 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 65  xtFree;.      }e
6680: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
6690: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
66a0: 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rst==pPg );.    
66b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
66c0: 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
66d0: 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ree;.      }.   
66e0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
66f0: 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  tFree ){.       
6700: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
6710: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
6720: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
6730: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6740: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
6750: 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
6760: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
6770: 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
6780: 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a  evFree;.      }.
6790: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
67a0: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
67b0: 76 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  vFree = 0;.     
67c0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
67d0: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ash ){.        p
67e0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
67f0: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
6800: 70 50 72 65 76 48 61 73 68 3b 0a 20 20 20 20 20  pPrevHash;.     
6810: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
6820: 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
6830: 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65         pPg->pPre
6840: 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
6850: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
6860: 68 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  h;.      }else{.
6870: 20 20 20 20 20 20 20 20 68 20 3d 20 70 61 67 65          h = page
6880: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
6890: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
68a0: 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
68b0: 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  [h]==pPg );.    
68c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
68d0: 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
68e0: 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  tHash;.      }. 
68f0: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
6900: 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
6910: 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
6920: 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b  pPager->nOvfl++;
6930: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
6940: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
6950: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
6960: 4a 6f 75 72 6e 61 6c 20 26 26 20 70 67 6e 6f 3c  Journal && pgno<
6970: 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
6980: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ize ){.      pPg
6990: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
69a0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
69b0: 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
69c0: 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
69d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
69e0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
69f0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
6a00: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
6a10: 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
6a20: 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
6a30: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
6a40: 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70  Ref++;.    h = p
6a50: 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b  ager_hash(pgno);
6a60: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
6a70: 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
6a80: 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67  ash[h];.    pPag
6a90: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
6aa0: 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
6ab0: 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
6ac0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
6ad0: 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
6ae0: 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
6af0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
6b00: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
6b10: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
6b20: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
6b30: 30 20 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f  0 ) sqlitepager_
6b40: 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
6b50: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
6b60: 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 29  r->dbSize<pgno )
6b70: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
6b80: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
6b90: 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  ), 0, SQLITE_PAG
6ba0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c  E_SIZE);.    }el
6bb0: 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  se{.      pager_
6bc0: 73 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  seek(pPager->fd,
6bd0: 20 28 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45   (pgno-1)*SQLITE
6be0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
6bf0: 20 20 20 70 61 67 65 72 5f 72 65 61 64 28 70 50     pager_read(pP
6c00: 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
6c10: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51  TO_DATA(pPg), SQ
6c20: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
6c30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6c40: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
6c50: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
6c60: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
6c70: 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
6c80: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
6c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
6ca0: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
6cb0: 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
6cc0: 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70   cache. */.    p
6cd0: 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20  Pager->nHit++;. 
6ce0: 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
6cf0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
6d00: 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
6d10: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
6d20: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6d30: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
6d40: 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
6d50: 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
6d60: 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
6d70: 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
6d80: 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
6d90: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6da0: 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
6db0: 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
6dc0: 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
6dd0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
6de0: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65  o sqlitepager_ge
6df0: 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
6e00: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
6e10: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
6e20: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74   sqlitepager_get
6e30: 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
6e40: 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
6e50: 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
6e60: 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
6e70: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
6e80: 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
6e90: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
6ea0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
6eb0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
6ec0: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
6ed0: 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
6ee0: 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
6ef0: 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f   happened..*/.vo
6f00: 69 64 20 2a 73 71 6c 69 74 65 70 61 67 65 72 5f  id *sqlitepager_
6f10: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
6f20: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
6f30: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
6f40: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
6f50: 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
6f60: 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
6f70: 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  ors..  */ .  if(
6f80: 20 70 50 61 67 65 72 3d 3d 30 20 7c 7c 20 70 67   pPager==0 || pg
6f90: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
6fa0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
6fb0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
6fc0: 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46   & ~(PAGER_ERR_F
6fd0: 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ULL) ){.    retu
6fe0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
6ff0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
7000: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7010: 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67  .  }.  pPg = pag
7020: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
7030: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
7040: 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Pg==0 ) return 0
7050: 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
7060: 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  );.  return PGHD
7070: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
7080: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
7090: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
70a0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
70b0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
70c0: 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
70d0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
70e0: 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
70f0: 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
7100: 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
7110: 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
7120: 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
7130: 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
7140: 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
7150: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
7160: 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
7170: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
7180: 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a  ger_unref(void *
7190: 70 44 61 74 61 29 7b 0a 20 20 50 61 67 65 72 20  pData){.  Pager 
71a0: 2a 70 50 61 67 65 72 3b 0a 20 20 50 67 48 64 72  *pPager;.  PgHdr
71b0: 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63   *pPg;..  /* Dec
71c0: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
71d0: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
71e0: 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
71f0: 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
7200: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73  HDR(pData);.  as
7210: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
7220: 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  0 );.  pPager = 
7230: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70  pPg->pPager;.  p
7240: 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
7250: 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f  FINFO(pPg);..  /
7260: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
7270: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
7280: 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
7290: 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
72a0: 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
72b0: 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
72c0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
72d0: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
72e0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 67  ef==0 ){.    pPg
72f0: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
7300: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
7310: 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
7320: 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
7330: 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
7340: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
7350: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
7360: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
7370: 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
7380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7390: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
73a0: 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
73b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
73c0: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
73d0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
73e0: 63 74 6f 72 28 70 44 61 74 61 29 3b 0a 20 20 20  ctor(pData);.   
73f0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
7400: 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
7410: 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
7420: 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
7430: 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
7440: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7450: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
7460: 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
7470: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7480: 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
7490: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
74a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67  ==0 ){.      pag
74b0: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
74c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
74d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
74e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
74f0: 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
7500: 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
7510: 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
7520: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
7530: 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
7540: 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
7550: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
7560: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
7570: 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
7580: 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
7590: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
75a0: 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
75b0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
75c0: 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
75d0: 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
75e0: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 77 72  nd acquires a wr
75f0: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
7600: 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
7610: 65 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20  e write.** lock 
7620: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
7630: 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
7640: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
7650: 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
7660: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
7670: 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
7680: 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
7690: 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
76a0: 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
76b0: 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
76c0: 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
76d0: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
76e0: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
76f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7700: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
7710: 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
7720: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
7730: 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
7740: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
7750: 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
7760: 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
7770: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
7780: 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
7790: 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
77a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
77b0: 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
77c0: 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
77d0: 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  itepager_commit(
77e0: 29 20 6f 72 20 73 71 6c 69 74 65 70 61 67 65 72  ) or sqlitepager
77f0: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  _rollback() to.*
7800: 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20  * reset..*/.int 
7810: 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74  sqlitepager_writ
7820: 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  e(void *pData){.
7830: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
7840: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
7850: 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
7860: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7870: 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
7880: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
7890: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
78a0: 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
78b0: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
78c0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
78d0: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
78e0: 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
78f0: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
7900: 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20  .  pPg->dirty = 
7910: 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  1;.  if( pPg->in
7920: 4a 6f 75 72 6e 61 6c 20 29 7b 20 72 65 74 75 72  Journal ){ retur
7930: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20  n SQLITE_OK; }. 
7940: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7950: 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55  >state!=SQLITE_U
7960: 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
7970: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51  Pager->state==SQ
7980: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 29 7b  LITE_READLOCK ){
7990: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
79a0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
79b0: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
79c0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
79d0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
79e0: 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
79f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  1 );.    if( pPa
7a00: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
7a10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
7a20: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
7a30: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
7a40: 72 2d 3e 6a 66 64 20 3d 20 6f 70 65 6e 28 70 50  r->jfd = open(pP
7a50: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
7a60: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
7a70: 30 36 34 34 29 3b 0a 20 20 20 20 69 66 28 20 70  0644);.    if( p
7a80: 50 61 67 65 72 2d 3e 6a 66 64 3c 30 20 29 7b 0a  Pager->jfd<0 ){.
7a90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7aa0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
7ab0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
7ac0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
7ad0: 20 20 69 66 28 20 70 61 67 65 72 5f 6c 6f 63 6b    if( pager_lock
7ae0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29  (pPager->jfd, 1)
7af0: 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28   ){.      close(
7b00: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
7b10: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20      pPager->jfd 
7b20: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
7b30: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
7b40: 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
7b50: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  unlock(pPager->f
7b60: 64 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  d);.    if( page
7b70: 72 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  r_lock(pPager->f
7b80: 64 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 63  d, 1) ){.      c
7b90: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
7ba0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
7bb0: 3e 6a 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20  >jfd = -1;.     
7bc0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7bd0: 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a   SQLITE_UNLOCK;.
7be0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
7bf0: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
7c00: 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 72  RR_LOCK;.      r
7c10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 52 4f  eturn SQLITE_PRO
7c20: 54 4f 43 4f 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  TOCOL;.    }.   
7c30: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7c40: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
7c50: 4b 3b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67  K;.    sqlitepag
7c60: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
7c70: 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
7c80: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
7c90: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
7ca0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
7cb0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7cc0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
7cd0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7ce0: 61 67 69 63 29 29 3b 0a 20 20 20 20 69 66 28 20  agic));.    if( 
7cf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7d00: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
7d10: 72 5f 77 72 69 74 65 28 70 50 61 67 65 72 2d 3e  r_write(pPager->
7d20: 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 64 62  jfd, &pPager->db
7d30: 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 50 67 6e  Size, sizeof(Pgn
7d40: 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  o));.    }.    i
7d50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7d60: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
7d70: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
7d80: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
7d90: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7da0: 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
7db0: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 72 65 74 75  FULL;.      retu
7dc0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
7dd0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7de0: 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45  r->state==SQLITE
7df0: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20  _WRITELOCK );.  
7e00: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
7e10: 6a 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  jfd>=0 );.  if( 
7e20: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
7e30: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
7e40: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
7e50: 72 5f 77 72 69 74 65 28 70 50 61 67 65 72 2d 3e  r_write(pPager->
7e60: 6a 66 64 2c 20 26 70 50 67 2d 3e 70 67 6e 6f 2c  jfd, &pPg->pgno,
7e70: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a   sizeof(Pgno));.
7e80: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
7e90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
7ea0: 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
7eb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
7ec0: 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ta, SQLITE_PAGE_
7ed0: 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  SIZE);.    }.   
7ee0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7ef0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
7f00: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
7f10: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
7f20: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
7f30: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
7f40: 4c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  L;.      return 
7f50: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
7f60: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
7f70: 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
7f80: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
7f90: 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
7fa0: 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
7fb0: 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 61 67  gno&7);.    pPag
7fc0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
7fd0: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a  ;.  }.  pPg->inJ
7fe0: 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 69 66  ournal = 1;.  if
7ff0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
8000: 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  <pPg->pgno ){.  
8010: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
8020: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
8030: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8040: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
8050: 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
8060: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
8070: 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
8080: 75 73 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  us passed.** to 
8090: 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74  sqlitepager_writ
80a0: 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
80b0: 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
80c0: 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
80d0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
80e0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
80f0: 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
8100: 65 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  epager_iswriteab
8110: 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  le(void *pData){
8120: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
8130: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
8140: 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
8150: 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  Pg->dirty;.}../*
8160: 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
8170: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
8180: 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
8190: 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
81a0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
81b0: 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
81c0: 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
81d0: 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
81e0: 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
81f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
8200: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
8210: 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
8220: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
8230: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
8240: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f  t sqlitepager_co
8250: 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
8260: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
8270: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
8280: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
8290: 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask==PAGER_ERR_F
82a0: 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
82b0: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
82c0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
82d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
82e0: 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54  _OK ) rc = SQLIT
82f0: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75  E_FULL;.    retu
8300: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
8310: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
8320: 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
8330: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
8340: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
8350: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
8360: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53  pPager->state!=S
8370: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
8380: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8390: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
83a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
83b0: 2d 3e 6a 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66  ->jfd>=0 );.  if
83c0: 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
83d0: 6e 63 20 26 26 20 66 73 79 6e 63 28 70 50 61 67  nc && fsync(pPag
83e0: 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
83f0: 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
8400: 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67  t;.  }.  for(pPg
8410: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
8420: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
8430: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
8440: 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 20  pPg->dirty==0 ) 
8450: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63  continue;.    rc
8460: 20 3d 20 70 61 67 65 72 5f 73 65 65 6b 28 70 50   = pager_seek(pP
8470: 61 67 65 72 2d 3e 66 64 2c 20 28 70 50 67 2d 3e  ager->fd, (pPg->
8480: 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50  pgno-1)*SQLITE_P
8490: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69  AGE_SIZE);.    i
84a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
84b0: 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61   ) goto commit_a
84c0: 62 6f 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 70  bort;.    rc = p
84d0: 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
84e0: 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
84f0: 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54  DATA(pPg), SQLIT
8500: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
8510: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8520: 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
8530: 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  t_abort;.  }.  i
8540: 66 28 20 66 73 79 6e 63 28 70 50 61 67 65 72 2d  f( fsync(pPager-
8550: 3e 66 64 29 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  >fd) ) goto comm
8560: 69 74 5f 61 62 6f 72 74 3b 0a 20 20 72 63 20 3d  it_abort;.  rc =
8570: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
8580: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ck(pPager);.  pP
8590: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
85a0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
85b0: 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
85c0: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
85d0: 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68   wrong during th
85e0: 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
85f0: 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62  ..  */.commit_ab
8600: 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ort:.  rc = sqli
8610: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
8620: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
8630: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8640: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
8650: 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74  _FULL;.  }.  ret
8660: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8670: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
8680: 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
8690: 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
86a0: 74 6f 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64  to read-only mod
86b0: 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
86c0: 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
86d0: 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
86e0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
86f0: 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
8700: 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
8710: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
8720: 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
8730: 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
8740: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
8750: 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
8760: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
8770: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51  ing protocol (SQ
8780: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f  LITE_PROTOCOL) o
8790: 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
87a0: 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
87b0: 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
87c0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
87d0: 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
87e0: 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
87f0: 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
8800: 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
8810: 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
8820: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
8830: 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
8840: 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
8850: 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
8860: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
8870: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
8880: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8890: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
88a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
88b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
88c0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
88d0: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  =0 && pPager->er
88e0: 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52  rMask!=PAGER_ERR
88f0: 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
8900: 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
8910: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
8920: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
8930: 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45  te!=SQLITE_WRITE
8940: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
8950: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8960: 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70  }.  rc = pager_p
8970: 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
8980: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8990: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
89a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
89b0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
89c0: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
89d0: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20  R_CORRUPT;.  }. 
89e0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
89f0: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72  = -1;.  return r
8a00: 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.};../*.** Ret
8a10: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
8a20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
8a30: 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
8a40: 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
8a50: 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
8a60: 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
8a70: 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
8a80: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
8a90: 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  isreadonly(Pager
8aa0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
8ab0: 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
8ac0: 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Only;.}../*.** T
8ad0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
8ae0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
8af0: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
8b00: 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
8b10: 65 70 61 67 65 72 5f 73 74 61 74 73 28 50 61 67  epager_stats(Pag
8b20: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
8b30: 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a  tatic int a[9];.
8b40: 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d    a[0] = pPager-
8b50: 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20  >nRef;.  a[1] = 
8b60: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20  pPager->nPage;. 
8b70: 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[2] = pPager->
8b80: 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d  mxPage;.  a[3] =
8b90: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
8ba0: 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72  .  a[4] = pPager
8bb0: 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20  ->state;.  a[5] 
8bc0: 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  = pPager->errMas
8bd0: 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  k;.  a[6] = pPag
8be0: 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
8bf0: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
8c00: 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65  ;.  a[8] = pPage
8c10: 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75  r->nOvfl;.  retu
8c20: 72 6e 20 61 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  rn a;.}..#if SQL
8c30: 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50  ITE_TEST./*.** P
8c40: 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
8c50: 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
8c60: 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
8c70: 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
8c80: 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f  oid sqlitepager_
8c90: 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70  refdump(Pager *p
8ca0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
8cb0: 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d  *pPg;.  for(pPg=
8cc0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
8cd0: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
8ce0: 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
8cf0: 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f  Pg->nRef<=0 ) co
8d00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72 69 6e  ntinue;.    prin
8d10: 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
8d20: 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64  r=0x%08x nRef=%d
8d30: 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
8d40: 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48  ->pgno, (int)PGH
8d50: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
8d60: 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d   pPg->nRef);.  }
8d70: 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.