/ Hex Artifact Content
Login

Artifact 3e864a3e6cdec6f000a343f793360b42714028d8:


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 6f 6e 65  re reader or one
0490: 20 77 72 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 40   writer..**.** @
04a0: 28 23 29 20 24 49 64 3a 20 70 61 67 65 72 2e 63  (#) $Id: pager.c
04b0: 2c 76 20 31 2e 31 32 20 32 30 30 31 2f 30 36 2f  ,v 1.12 2001/06/
04c0: 32 38 20 30 31 3a 35 34 3a 34 39 20 64 72 68 20  28 01:54:49 drh 
04d0: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
04e0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
04f0: 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65 72 2e  #include "pager.
0500: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e  h".#include <fcn
0510: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0520: 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63  sys/stat.h>.#inc
0530: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
0540: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0550: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0560: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  ring.h>../*.** T
0570: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0580: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0590: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
05a0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
05b0: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51  ates:.**.**   SQ
05c0: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20  LITE_UNLOCK     
05d0: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
05e0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
05f0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
0620: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0630: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
0640: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0650: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0660: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0670: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0680: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0690: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
06a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
06b0: 5f 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68  _READLOCK     Th
06c0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
06d0: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
06e0: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
0700: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
0710: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
0720: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0750: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0760: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0790: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
07a0: 2a 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54  **   SQLITE_WRIT
07b0: 45 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67  ELOCK    The pag
07c0: 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69  e cache is writi
07d0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
07e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
07f0: 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73            Access
0800: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
0810: 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  No other process
0820: 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  es or.**        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
0840: 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65  hreads can be re
0850: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
0860: 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20   while one.**   
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77      process is w
0890: 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  riting..**.** Th
08a0: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
08b0: 65 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f  es up in SQLITE_
08c0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
08d0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
08e0: 69 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f  ite_page_get() o
08f0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0900: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0910: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
0920: 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61  .** After all pa
0930: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  ges have been re
0940: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
0950: 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29  ite_page_unref()
0960: 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74  ,.** the state t
0970: 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20  ransitions back 
0980: 74 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b  to SQLITE_UNLOCK
0990: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
09a0: 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65  e.** that sqlite
09b0: 5f 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73  _page_write() is
09c0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
09d0: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
09e0: 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54  o.** SQLITE_WRIT
09f0: 45 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68  ELOCK.  (Note th
0a00: 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77  at sqlite_page_w
0a10: 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20  rite() can only 
0a20: 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20  be.** called on 
0a30: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  an outstanding p
0a40: 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20  age which means 
0a50: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d  that the pager m
0a60: 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c  ust.** be in SQL
0a70: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66  ITE_READLOCK bef
0a80: 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f  ore it transitio
0a90: 6e 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49  ns to SQLITE_WRI
0aa0: 54 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20  TELOCK.).** The 
0ab0: 73 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c  sqlite_page_roll
0ac0: 62 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74  back() and sqlit
0ad0: 65 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20  e_page_commit() 
0ae0: 66 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72  functions .** tr
0af0: 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61  ansition the sta
0b00: 74 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57  te from SQLITE_W
0b10: 52 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f  RITELOCK back to
0b20: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
0b30: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  ..*/.#define SQL
0b40: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0b50: 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  0.#define SQLITE
0b60: 5f 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23  _READLOCK    1.#
0b70: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52  define SQLITE_WR
0b80: 49 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a  ITELOCK   2.../*
0b90: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
0ba0: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
0bb0: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
0bc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
0bd0: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
0be0: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
0bf0: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
0c00: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
0c10: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
0c20: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
0c30: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
0c40: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
0c50: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 74 79  he header..*/.ty
0c60: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
0c70: 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74  dr PgHdr;.struct
0c80: 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72   PgHdr {.  Pager
0c90: 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
0ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0cb0: 20 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20   pager to which 
0cc0: 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67  this page belong
0cd0: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
0ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0cf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
0d00: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  e number for thi
0d10: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
0d20: 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70  r *pNextHash, *p
0d30: 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61  PrevHash;  /* Ha
0d40: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
0d50: 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e  in for PgHdr.pgn
0d60: 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  o */.  int nRef;
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0d90: 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73  of users of this
0da0: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
0db0: 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50   *pNextFree, *pP
0dc0: 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65  revFree;  /* Fre
0dd0: 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77  elist of pages w
0de0: 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a  here nRef==0 */.
0df0: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c    PgHdr *pNextAl
0e00: 6c 2c 20 2a 70 50 72 65 76 41 6c 6c 3b 20 20 20  l, *pPrevAll;   
0e10: 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
0e20: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 63 68 61  l pages */.  cha
0e30: 72 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r inJournal;    
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0e50: 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e 20  RUE if has been 
0e60: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
0e70: 61 6c 20 2a 2f 0a 20 20 63 68 61 72 20 64 69 72  al */.  char dir
0e80: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
0e90: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
0ea0: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69  f we need to wri
0eb0: 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20  te back changes 
0ec0: 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  */.  /* SQLITE_P
0ed0: 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f  AGE_SIZE bytes o
0ee0: 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c  f page data foll
0ef0: 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20 2a  ow this header *
0f00: 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78  /.  /* Pager.nEx
0f10: 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63  tra bytes of loc
0f20: 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74  al data follow t
0f30: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
0f40: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  };../*.** Conver
0f50: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
0f60: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
0f70: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
0f80: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
0f90: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
0fa0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
0fb0: 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b    ((void*)(&(P)[
0fc0: 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54  1])).#define DAT
0fd0: 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28  A_TO_PGHDR(D)  (
0fe0: 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d  &((PgHdr*)(D))[-
0ff0: 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44  1]).#define PGHD
1000: 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20 28 28  R_TO_EXTRA(P) ((
1010: 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28  void*)&((char*)(
1020: 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49 54 45  &(P)[1]))[SQLITE
1030: 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f 2a  _PAGE_SIZE])../*
1040: 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20 6d  .** How big to m
1050: 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
1060: 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 61  le used for loca
1070: 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  ting in-memory p
1080: 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65 20  ages.** by page 
1090: 6e 75 6d 62 65 72 2e 20 20 4b 6e 75 74 68 20 73  number.  Knuth s
10a0: 61 79 73 20 74 68 69 73 20 73 68 6f 75 6c 64 20  ays this should 
10b0: 62 65 20 61 20 70 72 69 6d 65 20 6e 75 6d 62 65  be a prime numbe
10c0: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f  r..*/.#define N_
10d0: 50 47 5f 48 41 53 48 20 31 30 31 0a 0a 2f 2a 0a  PG_HASH 101../*.
10e0: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
10f0: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
1100: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1110: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1120: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
1130: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
1140: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1150: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1160: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1170: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
1180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1190: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
11a0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
11b0: 6e 74 20 66 64 2c 20 6a 66 64 3b 20 20 20 20 20  nt fd, jfd;     
11c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
11d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
11e0: 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  or database and 
11f0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
1200: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
1210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1220: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1230: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
1240: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
1250: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
1260: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
1270: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
1280: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12a0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
12b0: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
12c0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
12d0: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
12e0: 74 6f 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  tor)(void*); /* 
12f0: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
1300: 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70  e when freeing p
1310: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  ages */.  int nP
1320: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1330: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1340: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
1350: 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  ry pages */.  in
1360: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
1370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1380: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
1390: 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64   pages with PgHd
13a0: 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e  r.nRef>0 */.  in
13b0: 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20  t mxPage;       
13c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
13d0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
13e0: 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20  ages to hold in 
13f0: 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cache */.  int n
1400: 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66  Hit, nMiss, nOvf
1410: 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20  l;     /* Cache 
1420: 68 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61  hits, missing, a
1430: 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73  nd LRU overflows
1440: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1450: 68 61 72 20 73 74 61 74 65 3b 20 20 20 20 20 20  har state;      
1460: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 4c 4f    /* SQLITE_UNLO
1470: 43 4b 2c 20 5f 52 45 41 44 4c 4f 43 4b 20 6f 72  CK, _READLOCK or
1480: 20 5f 57 52 49 54 45 4c 4f 43 4b 20 2a 2f 0a 20   _WRITELOCK */. 
1490: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65   unsigned char e
14a0: 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 2f 2a 20  rrMask;      /* 
14b0: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
14c0: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
14d0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
14e0: 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20  t, *pLast;      
14f0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
1500: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
1510: 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20   *pAll;         
1520: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1530: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
1540: 20 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f   PgHdr *aHash[N_
1550: 50 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20  PG_HASH];    /* 
1560: 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61  Hash table to ma
1570: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  p page number of
1580: 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   PgHdr */.};../*
1590: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69  .** These are bi
15a0: 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ts that can be s
15b0: 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d  et in Pager.errM
15c0: 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask..*/.#define 
15d0: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20  PAGER_ERR_FULL  
15e0: 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72     0x01  /* a wr
15f0: 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  ite() failed */.
1600: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
1610: 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20  R_MEM      0x02 
1620: 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   /* malloc() fai
1630: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
1640: 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20  AGER_ERR_LOCK   
1650: 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72    0x04  /* error
1660: 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
1670: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66  protocol */.#def
1680: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  ine PAGER_ERR_CO
1690: 52 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20  RRUPT  0x08  /* 
16a0: 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72  database or jour
16b0: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  nal corruption *
16c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  /../*.** The jou
16d0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
16e0: 6e 73 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ns page records 
16f0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1700: 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 74  .** format..*/.t
1710: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61  ypedef struct Pa
1720: 67 65 52 65 63 6f 72 64 20 50 61 67 65 52 65 63  geRecord PageRec
1730: 6f 72 64 3b 0a 73 74 72 75 63 74 20 50 61 67 65  ord;.struct Page
1740: 52 65 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20  Record {.  Pgno 
1750: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
1760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1770: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
1780: 20 20 63 68 61 72 20 61 44 61 74 61 5b 53 51 4c    char aData[SQL
1790: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20  ITE_PAGE_SIZE]; 
17a0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 64 61 74   /* Original dat
17b0: 61 20 66 6f 72 20 70 61 67 65 20 70 67 6e 6f 20  a for page pgno 
17c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  */.};../*.** Jou
17d0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
17e0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
17f0: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
1800: 2e 20 20 54 68 69 73 20 64 61 74 61 0a 2a 2a 20  .  This data.** 
1810: 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 61  is completely ra
1820: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
1830: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
1840: 74 79 20 63 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61  ty check..*/.sta
1850: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
1860: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
1870: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
1880: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
1890: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
18a0: 2c 20 30 78 36 33 2c 20 30 78 64 34 2c 0a 7d 3b  , 0x63, 0xd4,.};
18b0: 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20 70  ../*.** Hash a p
18c0: 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64  age number.*/.#d
18d0: 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61 73 68  efine pager_hash
18e0: 28 50 4e 29 20 20 28 28 50 4e 29 25 4e 5f 50 47  (PN)  ((PN)%N_PG
18f0: 5f 48 41 53 48 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e  _HASH)../*.** En
1900: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63  able reference c
1910: 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 68 65  ount tracking he
1920: 72 65 3a 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  re:.*/.#if SQLIT
1930: 45 5f 54 45 53 54 0a 69 6e 74 20 70 61 67 65 72  E_TEST.int pager
1940: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
1950: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f  = 0;.  static vo
1960: 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  id pager_refinfo
1970: 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20  (PgHdr *p){.    
1980: 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d  static int cnt =
1990: 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67   0;.    if( !pag
19a0: 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  er_refinfo_enabl
19b0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
19c0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  printf(.       "
19d0: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
19e0: 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c  =0x%08x nRef=%d\
19f0: 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67  n",.       p->pg
1a00: 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54  no, (int)PGHDR_T
1a10: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
1a20: 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e  ef.    );.    cn
1a30: 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68  t++;   /* Someth
1a40: 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65  ing to set a bre
1a50: 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20  akpoint on */.  
1a60: 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e  }.# define REFIN
1a70: 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66  FO(X)  pager_ref
1a80: 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20  info(X).#else.# 
1a90: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
1aa0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1ab0: 41 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  Attempt to acqui
1ac0: 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 28  re a read lock (
1ad0: 69 66 20 77 72 6c 6f 63 6b 3d 3d 30 29 20 6f 72  if wrlock==0) or
1ae0: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 28 69   a write lock (i
1af0: 66 20 77 72 6c 6f 63 6b 3d 3d 31 29 0a 2a 2a 20  f wrlock==1).** 
1b00: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1b10: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 30 20  file.  Return 0 
1b20: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 6e  on success and n
1b30: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c  on-zero if the l
1b40: 6f 63 6b 20 0a 2a 2a 20 63 6f 75 6c 64 20 6e 6f  ock .** could no
1b50: 74 20 62 65 20 61 63 71 75 69 72 65 64 2e 0a 2a  t be acquired..*
1b60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1b70: 65 72 5f 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20  er_lock(int fd, 
1b80: 69 6e 74 20 77 72 6c 6f 63 6b 29 7b 0a 20 20 69  int wrlock){.  i
1b90: 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
1ba0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 6c 6f  flock lock;.  lo
1bb0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 77 72 6c 6f  ck.l_type = wrlo
1bc0: 63 6b 20 3f 20 46 5f 57 52 4c 43 4b 20 3a 20 46  ck ? F_WRLCK : F
1bd0: 5f 52 44 4c 43 4b 3b 0a 20 20 6c 6f 63 6b 2e 6c  _RDLCK;.  lock.l
1be0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
1bf0: 45 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ET;.  lock.l_sta
1c00: 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
1c10: 3d 20 30 4c 3b 0a 20 20 72 63 20 3d 20 66 63 6e  = 0L;.  rc = fcn
1c20: 74 6c 28 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20  tl(fd, F_SETLK, 
1c30: 26 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e  &lock);.  return
1c40: 20 72 63 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   rc!=0;.}../*.**
1c50: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
1c60: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
1c70: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75  atic int pager_u
1c80: 6e 6c 6f 63 6b 28 66 64 29 7b 0a 20 20 69 6e 74  nlock(fd){.  int
1c90: 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 66 6c   rc;.  struct fl
1ca0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 6c 6f 63 6b  ock lock;.  lock
1cb0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
1cc0: 4b 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  K;.  lock.l_when
1cd0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
1ce0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
1cf0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
1d00: 0a 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64  .  rc = fcntl(fd
1d10: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
1d20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 21 3d  );.  return rc!=
1d30: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
1d40: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
1d50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1d60: 66 64 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20  fd to the point 
1d70: 77 68 65 72 65 74 6f 20 66 72 6f 6d 0a 2a 2a 20  whereto from.** 
1d80: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1d90: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
1da0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
1db0: 65 65 6b 28 69 6e 74 20 66 64 2c 20 6f 66 66 5f  eek(int fd, off_
1dc0: 74 20 77 68 65 72 65 74 6f 29 7b 0a 20 20 6c 73  t whereto){.  ls
1dd0: 65 65 6b 28 66 64 2c 20 77 68 65 72 65 74 6f 2c  eek(fd, whereto,
1de0: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 72 65   SEEK_SET);.  re
1df0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1e10: 65 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  e the given file
1e20: 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74   so that it cont
1e30: 61 69 6e 73 20 65 78 61 63 74 6c 79 20 6d 78 50  ains exactly mxP
1e40: 67 20 70 61 67 65 73 0a 2a 2a 20 6f 66 20 64 61  g pages.** of da
1e50: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ta..*/.static in
1e60: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
1e70: 28 69 6e 74 20 66 64 2c 20 50 67 6e 6f 20 6d 78  (int fd, Pgno mx
1e80: 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Pg){.  int rc;. 
1e90: 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28   rc = ftruncate(
1ea0: 66 64 2c 20 6d 78 50 67 2a 53 51 4c 49 54 45 5f  fd, mxPg*SQLITE_
1eb0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 72 65  PAGE_SIZE);.  re
1ec0: 74 75 72 6e 20 72 63 21 3d 30 20 3f 20 53 51 4c  turn rc!=0 ? SQL
1ed0: 49 54 45 5f 49 4f 45 52 52 20 3a 20 53 51 4c 49  ITE_IOERR : SQLI
1ee0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1ef0: 52 65 61 64 20 6e 42 79 74 65 73 20 6f 66 20 64  Read nBytes of d
1f00: 61 74 61 20 66 72 6f 6d 20 66 64 20 69 6e 74 6f  ata from fd into
1f10: 20 70 42 75 66 2e 20 20 49 66 20 74 68 65 20 64   pBuf.  If the d
1f20: 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ata cannot be.**
1f30: 20 72 65 61 64 20 6f 72 20 6f 6e 6c 79 20 61 20   read or only a 
1f40: 70 61 72 74 69 61 6c 20 72 65 61 64 20 6f 63 63  partial read occ
1f50: 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 75 6e  urs, then the un
1f60: 72 65 61 64 20 70 61 72 74 73 20 6f 66 0a 2a 2a  read parts of.**
1f70: 20 70 42 75 66 20 61 72 65 20 66 69 6c 6c 65 64   pBuf are filled
1f80: 20 77 69 74 68 20 7a 65 72 6f 73 20 61 6e 64 20   with zeros and 
1f90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1fa0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  urns SQLITE_IOER
1fb0: 52 2e 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61  R..** If the rea
1fc0: 64 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d is completely 
1fd0: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
1fe0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
1ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2000: 72 5f 72 65 61 64 28 69 6e 74 20 66 64 2c 20 76  r_read(int fd, v
2010: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 6e  oid *pBuf, int n
2020: 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Byte){.  int rc;
2030: 0a 20 20 72 63 20 3d 20 72 65 61 64 28 66 64 2c  .  rc = read(fd,
2040: 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
2050: 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
2060: 20 6d 65 6d 73 65 74 28 70 42 75 66 2c 20 30 2c   memset(pBuf, 0,
2070: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74   nByte);.    ret
2080: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2090: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3c 6e  ;.  }.  if( rc<n
20a0: 42 79 74 65 20 29 7b 0a 20 20 20 20 6d 65 6d 73  Byte ){.    mems
20b0: 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
20c0: 29 5b 72 63 5d 2c 20 30 2c 20 6e 42 79 74 65 20  )[rc], 0, nByte 
20d0: 2d 20 72 63 29 3b 0a 20 20 20 20 72 63 20 3d 20  - rc);.    rc = 
20e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
20f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2100: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2110: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2120: 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 79 74 65  *.** Write nByte
2130: 73 20 6f 66 20 64 61 74 61 20 69 6e 74 6f 20 66  s of data into f
2140: 64 2e 20 20 49 66 20 61 6e 79 20 70 72 6f 62 6c  d.  If any probl
2150: 65 6d 20 6f 63 63 75 72 73 20 6f 72 20 69 66 20  em occurs or if 
2160: 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 69 73 20  the.** write is 
2170: 69 6e 63 6f 6d 70 6c 65 74 65 2c 20 53 51 4c 49  incomplete, SQLI
2180: 54 45 5f 49 4f 45 52 52 20 69 73 20 72 65 74 75  TE_IOERR is retu
2190: 72 6e 65 64 2e 20 20 53 51 4c 49 54 45 5f 4f 4b  rned.  SQLITE_OK
21a0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
21b0: 75 70 6f 6e 20 63 6f 6d 70 6c 65 74 65 20 73 75  upon complete su
21c0: 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccess..*/.static
21d0: 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
21e0: 28 69 6e 74 20 66 64 2c 20 63 6f 6e 73 74 20 76  (int fd, const v
21f0: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 6e  oid *pBuf, int n
2200: 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Byte){.  int rc;
2210: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 28 66 64  .  rc = write(fd
2220: 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
2230: 20 20 69 66 28 20 72 63 3c 6e 42 79 74 65 20 29    if( rc<nByte )
2240: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2250: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  ITE_FULL;.  }els
2260: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
2270: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
2280: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
2290: 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 70 50  e bits in the pP
22a0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e  ager->errMask in
22b0: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65  to an approprate
22c0: 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  .** return code.
22d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
22e0: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67  ager_errcode(Pag
22f0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2300: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2310: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
2320: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
2330: 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72  _ERR_LOCK )    r
2340: 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  c = SQLITE_PROTO
2350: 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65  COL;.  if( pPage
2360: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
2370: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20  ER_ERR_FULL )   
2380: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
2390: 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  L;.  if( pPager-
23a0: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
23b0: 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20 72  _ERR_MEM )     r
23c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
23d0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
23e0: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
23f0: 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63  ERR_CORRUPT ) rc
2400: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2410: 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  T;.  return rc;.
2420: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
2430: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
2440: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
2450: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
2460: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
2470: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
2480: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
2490: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
24a0: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
24b0: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
24c0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
24d0: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65  PgHdr *p = pPage
24e0: 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 25 20  r->aHash[pgno % 
24f0: 4e 5f 50 47 5f 48 41 53 48 5d 3b 0a 20 20 77 68  N_PG_HASH];.  wh
2500: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
2510: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
2520: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
2530: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
2540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
2550: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
2560: 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  d clear the in-m
2570: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
2580: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
2590: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
25a0: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
25b0: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
25c0: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
25d0: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
25e0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
25f0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
2600: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
2610: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
2620: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
2630: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
2640: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
2650: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
2660: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
2670: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2680: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
2690: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d  Next;.  for(pPg=
26a0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
26b0: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
26c0: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
26d0: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
26e0: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
26f0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69   }.  pPager->pFi
2700: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
2710: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
2720: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
2730: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
2740: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
2750: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2760: 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  h));.  pPager->n
2770: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
2780: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53  pPager->state==S
2790: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
27a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67  ){.    sqlitepag
27b0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
27c0: 65 72 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  er);.  }.  pager
27d0: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  _unlock(pPager->
27e0: 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  fd);.  pPager->s
27f0: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e  tate = SQLITE_UN
2800: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
2810: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
2820: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
2830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
2840: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2850: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
2860: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
2870: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
2880: 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  * a write lock o
2890: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
28a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
28b0: 6c 65 61 73 65 73 20 74 68 65 20 64 61 74 61 62  leases the datab
28c0: 61 73 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  ase.** write loc
28d0: 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  k and acquires a
28e0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 6e 20 69 74   read lock in it
28f0: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
2900: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
2910: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
2920: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 68 61  sed..**.** We ha
2930: 76 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  ve to release th
2940: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 62 65 66  e write lock bef
2950: 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 74 68  ore acquiring th
2960: 65 20 72 65 61 64 20 6c 6f 63 6b 2c 0a 2a 2a 20  e read lock,.** 
2970: 73 6f 20 74 68 65 72 65 20 69 73 20 61 20 72 61  so there is a ra
2980: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 68 65  ce condition whe
2990: 72 65 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  re another proce
29a0: 73 73 20 63 61 6e 20 67 65 74 20 74 68 65 20 6c  ss can get the l
29b0: 6f 63 6b 0a 2a 2a 20 77 68 69 6c 65 20 77 65 20  ock.** while we 
29c0: 61 72 65 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20  are not holding 
29d0: 69 74 2e 20 20 42 75 74 2c 20 6e 6f 20 6f 74 68  it.  But, no oth
29e0: 65 72 20 70 72 6f 63 65 73 73 20 73 68 6f 75 6c  er process shoul
29f0: 64 20 64 6f 20 74 68 69 73 0a 2a 2a 20 62 65 63  d do this.** bec
2a00: 61 75 73 65 20 77 65 20 61 72 65 20 61 6c 73 6f  ause we are also
2a10: 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 20   holding a lock 
2a20: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  on the journal, 
2a30: 61 6e 64 20 6e 6f 20 70 72 6f 63 65 73 73 0a 2a  and no process.*
2a40: 2a 20 73 68 6f 75 6c 64 20 67 65 74 20 61 20 77  * should get a w
2a50: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
2a60: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 6f 75   database withou
2a70: 74 20 66 69 72 73 74 20 67 65 74 74 69 6e 67 20  t first getting 
2a80: 61 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 74 68 65  a lock.** on the
2a90: 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 74 68   journal.  So th
2aa0: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
2ab0: 64 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 20 42  d never fail.  B
2ac0: 75 74 20 69 74 20 63 61 6e 20 66 61 69 6c 0a 2a  ut it can fail.*
2ad0: 2a 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  * if another pro
2ae0: 63 65 73 73 20 69 73 20 6e 6f 74 20 70 6c 61 79  cess is not play
2af0: 69 6e 67 20 62 79 20 74 68 65 20 72 75 6c 65 73  ing by the rules
2b00: 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 66 61  .  If it does fa
2b10: 69 6c 2c 0a 2a 2a 20 61 6c 6c 20 69 6e 2d 6d 65  il,.** all in-me
2b20: 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
2b30: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
2b40: 2c 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f  , the PAGER_ERR_
2b50: 4c 4f 43 4b 20 62 69 74 0a 2a 2a 20 69 73 20 73  LOCK bit.** is s
2b60: 65 74 20 69 6e 20 70 50 61 67 65 72 2d 3e 65 72  et in pPager->er
2b70: 72 4d 61 73 6b 2c 20 61 6e 64 20 74 68 69 73 20  rMask, and this 
2b80: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2b90: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2e  SQLITE_PROTOCOL.
2ba0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2bb0: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
2bc0: 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
2bd0: 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74  int pager_unwrit
2be0: 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  elock(Pager *pPa
2bf0: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
2c00: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
2c10: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
2c20: 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e!=SQLITE_WRITEL
2c30: 4f 43 4b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  OCK ) return SQL
2c40: 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65 72 5f  ITE_OK;.  pager_
2c50: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  unlock(pPager->f
2c60: 64 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  d);.  rc = pager
2c70: 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  _lock(pPager->fd
2c80: 2c 20 30 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 70  , 0);.  unlink(p
2c90: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
2ca0: 3b 0a 20 20 63 6c 6f 73 65 28 70 50 61 67 65 72  ;.  close(pPager
2cb0: 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72  ->jfd);.  pPager
2cc0: 2d 3e 6a 66 64 20 3d 20 2d 31 3b 0a 20 20 66 6f  ->jfd = -1;.  fo
2cd0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
2ce0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
2cf0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
2d00: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
2d10: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  = 0;.    pPg->di
2d20: 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  rty = 0;.  }.  i
2d30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d40: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2d50: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55  state = SQLITE_U
2d60: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  NLOCK;.    rc = 
2d70: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b  SQLITE_PROTOCOL;
2d80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
2d90: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
2da0: 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b  R_LOCK;.  }else{
2db0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2dc0: 5f 4f 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  _OK;.    pPager-
2dd0: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
2de0: 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  READLOCK;.  }.  
2df0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2e00: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
2e10: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
2e20: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
2e30: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
2e40: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
2e50: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
2e60: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
2e70: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
2e80: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2e90: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
2ea0: 6c 6c 6f 77 73 3a 20 20 54 68 65 72 65 20 69 73  llows:  There is
2eb0: 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 66   an initial.** f
2ec0: 69 6c 65 2d 74 79 70 65 20 73 74 72 69 6e 67 20  ile-type string 
2ed0: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
2ee0: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 65 72 65  ing.  Then there
2ef0: 20 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   is a single.** 
2f00: 50 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68 69 63  Pgno number whic
2f10: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
2f20: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
2f30: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
2f40: 2a 2a 20 63 68 61 6e 67 65 73 20 77 65 72 65 20  ** changes were 
2f50: 6d 61 64 65 2e 20 20 54 68 65 20 64 61 74 61 62  made.  The datab
2f60: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
2f70: 20 74 6f 20 74 68 69 73 20 73 69 7a 65 2e 0a 2a   to this size..*
2f80: 2a 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65 72 6f  * Next come zero
2f90: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 20 72 65   or more page re
2fa0: 63 6f 72 64 73 20 77 68 65 72 65 20 65 61 63 68  cords where each
2fb0: 20 70 61 67 65 20 72 65 63 6f 72 64 0a 2a 2a 20   page record.** 
2fc0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 50 67  consists of a Pg
2fd0: 6e 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f 50 41  no and SQLITE_PA
2fe0: 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66  GE_SIZE bytes of
2ff0: 20 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a 20 74   data.  See.** t
3000: 68 65 20 50 61 67 65 52 65 63 6f 72 64 20 73 74  he PageRecord st
3010: 72 75 63 74 75 72 65 20 66 6f 72 20 64 65 74 61  ructure for deta
3020: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 70  ils..**.** For p
3030: 6c 61 79 62 61 63 6b 2c 20 74 68 65 20 70 61 67  layback, the pag
3040: 65 73 20 68 61 76 65 20 74 6f 20 62 65 20 72 65  es have to be re
3050: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
3060: 6e 61 6c 20 69 6e 0a 2a 2a 20 72 65 76 65 72 73  nal in.** revers
3070: 65 20 6f 72 64 65 72 20 61 6e 64 20 70 75 74 20  e order and put 
3080: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72  back into the or
3090: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
30a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
30b0: 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
30c0: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
30d0: 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
30e0: 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
30f0: 61 6c 20 66 69 6c 65 20 28 61 73 20 64 65 74 65  al file (as dete
3100: 72 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  rmined by lookin
3110: 67 20 61 74 20 74 68 65 20 6d 61 67 69 63 20 6e  g at the magic n
3120: 75 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68 65 20  umber.** at the 
3130: 62 65 67 69 6e 6e 69 6e 67 29 20 74 68 65 6e 20  beginning) then 
3140: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
3150: 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f 54  urns SQLITE_PROT
3160: 4f 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e 79 20  OCOL..** If any 
3170: 6f 74 68 65 72 20 65 72 72 6f 72 73 20 6f 63 63  other errors occ
3180: 75 72 20 64 75 72 69 6e 67 20 70 6c 61 79 62 61  ur during playba
3190: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
31a0: 20 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c 79 20   will.** likely 
31b0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 73 6f  be corrupted, so
31c0: 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f 43   the PAGER_ERR_C
31d0: 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73 65  ORRUPT bit is se
31e0: 74 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  t in.** pPager->
31f0: 65 72 72 4d 61 73 6b 20 61 6e 64 20 53 51 4c 49  errMask and SQLI
3200: 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
3210: 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20 61  turned.  If it a
3220: 6c 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74 68 65  ll.** works, the
3230: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
3240: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
3250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3260: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
3270: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
3280: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
3290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
32a0: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
32b0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32d0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
32e0: 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
32f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3300: 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
3310: 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
3320: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
3330: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 2f  t statbuf;     /
3340: 2a 20 55 73 65 64 20 74 6f 20 73 69 7a 65 20 74  * Used to size t
3350: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
3360: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
3370: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
3380: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
3390: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
33a0: 61 67 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b  ageRecord pgRec;
33b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
33c0: 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f 66 28 61   aMagic[sizeof(a
33d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 3b 0a  JournalMagic)];.
33e0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
33f0: 52 65 61 64 20 74 68 65 20 62 65 67 69 6e 6e 69  Read the beginni
3400: 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
3410: 6c 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 74  l and truncate t
3420: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
3430: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
3440: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
3450: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3460: 70 50 61 67 65 72 2d 3e 6a 66 64 3e 3d 30 20 29  pPager->jfd>=0 )
3470: 3b 0a 20 20 70 61 67 65 72 5f 73 65 65 6b 28 70  ;.  pager_seek(p
3480: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
3490: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 61    rc = pager_rea
34a0: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
34b0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
34c0: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
34d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
34e0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 61 4a 6f  emcmp(aMagic,aJo
34f0: 75 72 6e 61 6c 4d 61 67 69 63 2c 73 69 7a 65 6f  urnalMagic,sizeo
3500: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
3510: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3520: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 7d  TE_PROTOCOL;.  }
3530: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65  .  rc = pager_re
3540: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
3550: 26 6d 78 50 67 2c 20 73 69 7a 65 6f 66 28 6d 78  &mxPg, sizeof(mx
3560: 50 67 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Pg));.  if( rc!=
3570: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3580: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
3590: 52 4f 54 4f 43 4f 4c 3b 0a 20 20 7d 0a 20 20 70  ROTOCOL;.  }.  p
35a0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
35b0: 61 67 65 72 2d 3e 66 64 2c 20 6d 78 50 67 29 3b  ager->fd, mxPg);
35c0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
35d0: 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20 2f  e = mxPg;.  .  /
35e0: 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
35f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69  the journal begi
3600: 6e 6e 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  nning at the end
3610: 20 61 6e 64 20 6d 6f 76 69 6e 67 0a 20 20 2a 2a   and moving.  **
3620: 20 74 6f 77 61 72 64 20 74 68 65 20 62 65 67 69   toward the begi
3630: 6e 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  nning..  */.  if
3640: 28 20 66 73 74 61 74 28 70 50 61 67 65 72 2d 3e  ( fstat(pPager->
3650: 6a 66 64 2c 20 26 73 74 61 74 62 75 66 29 21 3d  jfd, &statbuf)!=
3660: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3670: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
3680: 20 6e 52 65 63 20 3d 20 28 73 74 61 74 62 75 66   nRec = (statbuf
3690: 2e 73 74 5f 73 69 7a 65 20 2d 20 28 73 69 7a 65  .st_size - (size
36a0: 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65 6f  of(aMagic)+sizeo
36b0: 66 28 50 67 6e 6f 29 29 29 20 2f 20 73 69 7a 65  f(Pgno))) / size
36c0: 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b 0a  of(PageRecord);.
36d0: 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 73 65  .  /* Process se
36e0: 67 6d 65 6e 74 73 20 62 65 67 69 6e 6e 69 6e 67  gments beginning
36f0: 20 77 69 74 68 20 74 68 65 20 6c 61 73 74 20 61   with the last a
3700: 6e 64 20 77 6f 72 6b 69 6e 67 20 62 61 63 6b 77  nd working backw
3710: 61 72 64 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ards.  ** to the
3720: 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 66   first..  */.  f
3730: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
3740: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 2f 2a 20  0; i--){.    /* 
3750: 53 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69  Seek to the begi
3760: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 73 65 67  nning of the seg
3770: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 6f 66 66 5f  ment */.    off_
3780: 74 20 6f 66 73 74 3b 0a 20 20 20 20 6f 66 73 74  t ofst;.    ofst
3790: 20 3d 20 69 2a 73 69 7a 65 6f 66 28 50 61 67 65   = i*sizeof(Page
37a0: 52 65 63 6f 72 64 29 20 2b 20 73 69 7a 65 6f 66  Record) + sizeof
37b0: 28 61 4d 61 67 69 63 29 20 2b 20 73 69 7a 65 6f  (aMagic) + sizeo
37c0: 66 28 50 67 6e 6f 29 3b 0a 20 20 20 20 72 63 20  f(Pgno);.    rc 
37d0: 3d 20 70 61 67 65 72 5f 73 65 65 6b 28 70 50 61  = pager_seek(pPa
37e0: 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 73 74 29 3b  ger->jfd, ofst);
37f0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
3800: 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  ITE_OK ) break;.
3810: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
3820: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
3830: 20 26 70 67 52 65 63 2c 20 73 69 7a 65 6f 66 28   &pgRec, sizeof(
3840: 70 67 52 65 63 29 29 3b 0a 20 20 20 20 69 66 28  pgRec));.    if(
3850: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3860: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
3870: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
3880: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
3890: 20 20 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e     if( pgRec.pgn
38a0: 6f 3e 6d 78 50 67 20 7c 7c 20 70 67 52 65 63 2e  o>mxPg || pgRec.
38b0: 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pgno==0 ){.     
38c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
38d0: 52 55 50 54 3b 0a 20 20 20 20 20 20 62 72 65 61  RUPT;.      brea
38e0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
38f0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 70 61   Playback the pa
3900: 67 65 2e 20 20 55 70 64 61 74 65 20 74 68 65 20  ge.  Update the 
3910: 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 70 79 20 6f  in-memory copy o
3920: 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a  f the page.    *
3930: 2a 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  * at the same ti
3940: 6d 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  me, if there is 
3950: 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
3960: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
3970: 75 70 28 70 50 61 67 65 72 2c 20 70 67 52 65 63  up(pPager, pgRec
3980: 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  .pgno);.    if( 
3990: 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  pPg ){.      mem
39a0: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
39b0: 41 28 70 50 67 29 2c 20 70 67 52 65 63 2e 61 44  A(pPg), pgRec.aD
39c0: 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  ata, SQLITE_PAGE
39d0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
39e0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 65 65    rc = pager_see
39f0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
3a00: 67 52 65 63 2e 70 67 6e 6f 2d 31 29 2a 53 51 4c  gRec.pgno-1)*SQL
3a10: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
3a20: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
3a30: 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20  TE_OK ) break;. 
3a40: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
3a50: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
3a60: 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53 51 4c  pgRec.aData, SQL
3a70: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
3a80: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
3a90: 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20  TE_OK ) break;. 
3aa0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
3ab0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 61  ITE_OK ){.    pa
3ac0: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
3ad0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
3ae0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
3af0: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
3b00: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
3b10: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65  TE_CORRUPT;.  }e
3b20: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
3b30: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
3b40: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
3b50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3b60: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
3b70: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
3b80: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
3b90: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
3ba0: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
3bb0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
3bc0: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
3bd0: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
3be0: 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 75 6e 74  s not opened unt
3bf0: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
3c00: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 70 61  call to sqlitepa
3c10: 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73  ger_get() and is
3c20: 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
3c30: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
3c40: 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
3c50: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 70  ed using sqlitep
3c60: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f  ager_unref()..*/
3c70: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
3c80: 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a  _open(.  Pager *
3c90: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
3ca0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
3cb0: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
3cc0: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
3cd0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
3ce0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3cf0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3d00: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
3d10: 20 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20 20   mxPage,        
3d20: 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d        /* Max num
3d30: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
3d40: 20 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a   cache pages */.
3d50: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
3d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
3d70: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
3d80: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
3d90: 72 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ry page */.){.  
3da0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
3db0: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20   int nameLen;.  
3dc0: 69 6e 74 20 66 64 3b 0a 0a 20 20 2a 70 70 50 61  int fd;..  *ppPa
3dd0: 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ger = 0;.  if( s
3de0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
3df0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
3e00: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
3e10: 20 20 7d 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28    }.  fd = open(
3e20: 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57  zFilename, O_RDW
3e30: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
3e40: 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ;.  if( fd<0 ){.
3e50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3e60: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
3e70: 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c    nameLen = strl
3e80: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  en(zFilename);. 
3e90: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
3ea0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
3eb0: 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65  pPager) + nameLe
3ec0: 6e 2a 32 20 2b 20 33 30 20 29 3b 0a 20 20 69 66  n*2 + 30 );.  if
3ed0: 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20  ( pPager==0 ){. 
3ee0: 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
3ef0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3f00: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
3f10: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
3f20: 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b   (char*)&pPager[
3f30: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  1];.  pPager->zJ
3f40: 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
3f50: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65  ->zFilename[name
3f60: 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79  Len+1];.  strcpy
3f70: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
3f80: 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  me, zFilename);.
3f90: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
3fa0: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 69 6c 65  >zJournal, zFile
3fb0: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
3fc0: 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
3fd0: 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f  l[nameLen], "-jo
3fe0: 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65  urnal");.  pPage
3ff0: 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 50  r->fd = fd;.  pP
4000: 61 67 65 72 2d 3e 6a 66 64 20 3d 20 2d 31 3b 0a  ager->jfd = -1;.
4010: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
4020: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   0;.  pPager->db
4030: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61  Size = -1;.  pPa
4040: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
4050: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
4060: 20 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78   = mxPage>5 ? mx
4070: 50 61 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61  Page : 10;.  pPa
4080: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
4090: 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50  ITE_UNLOCK;.  pP
40a0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
40b0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
40c0: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
40d0: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
40e0: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
40f0: 20 6e 45 78 74 72 61 3b 0a 20 20 6d 65 6d 73 65   nExtra;.  memse
4100: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
4110: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
4120: 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70  r->aHash));.  *p
4130: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
4140: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4150: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
4160: 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
4170: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
4180: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
4190: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
41a0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
41b0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
41c0: 75 6e 74 20 6f 6e 20 74 68 65 20 70 61 67 65 20  unt on the page 
41d0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 0a  reaches zero.  .
41e0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
41f0: 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
4200: 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
4210: 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65  qlitepager_close
4220: 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63  ().  .** Destruc
4230: 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61  tors are only ca
4240: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 70 61  lled by sqlitepa
4250: 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a  ger_unref()..*/.
4260: 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72  void sqlitepager
4270: 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28  _set_destructor(
4280: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
4290: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69  oid (*xDesc)(voi
42a0: 64 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  d*)){.  pPager->
42b0: 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44  xDestructor = xD
42c0: 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  esc;.}../*.** Re
42d0: 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
42e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
42f0: 6e 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  n the file opene
4300: 64 20 62 79 20 70 50 61 67 65 72 2e 0a 2a 2f 0a  d by pPager..*/.
4310: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
4320: 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  pagecount(Pager 
4330: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
4340: 6e 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  n;.  struct stat
4350: 20 73 74 61 74 62 75 66 3b 0a 20 20 61 73 73 65   statbuf;.  asse
4360: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
4370: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
4380: 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
4390: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64  return pPager->d
43a0: 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  bSize;.  }.  if(
43b0: 20 66 73 74 61 74 28 70 50 61 67 65 72 2d 3e 66   fstat(pPager->f
43c0: 64 2c 20 26 73 74 61 74 62 75 66 29 21 3d 30 20  d, &statbuf)!=0 
43d0: 29 7b 0a 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20  ){.    n = 0;.  
43e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20 73  }else{.    n = s
43f0: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 2f 53  tatbuf.st_size/S
4400: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b  QLITE_PAGE_SIZE;
4410: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
4420: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
4430: 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _UNLOCK ){.    p
4440: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
4450: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
4460: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  n;.}../*.** Shut
4470: 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
4480: 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
4490: 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
44a0: 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
44b0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
44c0: 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
44d0: 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
44e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
44f0: 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
4500: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
4510: 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
4520: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
4530: 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
4540: 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
4550: 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
4560: 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
4570: 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
4580: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
4590: 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
45a0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
45b0: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
45c0: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
45d0: 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  edump..*/.int sq
45e0: 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28  litepager_close(
45f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
4600: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
4610: 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Next;.  switch( 
4620: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b  pPager->state ){
4630: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4640: 5f 57 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20 20  _WRITELOCK: {.  
4650: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
4660: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
4670: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e  ;.      pager_un
4680: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29  lock(pPager->fd)
4690: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
46a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
46b0: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b  LITE_READLOCK: {
46c0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  .      pager_unl
46d0: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ock(pPager->fd);
46e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
46f0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
4700: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
4710: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
4720: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4730: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
4740: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
4750: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  g=pNext){.    pN
4760: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
4770: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
4780: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
4790: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 3e 3d  if( pPager->fd>=
47a0: 30 20 29 20 63 6c 6f 73 65 28 70 50 61 67 65 72  0 ) close(pPager
47b0: 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65 72 74 28  ->fd);.  assert(
47c0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 3c 30 20 29   pPager->jfd<0 )
47d0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
47e0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
47f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4800: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4810: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
4820: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
4830: 61 74 61 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ata.*/.Pgno sqli
4840: 74 65 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62  tepager_pagenumb
4850: 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  er(void *pData){
4860: 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44 41  .  PgHdr *p = DA
4870: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
4880: 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  a);.  return p->
4890: 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pgno;.}../*.** I
48a0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
48b0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
48c0: 20 61 20 70 61 67 65 2e 20 20 49 66 20 74 68 65   a page.  If the
48d0: 20 70 61 67 65 20 69 73 0a 2a 2a 20 63 75 72 72   page is.** curr
48e0: 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
48f0: 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72  elist (the refer
4900: 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
4910: 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f  ro) then.** remo
4920: 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66  ve it from the f
4930: 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  reelist..*/.stat
4940: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66  ic void page_ref
4950: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
4960: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
4970: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
4980: 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
4990: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
49a0: 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
49b0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
49c0: 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
49d0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
49e0: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
49f0: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
4a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
4a10: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
4a20: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
4a30: 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ee;.    }.    if
4a40: 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
4a50: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
4a60: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
4a70: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
4a80: 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
4a90: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
4aa0: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
4ab0: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
4ac0: 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  }.    pPg->pPage
4ad0: 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
4ae0: 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
4af0: 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a  REFINFO(pPg);.}.
4b00: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
4b10: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
4b20: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
4b30: 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
4b40: 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
4b50: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
4b60: 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
4b70: 71 6c 69 74 65 70 61 67 65 72 5f 72 65 66 28 76  qlitepager_ref(v
4b80: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
4b90: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
4ba0: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
4bb0: 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
4bc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
4bd0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4be0: 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
4bf0: 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
4c00: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 6f  k is obtained fo
4c10: 72 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  r the first page
4c20: 20 61 63 71 75 69 72 65 64 2e 20 20 54 68 65 20   acquired.  The 
4c30: 6c 6f 63 6b 0a 2a 2a 20 69 73 20 64 72 6f 70 70  lock.** is dropp
4c40: 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ed when the last
4c50: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
4c60: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65  d.  .**.** A _ge
4c70: 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  t works for any 
4c80: 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
4c90: 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
4ca0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4cb0: 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
4cc0: 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
4cd0: 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
4ce0: 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
4cf0: 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
4d00: 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
4d10: 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
4d20: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
4d30: 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
4d40: 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
4d50: 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
4d60: 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
4d70: 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
4d80: 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
4d90: 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
4da0: 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
4db0: 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
4dc0: 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
4dd0: 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
4de0: 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
4df0: 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
4e00: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
4e10: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
4e20: 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
4e30: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
4e40: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 70 61  ee also sqlitepa
4e50: 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42  ger_lookup().  B
4e60: 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
4e70: 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61   and _lookup() a
4e80: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
4e90: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
4ea0: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
4eb0: 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
4ec0: 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
4ed0: 64 79 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20  dy.** in cache, 
4ee0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
4ef0: 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
4f00: 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
4f10: 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73  _lookup().** jus
4f20: 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
4f30: 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
4f40: 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
4f50: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
4f60: 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
4f70: 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
4f80: 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
4f90: 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
4fa0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
4fb0: 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20  Since _lookup() 
4fc0: 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
4fd0: 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
4fe0: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
4ff0: 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
5000: 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
5010: 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28  sqlitepager_get(
5020: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
5030: 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
5040: 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64  *ppPage){.  PgHd
5050: 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 4d 61  r *pPg;..  /* Ma
5060: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
5070: 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74  not hit any crit
5080: 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a  ical errors..  *
5090: 2f 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  / .  if( pPager=
50a0: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29 7b  =0 || pgno==0 ){
50b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
50c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
50d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
50e0: 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52  ask & ~(PAGER_ER
50f0: 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72  R_FULL) ){.    r
5100: 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
5110: 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
5120: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5130: 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
5140: 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20   accessed, then 
5150: 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a  get a read lock.
5160: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
5170: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
5180: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
5190: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef==0 ){.    if(
51a0: 20 70 61 67 65 72 5f 6c 6f 63 6b 28 70 50 61 67   pager_lock(pPag
51b0: 65 72 2d 3e 66 64 2c 20 30 29 21 3d 30 20 29 7b  er->fd, 0)!=0 ){
51c0: 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
51d0: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
51e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
51f0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
5200: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52  state = SQLITE_R
5210: 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20 2f 2a  EADLOCK;..    /*
5220: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
5230: 6c 65 20 65 78 69 73 74 73 2c 20 74 72 79 20 74  le exists, try t
5240: 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 2e 0a  o play it back..
5250: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61      */.    if( a
5260: 63 63 65 73 73 28 70 50 61 67 65 72 2d 3e 7a 4a  ccess(pPager->zJ
5270: 6f 75 72 6e 61 6c 2c 30 29 3d 3d 30 20 29 7b 0a  ournal,0)==0 ){.
5280: 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a         int rc;..
5290: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
52a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 65  he journal for e
52b0: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2e  xclusive access.
52c0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
52d0: 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a  BUSY if.       *
52e0: 2a 20 77 65 20 63 61 6e 6e 6f 74 20 67 65 74 20  * we cannot get 
52f0: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
5300: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
5310: 66 69 6c 65 0a 20 20 20 20 20 20 20 2a 2f 0a 20  file.       */. 
5320: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
5330: 64 20 3d 20 6f 70 65 6e 28 70 50 61 67 65 72 2d  d = open(pPager-
5340: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 4f 5f 52 44 4f  >zJournal, O_RDO
5350: 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  NLY, 0);.       
5360: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 3c  if( pPager->jfd<
5370: 30 20 7c 7c 20 70 61 67 65 72 5f 6c 6f 63 6b 28  0 || pager_lock(
5380: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 21  pPager->jfd, 1)!
5390: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69  =0 ){.         i
53a0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 3e 3d  f( pPager->jfd>=
53b0: 30 20 29 7b 20 63 6c 6f 73 65 28 70 50 61 67 65  0 ){ close(pPage
53c0: 72 2d 3e 6a 66 64 29 3b 20 70 50 61 67 65 72 2d  r->jfd); pPager-
53d0: 3e 6a 66 64 20 3d 20 2d 31 3b 20 7d 0a 20 20 20  >jfd = -1; }.   
53e0: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
53f0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ck(pPager->fd);.
5400: 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65           *ppPage
5410: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 72   = 0;.         r
5420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
5430: 59 3b 0a 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  Y;.       }..   
5440: 20 20 20 20 2f 2a 20 47 65 74 20 61 20 77 72 69      /* Get a wri
5450: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
5460: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
5470: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
5480: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
5490: 20 20 20 69 66 28 20 70 61 67 65 72 5f 6c 6f 63     if( pager_loc
54a0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 31 29  k(pPager->fd, 1)
54b0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
54c0: 63 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  close(pPager->jf
54d0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61  d);.         pPa
54e0: 67 65 72 2d 3e 6a 66 64 20 3d 20 2d 31 3b 0a 20  ger->jfd = -1;. 
54f0: 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
5500: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 72 65  = 0;.         re
5510: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 52 4f 54  turn SQLITE_PROT
5520: 4f 43 4f 4c 3b 0a 20 20 20 20 20 20 20 7d 0a 0a  OCOL;.       }..
5530: 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
5540: 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
5550: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
5560: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
5570: 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ite.       ** lo
5580: 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
5590: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
55a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
55b0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
55c0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
55d0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
55e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
55f0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5600: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5610: 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
5620: 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
5630: 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63   for page in cac
5640: 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  he */.    pPg = 
5650: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
5660: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
5670: 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
5680: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
5690: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
56a0: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
56b0: 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68  he. */.    int h
56c0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d  ;.    pPager->nM
56d0: 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  iss++;.    if( p
56e0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61  Pager->nPage<pPa
56f0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70  ger->mxPage || p
5700: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30  Pager->pFirst==0
5710: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65   ){.      /* Cre
5720: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a  ate a new page *
5730: 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71  /.      pPg = sq
5740: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
5750: 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49 54  of(*pPg) + SQLIT
5760: 45 5f 50 41 47 45 5f 53 49 5a 45 20 2b 20 70 50  E_PAGE_SIZE + pP
5770: 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 29 3b 0a  ager->nExtra );.
5780: 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
5790: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   ){.        *ppP
57a0: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
57b0: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
57c0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
57d0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
57e0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
57f0: 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  _MEM;.        re
5800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5810: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
5820: 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
5830: 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
5840: 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
5850: 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
5860: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
5870: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  l ){.        pPa
5880: 67 65 72 2d 3e 70 41 6c 6c 2d 3e 70 50 72 65 76  ger->pAll->pPrev
5890: 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  All = pPg;.     
58a0: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
58b0: 72 65 76 41 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  revAll = 0;.    
58c0: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
58d0: 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67   pPg;.      pPag
58e0: 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  er->nPage++;.   
58f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
5900: 20 52 65 63 79 63 6c 65 20 61 6e 20 6f 6c 64 65   Recycle an olde
5910: 72 20 70 61 67 65 2e 20 20 46 69 72 73 74 20 6c  r page.  First l
5920: 6f 63 61 74 65 20 74 68 65 20 70 61 67 65 20 74  ocate the page t
5930: 6f 20 62 65 20 72 65 63 79 63 6c 65 64 2e 0a 20  o be recycled.. 
5940: 20 20 20 20 20 2a 2a 20 54 72 79 20 74 6f 20 66       ** Try to f
5950: 69 6e 64 20 6f 6e 65 20 74 68 61 74 20 69 73 20  ind one that is 
5960: 6e 6f 74 20 64 69 72 74 79 20 61 6e 64 20 69 73  not dirty and is
5970: 20 6e 65 61 72 20 74 68 65 20 68 65 61 64 20 6f   near the head o
5980: 66 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  f.      ** of th
5990: 65 20 66 72 65 65 20 6c 69 73 74 20 2a 2f 0a 20  e free list */. 
59a0: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 34       int cnt = 4
59b0: 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
59c0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
59d0: 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 2d 3e      while( pPg->
59e0: 64 69 72 74 79 20 26 26 20 30 3c 63 6e 74 2d 2d  dirty && 0<cnt--
59f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20   ){.        pPg 
5a00: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
5a10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5a20: 69 66 28 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50  if( pPg==0 || pP
5a30: 67 2d 3e 64 69 72 74 79 20 29 20 70 50 67 20 3d  g->dirty ) pPg =
5a40: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
5a50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5a60: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
5a70: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
5a80: 70 61 67 65 20 74 6f 20 62 65 20 72 65 63 79 63  page to be recyc
5a90: 6c 65 64 20 69 73 20 64 69 72 74 79 2c 20 73 79  led is dirty, sy
5aa0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  nc the journal a
5ab0: 6e 64 20 77 72 69 74 65 20 0a 20 20 20 20 20 20  nd write .      
5ac0: 2a 2a 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  ** the old page 
5ad0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
5ae0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
5af0: 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
5b00: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
5b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
5b20: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 3d 3d 31 20  g->inJournal==1 
5b30: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
5b40: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
5b50: 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  ==SQLITE_WRITELO
5b60: 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  CK );.        rc
5b70: 20 3d 20 66 73 79 6e 63 28 70 50 61 67 65 72 2d   = fsync(pPager-
5b80: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  >jfd);.        i
5b90: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
5ba0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5bb0: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
5bc0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
5bd0: 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
5be0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
5bf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
5c00: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
5c10: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5c20: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
5c30: 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 73 65          pager_se
5c40: 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ek(pPager->fd, (
5c50: 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 53 51 4c  pPg->pgno-1)*SQL
5c60: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
5c70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
5c80: 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 72 2d  er_write(pPager-
5c90: 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
5ca0: 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45 5f  TA(pPg), SQLITE_
5cb0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
5cc0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
5cd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
5ce0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61     rc = sqlitepa
5cf0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
5d00: 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
5d10: 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
5d20: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
5d30: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
5d40: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
5d50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
5d60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5d70: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e    }..      /* Un
5d80: 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
5d90: 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
5da0: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
5db0: 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f  h table.      */
5dc0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
5dd0: 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
5de0: 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 69 66  xtFree;.      if
5df0: 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
5e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
5e10: 65 72 2d 3e 70 46 69 72 73 74 2d 3e 70 50 72 65  er->pFirst->pPre
5e20: 76 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  vFree = 0;.     
5e30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5e40: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
5e50: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
5e60: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
5e70: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ash ){.        p
5e80: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
5e90: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
5ea0: 70 50 72 65 76 48 61 73 68 3b 0a 20 20 20 20 20  pPrevHash;.     
5eb0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
5ec0: 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
5ed0: 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65         pPg->pPre
5ee0: 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
5ef0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
5f00: 68 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  h;.      }else{.
5f10: 20 20 20 20 20 20 20 20 68 20 3d 20 70 61 67 65          h = page
5f20: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
5f30: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
5f40: 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
5f50: 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  [h]==pPg );.    
5f60: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
5f70: 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
5f80: 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  tHash;.      }. 
5f90: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76       pPager->nOv
5fa0: 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fl++;.    }.    
5fb0: 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
5fc0: 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  ;.    pPg->inJou
5fd0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50  rnal = 0;.    pP
5fe0: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
5ff0: 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
6000: 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
6010: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
6020: 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70  Ref++;.    h = p
6030: 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b  ager_hash(pgno);
6040: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
6050: 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
6060: 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67  ash[h];.    pPag
6070: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
6080: 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
6090: 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
60a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
60b0: 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
60c0: 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
60d0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
60e0: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
60f0: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
6100: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
6110: 30 20 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f  0 ) sqlitepager_
6120: 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
6130: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
6140: 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 29  r->dbSize<pgno )
6150: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
6160: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
6170: 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  ), 0, SQLITE_PAG
6180: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c  E_SIZE);.    }el
6190: 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  se{.      pager_
61a0: 73 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  seek(pPager->fd,
61b0: 20 28 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45   (pgno-1)*SQLITE
61c0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
61d0: 20 20 20 70 61 67 65 72 5f 72 65 61 64 28 70 50     pager_read(pP
61e0: 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
61f0: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51  TO_DATA(pPg), SQ
6200: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
6210: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6220: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
6230: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
6240: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
6250: 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
6260: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
6270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
6280: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
6290: 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
62a0: 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70   cache. */.    p
62b0: 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20  Pager->nHit++;. 
62c0: 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
62d0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
62e0: 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
62f0: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
6300: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6310: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
6320: 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
6330: 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
6340: 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
6350: 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
6360: 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
6370: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6380: 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
6390: 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
63a0: 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
63b0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
63c0: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65  o sqlitepager_ge
63d0: 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
63e0: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
63f0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
6400: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74   sqlitepager_get
6410: 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
6420: 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
6430: 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
6440: 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
6450: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
6460: 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
6470: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
6480: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
6490: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
64a0: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 66 20  not in cache of 
64b0: 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 68 61  if a disk I/O ha
64c0: 73 20 65 76 65 72 0a 2a 2a 20 68 61 70 70 65 6e  s ever.** happen
64d0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
64e0: 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  itepager_lookup(
64f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
6500: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
6510: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 4d  dr *pPg;..  /* M
6520: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
6530: 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
6540: 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
6550: 2a 2f 20 0a 20 20 69 66 28 20 70 50 61 67 65 72  */ .  if( pPager
6560: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29  ==0 || pgno==0 )
6570: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6580: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
6590: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
65a0: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
65b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
65c0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
65d0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
65e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
65f0: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
6600: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
6610: 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
6620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67   return 0;.  pag
6630: 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
6640: 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
6650: 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
6660: 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
6670: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
6680: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
6690: 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
66a0: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
66b0: 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
66c0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
66d0: 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
66e0: 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
66f0: 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
6700: 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
6710: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
6720: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
6730: 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
6740: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
6750: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72   sqlitepager_unr
6760: 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
6770: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
6780: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
6790: 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
67a0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
67b0: 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
67c0: 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44  e.  */.  pPg = D
67d0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
67e0: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ta);.  assert( p
67f0: 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
6800: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
6810: 61 67 65 72 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  ager;.  pPg->nRe
6820: 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f--;.  REFINFO(p
6830: 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  Pg);..  /* When 
6840: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
6850: 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61  ferences to a pa
6860: 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c  ge reach 0, call
6870: 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75   the.  ** destru
6880: 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65  ctor and add the
6890: 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
68a0: 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elist..  */.  if
68b0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
68c0: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
68d0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Free = 0;.    pP
68e0: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  g->pPrevFree = p
68f0: 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20  Pager->pLast;.  
6900: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
6910: 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
6920: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
6930: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
6940: 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
6950: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73   = pPg;.    }els
6960: 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
6970: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20  >pFirst = pPg;. 
6980: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
6990: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
69a0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
69b0: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
69c0: 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ata);.    }.  . 
69d0: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70     /* When all p
69e0: 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66  ages reach the f
69f0: 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68  reelist, drop th
6a00: 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d  e read lock from
6a10: 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
6a20: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
6a30: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  /.    pPager->nR
6a40: 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ef--;.    assert
6a50: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d  ( pPager->nRef>=
6a60: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
6a70: 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ger->nRef==0 ){.
6a80: 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
6a90: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  t(pPager);.    }
6aa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6ab0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6ac0: 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
6ad0: 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
6ae0: 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
6af0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
6b00: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
6b10: 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
6b20: 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
6b30: 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
6b40: 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
6b50: 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
6b60: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
6b70: 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
6b80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
6b90: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
6ba0: 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
6bb0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
6bc0: 69 72 65 73 20 61 20 77 72 69 74 65 20 6c 6f 63  ires a write loc
6bd0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
6be0: 65 2e 20 20 49 66 20 74 68 65 20 77 72 69 74 65  e.  If the write
6bf0: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
6c00: 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
6c10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
6c20: 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
6c30: 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
6c40: 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
6c50: 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
6c60: 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
6c70: 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
6c80: 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
6c90: 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
6ca0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6cb0: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
6cc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
6cd0: 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
6ce0: 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
6cf0: 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
6d00: 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
6d10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
6d20: 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
6d30: 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
6d40: 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
6d50: 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
6d60: 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
6d70: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
6d80: 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
6d90: 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
6da0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65  ll to sqlitepage
6db0: 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  r_commit() or sq
6dc0: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
6dd0: 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
6de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
6df0: 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20  ager_write(void 
6e00: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
6e10: 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
6e20: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
6e30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
6e40: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
6e50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6e60: 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
6e70: 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20  ->errMask ){ .  
6e80: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
6e90: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
6ea0: 20 20 7d 0a 20 20 70 50 67 2d 3e 64 69 72 74 79    }.  pPg->dirty
6eb0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
6ec0: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 7b 20 72 65  >inJournal ){ re
6ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
6ee0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
6ef0: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
6f00: 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  E_UNLOCK );.  if
6f10: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
6f20: 3d 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b  =SQLITE_READLOCK
6f30: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
6f40: 6a 66 64 20 3d 20 6f 70 65 6e 28 70 50 61 67 65  jfd = open(pPage
6f50: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 4f 5f 52  r->zJournal, O_R
6f60: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
6f70: 34 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  4);.    if( pPag
6f80: 65 72 2d 3e 6a 66 64 3c 30 20 29 7b 0a 20 20 20  er->jfd<0 ){.   
6f90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6fa0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
6fb0: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 6c  .    if( pager_l
6fc0: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ock(pPager->jfd,
6fd0: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f   1) ){.      clo
6fe0: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
6ff0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
7000: 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  fd = -1;.      r
7010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
7020: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  Y;.    }.    pag
7030: 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
7040: 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66 28 20 70  ->fd);.    if( p
7050: 61 67 65 72 5f 6c 6f 63 6b 28 70 50 61 67 65 72  ager_lock(pPager
7060: 2d 3e 66 64 2c 20 31 29 20 29 7b 0a 20 20 20 20  ->fd, 1) ){.    
7070: 20 20 63 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e    close(pPager->
7080: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
7090: 65 72 2d 3e 6a 66 64 20 3d 20 2d 31 3b 0a 20 20  er->jfd = -1;.  
70a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
70b0: 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43  e = SQLITE_UNLOC
70c0: 4b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  K;.      pPager-
70d0: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
70e0: 52 5f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  R_ERR_LOCK;.    
70f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7100: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 7d 0a  PROTOCOL;.    }.
7110: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
7120: 65 20 3d 20 53 51 4c 49 54 45 5f 57 52 49 54 45  e = SQLITE_WRITE
7130: 4c 4f 43 4b 3b 0a 20 20 20 20 73 71 6c 69 74 65  LOCK;.    sqlite
7140: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
7150: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
7160: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
7170: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
7180: 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
7190: 5f 77 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  _write(pPager->j
71a0: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
71b0: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
71c0: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 69  alMagic));.    i
71d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
71e0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
71f0: 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
7200: 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
7210: 3e 64 62 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28  >dbSize, sizeof(
7220: 50 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Pgno));.    }.  
7230: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7240: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
7250: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
7260: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
7270: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7280: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49  E_OK ) rc = SQLI
7290: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 72  TE_FULL;.      r
72a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
72b0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
72c0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c  ager->state==SQL
72d0: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 3b  ITE_WRITELOCK );
72e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
72f0: 72 2d 3e 6a 66 64 3e 3d 30 20 29 3b 0a 20 20 69  r->jfd>=0 );.  i
7300: 66 28 20 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  f( pPg->pgno <= 
7310: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
7320: 7a 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ze ){.    rc = p
7330: 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
7340: 72 2d 3e 6a 66 64 2c 20 26 70 50 67 2d 3e 70 67  r->jfd, &pPg->pg
7350: 6e 6f 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  no, sizeof(Pgno)
7360: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
7370: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7380: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
7390: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
73a0: 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41  pData, SQLITE_PA
73b0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  GE_SIZE);.    }.
73c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
73d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
73e0: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
73f0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
7400: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
7410: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
7420: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 72 65 74 75  FULL;.      retu
7430: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
7440: 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  .  pPg->inJourna
7450: 6c 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 61  l = 1;.  if( pPa
7460: 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d  ger->dbSize<pPg-
7470: 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
7480: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
7490: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
74a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
74b0: 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
74c0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
74d0: 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
74e0: 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
74f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
7500: 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
7510: 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
7520: 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
7530: 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
7540: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
7550: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
7560: 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
7570: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
7580: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
7590: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d   sqlitepager_com
75a0: 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
75b0: 72 29 7b 0a 20 20 69 6e 74 20 69 2c 20 72 63 3b  r){.  int i, rc;
75c0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
75d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
75e0: 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52  rMask==PAGER_ERR
75f0: 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  _FULL ){.    rc 
7600: 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f  = sqlitepager_ro
7610: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
7620: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
7630: 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
7640: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 72 65  ITE_FULL;.    re
7650: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
7660: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
7670: 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
7680: 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
7690: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
76a0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
76b0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
76c0: 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  =SQLITE_WRITELOC
76d0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
76e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
76f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
7700: 65 72 2d 3e 6a 66 64 3e 3d 30 20 29 3b 0a 20 20  er->jfd>=0 );.  
7710: 69 66 28 20 66 73 79 6e 63 28 70 50 61 67 65 72  if( fsync(pPager
7720: 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 67 6f  ->jfd) ){.    go
7730: 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
7740: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
7750: 69 3c 4e 5f 50 47 5f 48 41 53 48 3b 20 69 2b 2b  i<N_PG_HASH; i++
7760: 29 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  ){.    for(pPg=p
7770: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 69 5d 3b  Pager->aHash[i];
7780: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
7790: 4e 65 78 74 48 61 73 68 29 7b 0a 20 20 20 20 20  NextHash){.     
77a0: 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d   if( pPg->dirty=
77b0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
77c0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
77d0: 73 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  seek(pPager->fd,
77e0: 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 53   (pPg->pgno-1)*S
77f0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
7800: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
7810: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
7820: 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
7830: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
7840: 77 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  write(pPager->fd
7850: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
7860: 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47  pPg), SQLITE_PAG
7870: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69  E_SIZE);.      i
7880: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7890: 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61   ) goto commit_a
78a0: 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
78b0: 20 20 69 66 28 20 66 73 79 6e 63 28 70 50 61 67    if( fsync(pPag
78c0: 65 72 2d 3e 66 64 29 20 29 20 67 6f 74 6f 20 63  er->fd) ) goto c
78d0: 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 72  ommit_abort;.  r
78e0: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
78f0: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
7900: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
7910: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72  = -1;.  return r
7920: 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  c;..  /* Jump he
7930: 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  re if anything g
7940: 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67  oes wrong during
7950: 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
7960: 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74  ess..  */.commit
7970: 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73  _abort:.  rc = s
7980: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
7990: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ack(pPager);.  i
79a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
79b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
79c0: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20  ITE_FULL;.  }.  
79d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
79e0: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
79f0: 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
7a00: 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
7a10: 63 6b 20 74 6f 20 72 65 61 64 2d 6f 6e 6c 79 20  ck to read-only 
7a20: 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
7a30: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
7a40: 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
7a50: 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
7a60: 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
7a70: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
7a80: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
7a90: 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
7aa0: 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
7ab0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
7ac0: 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
7ad0: 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
7ae0: 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
7af0: 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  (SQLITE_PROTOCOL
7b00: 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65  ) or unless some
7b10: 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
7b20: 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61  s is writing tra
7b30: 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  sh into the jour
7b40: 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45  nal file (SQLITE
7b50: 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20  _CORRUPT) or.** 
7b60: 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d  unless a prior m
7b70: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28  alloc() failed (
7b80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20  SQLITE_NOMEM).  
7b90: 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  Appropriate erro
7ba0: 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72  r.** codes are r
7bb0: 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20  eturned for all 
7bc0: 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e  these occasions.
7bd0: 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
7be0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
7bf0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
7c00: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
7c10: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
7c20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
7c30: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
7c40: 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d  sk!=0 && pPager-
7c50: 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f  >errMask!=PAGER_
7c60: 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
7c70: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
7c80: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
7c90: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
7ca0: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52  state!=SQLITE_WR
7cb0: 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ITELOCK ){.    r
7cc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7cd0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65  .  }.  rc = page
7ce0: 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
7cf0: 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
7d00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7d10: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
7d20: 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  PT;.    pPager->
7d30: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
7d40: 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20  _ERR_CORRUPT;.  
7d50: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
7d60: 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ze = -1;.  retur
7d70: 6e 20 72 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  n rc;.};../*.** 
7d80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
7d90: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
7da0: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
7db0: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
7dc0: 74 65 70 61 67 65 72 5f 73 74 61 74 73 28 50 61  tepager_stats(Pa
7dd0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7de0: 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b  static int a[9];
7df0: 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
7e00: 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
7e10: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
7e20: 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
7e30: 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
7e40: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
7e50: 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
7e60: 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
7e70: 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61   = pPager->errMa
7e80: 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  sk;.  a[6] = pPa
7e90: 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
7ea0: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
7eb0: 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67  s;.  a[8] = pPag
7ec0: 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74  er->nOvfl;.  ret
7ed0: 75 72 6e 20 61 3b 0a 7d 0a 0a 23 69 66 20 53 51  urn a;.}..#if SQ
7ee0: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
7ef0: 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
7f00: 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
7f10: 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
7f20: 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
7f30: 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72  void sqlitepager
7f40: 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a  _refdump(Pager *
7f50: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
7f60: 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67   *pPg;.  for(pPg
7f70: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
7f80: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
7f90: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
7fa0: 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63  pPg->nRef<=0 ) c
7fb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72 69  ontinue;.    pri
7fc0: 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
7fd0: 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25  dr=0x%08x nRef=%
7fe0: 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50  d\n", .       pP
7ff0: 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47  g->pgno, (int)PG
8000: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
8010: 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
8020: 7d 0a 7d 0a 23 65 6e 64 69 66 0a                 }.}.#endif.