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

Artifact 1928e68b5c00c24749b71f41eeabacd7217337a5:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 31 20 44 2e 20 52 69 63 68  (c) 2001 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61  lic.** License a
00b0: 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 20 74  s published by t
00c0: 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 72 65  he Free Software
00d0: 20 46 6f 75 6e 64 61 74 69 6f 6e 3b 20 65 69 74   Foundation; eit
00e0: 68 65 72 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 32  her.** version 2
00f0: 20 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c   of the License,
0100: 20 6f 72 20 28 61 74 20 79 6f 75 72 20 6f 70 74   or (at your opt
0110: 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 76  ion) any later v
0120: 65 72 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ersion..**.** Th
0130: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0140: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0150: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0160: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a  ll be useful,.**
0170: 20 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59   but WITHOUT ANY
0180: 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f   WARRANTY; witho
0190: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
01a0: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
01b0: 2a 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49  ** MERCHANTABILI
01c0: 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f  TY or FITNESS FO
01d0: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
01e0: 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65  URPOSE.  See the
01f0: 20 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20   GNU.** General 
0200: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66  Public License f
0210: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e  or more details.
0220: 0a 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75  .** .** You shou
0230: 6c 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64  ld have received
0240: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47   a copy of the G
0250: 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69  NU General Publi
0260: 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f  c.** License alo
0270: 6e 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62  ng with this lib
0280: 72 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72  rary; if not, wr
0290: 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72  ite to the.** Fr
02a0: 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e  ee Software Foun
02b0: 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39  dation, Inc., 59
02c0: 20 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20   Temple Place - 
02d0: 53 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f  Suite 330,.** Bo
02e0: 73 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d  ston, MA  02111-
02f0: 31 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a  1307, USA..**.**
0300: 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20   Author contact 
0310: 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20  information:.** 
0320: 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a    drh@hwaci.com.
0330: 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e  **   http://www.
0340: 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a  hwaci.com/drh/.*
0350: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
03a0: 68 69 73 20 69 73 20 74 68 65 20 69 6d 70 6c 65  his is the imple
03b0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
03c0: 20 70 61 67 65 20 63 61 63 68 65 20 73 75 62 73   page cache subs
03d0: 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ystem..** .** Th
03e0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
03f0: 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 61  used to access a
0400: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
0410: 20 54 68 65 20 70 61 67 65 72 20 6a 6f 75 72 6e   The pager journ
0420: 61 6c 73 0a 2a 2a 20 61 6c 6c 20 77 72 69 74 65  als.** all write
0430: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 75  s in order to su
0440: 70 70 6f 72 74 20 72 6f 6c 6c 62 61 63 6b 2e 20  pport rollback. 
0450: 20 4c 6f 63 6b 69 6e 67 20 69 73 20 75 73 65 64   Locking is used
0460: 20 74 6f 20 6c 69 6d 69 74 0a 2a 2a 20 61 63 63   to limit.** acc
0470: 65 73 73 20 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  ess to one or mo
0480: 72 65 20 72 65 61 64 65 72 20 6f 72 20 74 6f 20  re reader or to 
0490: 6f 6e 65 20 77 72 69 74 65 72 2e 0a 2a 2a 0a 2a  one writer..**.*
04a0: 2a 20 40 28 23 29 20 24 49 64 3a 20 70 61 67 65  * @(#) $Id: page
04b0: 72 2e 63 2c 76 20 31 2e 31 34 20 32 30 30 31 2f  r.c,v 1.14 2001/
04c0: 30 39 2f 31 33 20 31 33 3a 34 36 3a 35 37 20 64  09/13 13:46:57 d
04d0: 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  rh Exp $.*/.#inc
04e0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
04f0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67  h".#include "pag
0500: 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  er.h".#include <
0510: 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64  fcntl.h>.#includ
0520: 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23  e <sys/stat.h>.#
0530: 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e  include <unistd.
0540: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
0550: 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ert.h>.#include 
0560: 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a  <string.h>../*.*
0570: 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65  * The page cache
0580: 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61   as a whole is a
0590: 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20  lways in one of 
05a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
05b0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
05c0: 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 20   SQLITE_UNLOCK  
05d0: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
05e0: 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  che is not curre
05f0: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
0600: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0610: 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e            writin
0620: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
0630: 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ile.  There is n
0640: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
0650: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
0660: 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  held in memory. 
0670: 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   This is the ini
0680: 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  tial.**         
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
06a0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  ate..**.**   SQL
06b0: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 20 20 20  ITE_READLOCK    
06c0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
06d0: 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  is reading the d
06e0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74    Writing is not
0710: 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65   permitted.  The
0720: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20  re can be.**    
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64     multiple read
0750: 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68  ers accessing th
0760: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a  e same database.
0770: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0780: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74           file at
0790: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
07a0: 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 57  **.**   SQLITE_W
07b0: 52 49 54 45 4c 4f 43 4b 20 20 20 20 54 68 65 20  RITELOCK    The 
07c0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 77 72  page cache is wr
07d0: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
07e0: 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se..**          
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 63 63               Acc
0800: 65 73 73 20 69 73 20 65 78 63 6c 75 73 69 76 65  ess is exclusive
0810: 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63  .  No other proc
0820: 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20  esses or.**     
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 20 74 68 72 65 61 64 73 20 63 61 6e 20 62 65    threads can be
0850: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
0860: 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a  ing while one.**
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 20 69         process i
0890: 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s writing..**.**
08a0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
08b0: 63 6f 6d 65 73 20 75 70 20 69 6e 20 53 51 4c 49  comes up in SQLI
08c0: 54 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  TE_UNLOCK.  The 
08d0: 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20  first time a.** 
08e0: 73 71 6c 69 74 65 5f 70 61 67 65 5f 67 65 74 28  sqlite_page_get(
08f0: 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74  ) occurs, the st
0900: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0910: 74 6f 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f  to SQLITE_READLO
0920: 43 4b 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c  CK..** After all
0930: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0940: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
0950: 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65  sqlite_page_unre
0960: 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74  f(),.** the stat
0970: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61  e transitions ba
0980: 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 55 4e 4c  ck to SQLITE_UNL
0990: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
09a0: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
09b0: 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29  ite_page_write()
09c0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
09d0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
09e0: 73 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 57  s to.** SQLITE_W
09f0: 52 49 54 45 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65  RITELOCK.  (Note
0a00: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0a10: 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e  e_write() can on
0a20: 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20  ly be.** called 
0a30: 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  on an outstandin
0a40: 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61  g page which mea
0a50: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
0a60: 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20  r must.** be in 
0a70: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20  SQLITE_READLOCK 
0a80: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
0a90: 74 69 6f 6e 73 20 74 6f 20 53 51 4c 49 54 45 5f  tions to SQLITE_
0aa0: 57 52 49 54 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54  WRITELOCK.).** T
0ab0: 68 65 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 72  he sqlite_page_r
0ac0: 6f 6c 6c 62 61 63 6b 28 29 20 61 6e 64 20 73 71  ollback() and sq
0ad0: 6c 69 74 65 5f 70 61 67 65 5f 63 6f 6d 6d 69 74  lite_page_commit
0ae0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a  () functions .**
0af0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20   transition the 
0b00: 73 74 61 74 65 20 66 72 6f 6d 20 53 51 4c 49 54  state from SQLIT
0b10: 45 5f 57 52 49 54 45 4c 4f 43 4b 20 62 61 63 6b  E_WRITELOCK back
0b20: 20 74 6f 20 53 51 4c 49 54 45 5f 52 45 41 44 4c   to SQLITE_READL
0b30: 4f 43 4b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  OCK..*/.#define 
0b40: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20  SQLITE_UNLOCK   
0b50: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 51 4c     0.#define SQL
0b60: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 20 20 20  ITE_READLOCK    
0b70: 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  1.#define SQLITE
0b80: 5f 57 52 49 54 45 4c 4f 43 4b 20 20 20 32 0a 0a  _WRITELOCK   2..
0b90: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d  ./*.** Each in-m
0ba0: 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61  emory image of a
0bb0: 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74   page begins wit
0bc0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
0bd0: 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20  header..** This 
0be0: 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76  header is only v
0bf0: 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70  isible to this p
0c00: 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68  ager module.  Th
0c10: 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65  e client.** code
0c20: 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65   that calls page
0c30: 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20  r sees only the 
0c40: 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
0c50: 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f  s the header..*/
0c60: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0c70: 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74 72  PgHdr PgHdr;.str
0c80: 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61  uct PgHdr {.  Pa
0c90: 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0cb0: 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68 69  The pager to whi
0cc0: 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65 6c  ch this page bel
0cd0: 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ongs */.  Pgno p
0ce0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
0cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d00: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
0d10: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
0d20: 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c  gHdr *pNextHash,
0d30: 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a   *pPrevHash;  /*
0d40: 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   Hash collision 
0d50: 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e  chain for PgHdr.
0d60: 70 67 6e 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  pgno */.  int nR
0d70: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
0d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0d90: 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74  er of users of t
0da0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
0db0: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
0dc0: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
0dd0: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
0de0: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
0df0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
0e00: 74 41 6c 6c 2c 20 2a 70 50 72 65 76 41 6c 6c 3b  tAll, *pPrevAll;
0e10: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
0e20: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
0e30: 63 68 61 72 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20  char inJournal; 
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0e50: 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65  * TRUE if has be
0e60: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  en written to jo
0e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 63 68 61 72 20  urnal */.  char 
0e80: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
0e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
0ea0: 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  E if we need to 
0eb0: 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67  write back chang
0ec0: 65 73 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54  es */.  /* SQLIT
0ed0: 45 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65  E_PAGE_SIZE byte
0ee0: 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66  s of page data f
0ef0: 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65  ollow this heade
0f00: 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e  r */.  /* Pager.
0f10: 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
0f20: 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f  local data follo
0f30: 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  w the page data 
0f40: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  */.};../*.** Con
0f50: 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74  vert a pointer t
0f60: 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61  o a PgHdr into a
0f70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20   pointer to its 
0f80: 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b  data.** and back
0f90: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69   again..*/.#defi
0fa0: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ne PGHDR_TO_DATA
0fb0: 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28  (P)  ((void*)(&(
0fc0: 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20  P)[1])).#define 
0fd0: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29  DATA_TO_PGHDR(D)
0fe0: 20 20 28 26 28 28 50 67 48 64 72 2a 29 28 44 29    (&((PgHdr*)(D)
0ff0: 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50  )[-1]).#define P
1000: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29  GHDR_TO_EXTRA(P)
1010: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
1020: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c  *)(&(P)[1]))[SQL
1030: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a  ITE_PAGE_SIZE]).
1040: 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74  ./*.** How big t
1050: 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
1060: 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c  table used for l
1070: 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72  ocating in-memor
1080: 79 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61  y pages.** by pa
1090: 67 65 20 6e 75 6d 62 65 72 2e 20 20 4b 6e 75 74  ge number.  Knut
10a0: 68 20 73 61 79 73 20 74 68 69 73 20 73 68 6f 75  h says this shou
10b0: 6c 64 20 62 65 20 61 20 70 72 69 6d 65 20 6e 75  ld be a prime nu
10c0: 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mber..*/.#define
10d0: 20 4e 5f 50 47 5f 48 41 53 48 20 31 30 31 0a 0a   N_PG_HASH 101..
10e0: 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67  /*.** A open pag
10f0: 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e  e cache is an in
1100: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1110: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1120: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  e..*/.struct Pag
1130: 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  er {.  char *zFi
1140: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
1150: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1160: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1170: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
1180: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
1190: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
11a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
11b0: 20 20 69 6e 74 20 66 64 2c 20 6a 66 64 3b 20 20    int fd, jfd;  
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
11e0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
11f0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
1200: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
1210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1220: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1230: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
1240: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
1250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
1260: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
1270: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
1280: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
12b0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
12c0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
12d0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  /.  void (*xDest
12e0: 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 29 3b 20  ructor)(void*); 
12f0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
1300: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
1310: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  g pages */.  int
1320: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1330: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1340: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  l number of in-m
1350: 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20  emory pages */. 
1360: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1380: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  Number of in-mem
1390: 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50  ory pages with P
13a0: 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20  gHdr.nRef>0 */. 
13b0: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
13e0: 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20  f pages to hold 
13f0: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e  in cache */.  in
1400: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e  t nHit, nMiss, n
1410: 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63  Ovfl;     /* Cac
1420: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67  he hits, missing
1430: 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c  , and LRU overfl
1440: 6f 77 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ows */.  unsigne
1450: 64 20 63 68 61 72 20 73 74 61 74 65 3b 20 20 20  d char state;   
1460: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 55       /* SQLITE_U
1470: 4e 4c 4f 43 4b 2c 20 5f 52 45 41 44 4c 4f 43 4b  NLOCK, _READLOCK
1480: 20 6f 72 20 5f 57 52 49 54 45 4c 4f 43 4b 20 2a   or _WRITELOCK *
1490: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
14a0: 72 20 65 72 72 4d 61 73 6b 3b 20 20 20 20 20 20  r errMask;      
14b0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
14c0: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
14d0: 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
14e0: 63 68 61 72 20 74 65 6d 70 46 69 6c 65 3b 20 20  char tempFile;  
14f0: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
1500: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
1510: 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ile */.  unsigne
1520: 64 20 63 68 61 72 20 72 65 61 64 4f 6e 6c 79 3b  d char readOnly;
1530: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1540: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1550: 61 62 61 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67  abase */.  unsig
1560: 6e 65 64 20 63 68 61 72 20 2a 61 49 6e 4a 6f 75  ned char *aInJou
1570: 72 6e 61 6c 3b 20 20 2f 2a 20 4f 6e 65 20 62 69  rnal;  /* One bi
1580: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
1590: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
15a0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  file */.  PgHdr 
15b0: 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b  *pFirst, *pLast;
15c0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
15d0: 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20   free pages */. 
15e0: 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20   PgHdr *pAll;   
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1600: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  List of all page
1610: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48  s */.  PgHdr *aH
1620: 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20  ash[N_PG_HASH]; 
1630: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
1640: 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d   to map page num
1650: 62 65 72 20 6f 66 20 50 67 48 64 72 20 2a 2f 0a  ber of PgHdr */.
1660: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  };../*.** These 
1670: 61 72 65 20 62 69 74 73 20 74 68 61 74 20 63 61  are bits that ca
1680: 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61 67 65  n be set in Page
1690: 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64  r.errMask..*/.#d
16a0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
16b0: 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f  FULL     0x01  /
16c0: 2a 20 61 20 77 72 69 74 65 28 29 20 66 61 69 6c  * a write() fail
16d0: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ed */.#define PA
16e0: 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20  GER_ERR_MEM     
16f0: 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63   0x02  /* malloc
1700: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65  () failed */.#de
1710: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c  fine PAGER_ERR_L
1720: 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a  OCK     0x04  /*
1730: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f   error in the lo
1740: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a  cking protocol *
1750: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1760: 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30  ERR_CORRUPT  0x0
1770: 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f  8  /* database o
1780: 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  r journal corrup
1790: 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  tion */../*.** T
17a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
17b0: 63 6f 6e 74 61 69 6e 73 20 70 61 67 65 20 72 65  contains page re
17c0: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 66 6f 6c  cords in the fol
17d0: 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72 6d 61 74  lowing.** format
17e0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
17f0: 75 63 74 20 50 61 67 65 52 65 63 6f 72 64 20 50  uct PageRecord P
1800: 61 67 65 52 65 63 6f 72 64 3b 0a 73 74 72 75 63  ageRecord;.struc
1810: 74 20 50 61 67 65 52 65 63 6f 72 64 20 7b 0a 20  t PageRecord {. 
1820: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
1850: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 61 44 61  er */.  char aDa
1860: 74 61 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ta[SQLITE_PAGE_S
1870: 49 5a 45 5d 3b 20 20 2f 2a 20 4f 72 69 67 69 6e  IZE];  /* Origin
1880: 61 6c 20 64 61 74 61 20 66 6f 72 20 70 61 67 65  al data for page
1890: 20 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   pgno */.};../*.
18a0: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
18b0: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
18c0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
18d0: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
18e0: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
18f0: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
1900: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
1910: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
1920: 20 63 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   check..*/.stati
1930: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
1940: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
1950: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
1960: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
1970: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
1980: 30 78 36 33 2c 20 30 78 64 34 2c 0a 7d 3b 0a 0a  0x63, 0xd4,.};..
1990: 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20 70 61 67  /*.** Hash a pag
19a0: 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66  e number.*/.#def
19b0: 69 6e 65 20 70 61 67 65 72 5f 68 61 73 68 28 50  ine pager_hash(P
19c0: 4e 29 20 20 28 28 50 4e 29 25 4e 5f 50 47 5f 48  N)  ((PN)%N_PG_H
19d0: 41 53 48 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  ASH)../*.** Enab
19e0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  le reference cou
19f0: 6e 74 20 74 72 61 63 6b 69 6e 67 20 68 65 72 65  nt tracking here
1a00: 3a 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  :.*/.#if SQLITE_
1a10: 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72  TEST.  int pager
1a20: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
1a30: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f  = 0;.  static vo
1a40: 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  id pager_refinfo
1a50: 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20  (PgHdr *p){.    
1a60: 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d  static int cnt =
1a70: 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67   0;.    if( !pag
1a80: 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  er_refinfo_enabl
1a90: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
1aa0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  printf(.       "
1ab0: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
1ac0: 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c  =0x%08x nRef=%d\
1ad0: 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67  n",.       p->pg
1ae0: 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54  no, (int)PGHDR_T
1af0: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
1b00: 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e  ef.    );.    cn
1b10: 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68  t++;   /* Someth
1b20: 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65  ing to set a bre
1b30: 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20  akpoint on */.  
1b40: 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e  }.# define REFIN
1b50: 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66  FO(X)  pager_ref
1b60: 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20  info(X).#else.# 
1b70: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
1b80: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1b90: 41 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  Attempt to acqui
1ba0: 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 28  re a read lock (
1bb0: 69 66 20 77 72 6c 6f 63 6b 3d 3d 30 29 20 6f 72  if wrlock==0) or
1bc0: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 28 69   a write lock (i
1bd0: 66 20 77 72 6c 6f 63 6b 3d 3d 31 29 0a 2a 2a 20  f wrlock==1).** 
1be0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1bf0: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 30 20  file.  Return 0 
1c00: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 6e  on success and n
1c10: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c  on-zero if the l
1c20: 6f 63 6b 20 0a 2a 2a 20 63 6f 75 6c 64 20 6e 6f  ock .** could no
1c30: 74 20 62 65 20 61 63 71 75 69 72 65 64 2e 0a 2a  t be acquired..*
1c40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c50: 65 72 5f 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20  er_lock(int fd, 
1c60: 69 6e 74 20 77 72 6c 6f 63 6b 29 7b 0a 20 20 69  int wrlock){.  i
1c70: 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
1c80: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 6c 6f  flock lock;.  lo
1c90: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 77 72 6c 6f  ck.l_type = wrlo
1ca0: 63 6b 20 3f 20 46 5f 57 52 4c 43 4b 20 3a 20 46  ck ? F_WRLCK : F
1cb0: 5f 52 44 4c 43 4b 3b 0a 20 20 6c 6f 63 6b 2e 6c  _RDLCK;.  lock.l
1cc0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
1cd0: 45 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ET;.  lock.l_sta
1ce0: 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
1cf0: 3d 20 30 4c 3b 0a 20 20 72 63 20 3d 20 66 63 6e  = 0L;.  rc = fcn
1d00: 74 6c 28 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20  tl(fd, F_SETLK, 
1d10: 26 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e  &lock);.  return
1d20: 20 72 63 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   rc!=0;.}../*.**
1d30: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
1d40: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
1d50: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75  atic int pager_u
1d60: 6e 6c 6f 63 6b 28 66 64 29 7b 0a 20 20 69 6e 74  nlock(fd){.  int
1d70: 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 66 6c   rc;.  struct fl
1d80: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 6c 6f 63 6b  ock lock;.  lock
1d90: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
1da0: 4b 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  K;.  lock.l_when
1db0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
1dc0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
1dd0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
1de0: 0a 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64  .  rc = fcntl(fd
1df0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
1e00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 21 3d  );.  return rc!=
1e10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
1e20: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
1e30: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1e40: 66 64 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20  fd to the point 
1e50: 77 68 65 72 65 74 6f 20 66 72 6f 6d 0a 2a 2a 20  whereto from.** 
1e60: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1e70: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
1e80: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
1e90: 65 65 6b 28 69 6e 74 20 66 64 2c 20 6f 66 66 5f  eek(int fd, off_
1ea0: 74 20 77 68 65 72 65 74 6f 29 7b 0a 20 20 2f 2a  t whereto){.  /*
1eb0: 70 72 69 6e 74 66 28 22 53 45 45 4b 20 74 6f 20  printf("SEEK to 
1ec0: 70 61 67 65 20 25 64 5c 6e 22 2c 20 77 68 65 72  page %d\n", wher
1ed0: 65 74 6f 2f 53 51 4c 49 54 45 5f 50 41 47 45 5f  eto/SQLITE_PAGE_
1ee0: 53 49 5a 45 20 2b 20 31 29 3b 2a 2f 0a 20 20 6c  SIZE + 1);*/.  l
1ef0: 73 65 65 6b 28 66 64 2c 20 77 68 65 72 65 74 6f  seek(fd, whereto
1f00: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 72  , SEEK_SET);.  r
1f10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1f30: 74 65 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  te the given fil
1f40: 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  e so that it con
1f50: 74 61 69 6e 73 20 65 78 61 63 74 6c 79 20 6d 78  tains exactly mx
1f60: 50 67 20 70 61 67 65 73 0a 2a 2a 20 6f 66 20 64  Pg pages.** of d
1f70: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ata..*/.static i
1f80: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
1f90: 65 28 69 6e 74 20 66 64 2c 20 50 67 6e 6f 20 6d  e(int fd, Pgno m
1fa0: 78 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  xPg){.  int rc;.
1fb0: 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65    rc = ftruncate
1fc0: 28 66 64 2c 20 6d 78 50 67 2a 53 51 4c 49 54 45  (fd, mxPg*SQLITE
1fd0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 72  _PAGE_SIZE);.  r
1fe0: 65 74 75 72 6e 20 72 63 21 3d 30 20 3f 20 53 51  eturn rc!=0 ? SQ
1ff0: 4c 49 54 45 5f 49 4f 45 52 52 20 3a 20 53 51 4c  LITE_IOERR : SQL
2000: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2010: 20 52 65 61 64 20 6e 42 79 74 65 73 20 6f 66 20   Read nBytes of 
2020: 64 61 74 61 20 66 72 6f 6d 20 66 64 20 69 6e 74  data from fd int
2030: 6f 20 70 42 75 66 2e 20 20 49 66 20 74 68 65 20  o pBuf.  If the 
2040: 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  data cannot be.*
2050: 2a 20 72 65 61 64 20 6f 72 20 6f 6e 6c 79 20 61  * read or only a
2060: 20 70 61 72 74 69 61 6c 20 72 65 61 64 20 6f 63   partial read oc
2070: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 75  curs, then the u
2080: 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 0a 2a  nread parts of.*
2090: 2a 20 70 42 75 66 20 61 72 65 20 66 69 6c 6c 65  * pBuf are fille
20a0: 64 20 77 69 74 68 20 7a 65 72 6f 73 20 61 6e 64  d with zeros and
20b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
20c0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 49 4f 45  turns SQLITE_IOE
20d0: 52 52 2e 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  RR..** If the re
20e0: 61 64 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  ad is completely
20f0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
2100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
2110: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2120: 65 72 5f 72 65 61 64 28 69 6e 74 20 66 64 2c 20  er_read(int fd, 
2130: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
2140: 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  nByte){.  int rc
2150: 3b 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 52  ;.  /* printf("R
2160: 45 41 44 5c 6e 22 29 3b 2a 2f 0a 20 20 72 63 20  EAD\n");*/.  rc 
2170: 3d 20 72 65 61 64 28 66 64 2c 20 70 42 75 66 2c  = read(fd, pBuf,
2180: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72   nByte);.  if( r
2190: 63 3c 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  c<0 ){.    memse
21a0: 74 28 70 42 75 66 2c 20 30 2c 20 6e 42 79 74 65  t(pBuf, 0, nByte
21b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
21c0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
21d0: 20 20 69 66 28 20 72 63 3c 6e 42 79 74 65 20 29    if( rc<nByte )
21e0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  {.    memset(&((
21f0: 63 68 61 72 2a 29 70 42 75 66 29 5b 72 63 5d 2c  char*)pBuf)[rc],
2200: 20 30 2c 20 6e 42 79 74 65 20 2d 20 72 63 29 3b   0, nByte - rc);
2210: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2220: 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 6c 73 65 7b  _IOERR;.  }else{
2230: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2240: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
2250: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
2260: 72 69 74 65 20 6e 42 79 74 65 73 20 6f 66 20 64  rite nBytes of d
2270: 61 74 61 20 69 6e 74 6f 20 66 64 2e 20 20 49 66  ata into fd.  If
2280: 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 6f 63 63   any problem occ
2290: 75 72 73 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a  urs or if the.**
22a0: 20 77 72 69 74 65 20 69 73 20 69 6e 63 6f 6d 70   write is incomp
22b0: 6c 65 74 65 2c 20 53 51 4c 49 54 45 5f 49 4f 45  lete, SQLITE_IOE
22c0: 52 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  RR is returned. 
22d0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
22e0: 20 72 65 74 75 72 6e 65 64 20 75 70 6f 6e 20 63   returned upon c
22f0: 6f 6d 70 6c 65 74 65 20 73 75 63 63 65 73 73 2e  omplete success.
2300: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2310: 61 67 65 72 5f 77 72 69 74 65 28 69 6e 74 20 66  ager_write(int f
2320: 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  d, const void *p
2330: 42 75 66 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  Buf, int nByte){
2340: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 2f 2a 70  .  int rc;.  /*p
2350: 72 69 6e 74 66 28 22 57 52 49 54 45 5c 6e 22 29  rintf("WRITE\n")
2360: 3b 2a 2f 0a 20 20 72 63 20 3d 20 77 72 69 74 65  ;*/.  rc = write
2370: 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  (fd, pBuf, nByte
2380: 29 3b 0a 20 20 69 66 28 20 72 63 3c 6e 42 79 74  );.  if( rc<nByt
2390: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23a0: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
23b0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
23c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
23d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
23e0: 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
23f0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2400: 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72   into an appropr
2410: 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f  ate.** return co
2420: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
2430: 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  t pager_errcode(
2440: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2450: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2460: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2470: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
2480: 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20  GER_ERR_LOCK )  
2490: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
24a0: 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50  OTOCOL;.  if( pP
24b0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
24c0: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29  PAGER_ERR_FULL )
24d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24e0: 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67  FULL;.  if( pPag
24f0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
2500: 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20  GER_ERR_MEM )   
2510: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2520: 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  MEM;.  if( pPage
2530: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
2540: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29  ER_ERR_CORRUPT )
2550: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2560: 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72  RUPT;.  return r
2570: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
2580: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
2590: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
25a0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
25b0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
25c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
25d0: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
25e0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
25f0: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
2600: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
2610: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
2620: 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50  .  PgHdr *p = pP
2630: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
2640: 20 25 20 4e 5f 50 47 5f 48 41 53 48 5d 3b 0a 20   % N_PG_HASH];. 
2650: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
2660: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
2670: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
2680: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
2690: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
26a0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
26b0: 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69   and clear the i
26c0: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
26d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
26e0: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
26f0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
2700: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
2710: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
2720: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
2730: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
2740: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
2750: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
2760: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
2770: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
2780: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
2790: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
27a0: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
27b0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
27c0: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
27d0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
27e0: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
27f0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
2800: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
2810: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
2820: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
2830: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
2840: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
2850: 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50  pFirst = 0;.  pP
2860: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
2870: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
2880: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50  = 0;.  memset(pP
2890: 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
28a0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
28b0: 48 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72  Hash));.  pPager
28c0: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  ->nPage = 0;.  i
28d0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
28e0: 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  ==SQLITE_WRITELO
28f0: 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CK ){.    sqlite
2900: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
2910: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70 61  Pager);.  }.  pa
2920: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
2930: 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65 72  r->fd);.  pPager
2940: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
2950: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
2960: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
2970: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
2980: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65   0;.}../*.** Whe
2990: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
29a0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
29b0: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
29c0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
29d0: 64 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63  d.** a write loc
29e0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
29f0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2a00: 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 64 61   releases the da
2a10: 74 61 62 61 73 65 0a 2a 2a 20 77 72 69 74 65 20  tabase.** write 
2a20: 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65  lock and acquire
2a30: 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 6e  s a read lock in
2a40: 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65   its place.  The
2a50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2a60: 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20   is deleted and 
2a70: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 65  closed..**.** We
2a80: 20 68 61 76 65 20 74 6f 20 72 65 6c 65 61 73 65   have to release
2a90: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
2aa0: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
2ab0: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2c 0a   the read lock,.
2ac0: 2a 2a 20 73 6f 20 74 68 65 72 65 20 69 73 20 61  ** so there is a
2ad0: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
2ae0: 77 68 65 72 65 20 61 6e 6f 74 68 65 72 20 70 72  where another pr
2af0: 6f 63 65 73 73 20 63 61 6e 20 67 65 74 20 74 68  ocess can get th
2b00: 65 20 6c 6f 63 6b 0a 2a 2a 20 77 68 69 6c 65 20  e lock.** while 
2b10: 77 65 20 61 72 65 20 6e 6f 74 20 68 6f 6c 64 69  we are not holdi
2b20: 6e 67 20 69 74 2e 20 20 42 75 74 2c 20 6e 6f 20  ng it.  But, no 
2b30: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 73 68  other process sh
2b40: 6f 75 6c 64 20 64 6f 20 74 68 69 73 0a 2a 2a 20  ould do this.** 
2b50: 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
2b60: 6c 73 6f 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  lso holding a lo
2b70: 63 6b 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ck on the journa
2b80: 6c 2c 20 61 6e 64 20 6e 6f 20 70 72 6f 63 65 73  l, and no proces
2b90: 73 0a 2a 2a 20 73 68 6f 75 6c 64 20 67 65 74 20  s.** should get 
2ba0: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
2bb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 74  the database wit
2bc0: 68 6f 75 74 20 66 69 72 73 74 20 67 65 74 74 69  hout first getti
2bd0: 6e 67 20 61 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  ng a lock.** on 
2be0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f  the journal.  So
2bf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   this routine sh
2c00: 6f 75 6c 64 20 6e 65 76 65 72 20 66 61 69 6c 2e  ould never fail.
2c10: 20 20 42 75 74 20 69 74 20 63 61 6e 20 66 61 69    But it can fai
2c20: 6c 0a 2a 2a 20 69 66 20 61 6e 6f 74 68 65 72 20  l.** if another 
2c30: 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 70  process is not p
2c40: 6c 61 79 69 6e 67 20 62 79 20 74 68 65 20 72 75  laying by the ru
2c50: 6c 65 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73  les.  If it does
2c60: 20 66 61 69 6c 2c 0a 2a 2a 20 61 6c 6c 20 69 6e   fail,.** all in
2c70: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
2c80: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
2c90: 74 65 64 2c 20 74 68 65 20 50 41 47 45 52 5f 45  ted, the PAGER_E
2ca0: 52 52 5f 4c 4f 43 4b 20 62 69 74 0a 2a 2a 20 69  RR_LOCK bit.** i
2cb0: 73 20 73 65 74 20 69 6e 20 70 50 61 67 65 72 2d  s set in pPager-
2cc0: 3e 65 72 72 4d 61 73 6b 2c 20 61 6e 64 20 74 68  >errMask, and th
2cd0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2ce0: 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  ns SQLITE_PROTOC
2cf0: 4f 4c 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  OL..** SQLITE_OK
2d00: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
2d10: 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
2d20: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77  ic int pager_unw
2d30: 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a  ritelock(Pager *
2d40: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2d50: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
2d60: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
2d70: 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49  tate!=SQLITE_WRI
2d80: 54 45 4c 4f 43 4b 20 29 20 72 65 74 75 72 6e 20  TELOCK ) return 
2d90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67  SQLITE_OK;.  pag
2da0: 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
2db0: 2d 3e 66 64 29 3b 0a 20 20 72 63 20 3d 20 70 61  ->fd);.  rc = pa
2dc0: 67 65 72 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2d  ger_lock(pPager-
2dd0: 3e 66 64 2c 20 30 29 3b 0a 20 20 75 6e 6c 69 6e  >fd, 0);.  unlin
2de0: 6b 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  k(pPager->zJourn
2df0: 61 6c 29 3b 0a 20 20 63 6c 6f 73 65 28 70 50 61  al);.  close(pPa
2e00: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61  ger->jfd);.  pPa
2e10: 67 65 72 2d 3e 6a 66 64 20 3d 20 2d 31 3b 0a 20  ger->jfd = -1;. 
2e20: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
2e30: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
2e40: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
2e50: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 66  Journal = 0;.  f
2e60: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
2e70: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
2e80: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
2e90: 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
2ea0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
2eb0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
2ec0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ed0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
2ee0: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
2ef0: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  UNLOCK;.    rc =
2f00: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
2f10: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
2f20: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
2f30: 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65  RR_LOCK;.  }else
2f40: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2f50: 45 5f 4f 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  E_OK;.    pPager
2f60: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
2f70: 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  _READLOCK;.  }. 
2f80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f90: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
2fa0: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
2fb0: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
2fc0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
2fd0: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
2fe0: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
2ff0: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
3000: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
3010: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
3020: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
3030: 6f 6c 6c 6f 77 73 3a 20 20 54 68 65 72 65 20 69  ollows:  There i
3040: 73 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a 20  s an initial.** 
3050: 66 69 6c 65 2d 74 79 70 65 20 73 74 72 69 6e 67  file-type string
3060: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
3070: 6b 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 65 72  king.  Then ther
3080: 65 20 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  e is a single.**
3090: 20 50 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68 69   Pgno number whi
30a0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
30b0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
30c0: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
30d0: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 77 65 72 65  .** changes were
30e0: 20 6d 61 64 65 2e 20 20 54 68 65 20 64 61 74 61   made.  The data
30f0: 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65  base is truncate
3100: 64 20 74 6f 20 74 68 69 73 20 73 69 7a 65 2e 0a  d to this size..
3110: 2a 2a 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65 72  ** Next come zer
3120: 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 20 72  o or more page r
3130: 65 63 6f 72 64 73 20 77 68 65 72 65 20 65 61 63  ecords where eac
3140: 68 20 70 61 67 65 20 72 65 63 6f 72 64 0a 2a 2a  h page record.**
3150: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 50   consists of a P
3160: 67 6e 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f 50  gno and SQLITE_P
3170: 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f  AGE_SIZE bytes o
3180: 66 20 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a 20  f data.  See.** 
3190: 74 68 65 20 50 61 67 65 52 65 63 6f 72 64 20 73  the PageRecord s
31a0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 64 65 74  tructure for det
31b0: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ails..**.** For 
31c0: 70 6c 61 79 62 61 63 6b 2c 20 74 68 65 20 70 61  playback, the pa
31d0: 67 65 73 20 68 61 76 65 20 74 6f 20 62 65 20 72  ges have to be r
31e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
31f0: 72 6e 61 6c 20 69 6e 0a 2a 2a 20 72 65 76 65 72  rnal in.** rever
3200: 73 65 20 6f 72 64 65 72 20 61 6e 64 20 70 75 74  se order and put
3210: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f   back into the o
3220: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
3230: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
3240: 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
3250: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
3260: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
3270: 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
3280: 6e 61 6c 20 66 69 6c 65 20 28 61 73 20 64 65 74  nal file (as det
3290: 65 72 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b 69  ermined by looki
32a0: 6e 67 20 61 74 20 74 68 65 20 6d 61 67 69 63 20  ng at the magic 
32b0: 6e 75 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68 65  number.** at the
32c0: 20 62 65 67 69 6e 6e 69 6e 67 29 20 74 68 65 6e   beginning) then
32d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
32e0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f  turns SQLITE_PRO
32f0: 54 4f 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e 79  TOCOL..** If any
3300: 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 6f 63   other errors oc
3310: 63 75 72 20 64 75 72 69 6e 67 20 70 6c 61 79 62  cur during playb
3320: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
3330: 65 20 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c 79  e will.** likely
3340: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 73   be corrupted, s
3350: 6f 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f  o the PAGER_ERR_
3360: 43 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73  CORRUPT bit is s
3370: 65 74 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72 2d  et in.** pPager-
3380: 3e 65 72 72 4d 61 73 6b 20 61 6e 64 20 53 51 4c  >errMask and SQL
3390: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
33a0: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20  eturned.  If it 
33b0: 61 6c 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74 68  all.** works, th
33c0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
33d0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
33e0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
33f0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
3400: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
3410: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
3420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3430: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
3440: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3460: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
3470: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
3480: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
3490: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
34a0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
34b0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  s */.  struct st
34c0: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
34d0: 2f 2a 20 55 73 65 64 20 74 6f 20 73 69 7a 65 20  /* Used to size 
34e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
34f0: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
3500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
3510: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
3520: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
3530: 50 61 67 65 52 65 63 6f 72 64 20 70 67 52 65 63  PageRecord pgRec
3540: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
3550: 72 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f 66 28  r aMagic[sizeof(
3560: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 3b  aJournalMagic)];
3570: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
3580: 20 52 65 61 64 20 74 68 65 20 62 65 67 69 6e 6e   Read the beginn
3590: 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
35a0: 61 6c 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20  al and truncate 
35b0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
35c0: 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
35d0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
35e0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
35f0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 3e 3d 30 20   pPager->jfd>=0 
3600: 29 3b 0a 20 20 70 61 67 65 72 5f 73 65 65 6b 28  );.  pager_seek(
3610: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
3620: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65  .  rc = pager_re
3630: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
3640: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
3650: 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72  Magic));.  if( r
3660: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
3670: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 61 4a  memcmp(aMagic,aJ
3680: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 73 69 7a 65  ournalMagic,size
3690: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
36a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
36b0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
36c0: 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72  }.  rc = pager_r
36d0: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
36e0: 20 26 6d 78 50 67 2c 20 73 69 7a 65 6f 66 28 6d   &mxPg, sizeof(m
36f0: 78 50 67 29 29 3b 0a 20 20 69 66 28 20 72 63 21  xPg));.  if( rc!
3700: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3710: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3720: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 7d 0a 20 20  PROTOCOL;.  }.  
3730: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
3740: 50 61 67 65 72 2d 3e 66 64 2c 20 6d 78 50 67 29  Pager->fd, mxPg)
3750: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
3760: 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20  ze = mxPg;.  .  
3770: 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
3780: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 67   the journal beg
3790: 69 6e 6e 69 6e 67 20 61 74 20 74 68 65 20 65 6e  inning at the en
37a0: 64 20 61 6e 64 20 6d 6f 76 69 6e 67 0a 20 20 2a  d and moving.  *
37b0: 2a 20 74 6f 77 61 72 64 20 74 68 65 20 62 65 67  * toward the beg
37c0: 69 6e 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69  inning..  */.  i
37d0: 66 28 20 66 73 74 61 74 28 70 50 61 67 65 72 2d  f( fstat(pPager-
37e0: 3e 6a 66 64 2c 20 26 73 74 61 74 62 75 66 29 21  >jfd, &statbuf)!
37f0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3800: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
3810: 20 20 6e 52 65 63 20 3d 20 28 73 74 61 74 62 75    nRec = (statbu
3820: 66 2e 73 74 5f 73 69 7a 65 20 2d 20 28 73 69 7a  f.st_size - (siz
3830: 65 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65  eof(aMagic)+size
3840: 6f 66 28 50 67 6e 6f 29 29 29 20 2f 20 73 69 7a  of(Pgno))) / siz
3850: 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b  eof(PageRecord);
3860: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 73  ..  /* Process s
3870: 65 67 6d 65 6e 74 73 20 62 65 67 69 6e 6e 69 6e  egments beginnin
3880: 67 20 77 69 74 68 20 74 68 65 20 6c 61 73 74 20  g with the last 
3890: 61 6e 64 20 77 6f 72 6b 69 6e 67 20 62 61 63 6b  and working back
38a0: 77 61 72 64 73 0a 20 20 2a 2a 20 74 6f 20 74 68  wards.  ** to th
38b0: 65 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  e first..  */.  
38c0: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
38d0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 2f 2a  =0; i--){.    /*
38e0: 20 53 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67   Seek to the beg
38f0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 73 65  inning of the se
3900: 67 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 6f 66 66  gment */.    off
3910: 5f 74 20 6f 66 73 74 3b 0a 20 20 20 20 6f 66 73  _t ofst;.    ofs
3920: 74 20 3d 20 69 2a 73 69 7a 65 6f 66 28 50 61 67  t = i*sizeof(Pag
3930: 65 52 65 63 6f 72 64 29 20 2b 20 73 69 7a 65 6f  eRecord) + sizeo
3940: 66 28 61 4d 61 67 69 63 29 20 2b 20 73 69 7a 65  f(aMagic) + size
3950: 6f 66 28 50 67 6e 6f 29 3b 0a 20 20 20 20 72 63  of(Pgno);.    rc
3960: 20 3d 20 70 61 67 65 72 5f 73 65 65 6b 28 70 50   = pager_seek(pP
3970: 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 73 74 29  ager->jfd, ofst)
3980: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
3990: 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
39a0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
39b0: 72 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  read(pPager->jfd
39c0: 2c 20 26 70 67 52 65 63 2c 20 73 69 7a 65 6f 66  , &pgRec, sizeof
39d0: 28 70 67 52 65 63 29 29 3b 0a 20 20 20 20 69 66  (pgRec));.    if
39e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
39f0: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
3a00: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
3a10: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
3a20: 20 20 20 20 69 66 28 20 70 67 52 65 63 2e 70 67      if( pgRec.pg
3a30: 6e 6f 3e 6d 78 50 67 20 7c 7c 20 70 67 52 65 63  no>mxPg || pgRec
3a40: 2e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  .pgno==0 ){.    
3a50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
3a60: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 62 72 65  RRUPT;.      bre
3a70: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
3a80: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 70  * Playback the p
3a90: 61 67 65 2e 20 20 55 70 64 61 74 65 20 74 68 65  age.  Update the
3aa0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 70 79 20   in-memory copy 
3ab0: 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  of the page.    
3ac0: 2a 2a 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  ** at the same t
3ad0: 69 6d 65 2c 20 69 66 20 74 68 65 72 65 20 69 73  ime, if there is
3ae0: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
3af0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
3b00: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 52 65  kup(pPager, pgRe
3b10: 63 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  c.pgno);.    if(
3b20: 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 65   pPg ){.      me
3b30: 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
3b40: 54 41 28 70 50 67 29 2c 20 70 67 52 65 63 2e 61  TA(pPg), pgRec.a
3b50: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47  Data, SQLITE_PAG
3b60: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 6d  E_SIZE);.      m
3b70: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
3b80: 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50  XTRA(pPg), 0, pP
3b90: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
3ba0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 61     }.    rc = pa
3bb0: 67 65 72 5f 73 65 65 6b 28 70 50 61 67 65 72 2d  ger_seek(pPager-
3bc0: 3e 66 64 2c 20 28 70 67 52 65 63 2e 70 67 6e 6f  >fd, (pgRec.pgno
3bd0: 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  -1)*SQLITE_PAGE_
3be0: 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72  SIZE);.    if( r
3bf0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
3c00: 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 70  reak;.    rc = p
3c10: 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
3c20: 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61 44 61  r->fd, pgRec.aDa
3c30: 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ta, SQLITE_PAGE_
3c40: 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72  SIZE);.    if( r
3c50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
3c60: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
3c70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3c80: 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69  .    pager_unwri
3c90: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
3ca0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
3cb0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
3cc0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
3cd0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
3ce0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
3cf0: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
3d00: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
3d10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
3d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
3d30: 20 61 20 64 69 72 65 63 74 6f 72 79 20 77 68 65   a directory whe
3d40: 72 65 20 77 65 20 63 61 6e 20 70 6f 74 65 6e 74  re we can potent
3d50: 69 61 6c 6c 79 20 63 72 65 61 74 65 20 61 20 74  ially create a t
3d60: 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
3d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
3d80: 74 20 63 68 61 72 20 2a 66 69 6e 64 54 65 6d 70  t char *findTemp
3d90: 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  Dir(void){.  sta
3da0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3db0: 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
3dc0: 20 20 22 2e 22 2c 0a 20 20 20 20 20 22 2f 76 61    ".",.     "/va
3dd0: 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
3de0: 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
3df0: 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 65 6d  tmp",.     "/tem
3e00: 70 22 2c 0a 20 20 20 20 20 22 2e 2f 74 65 6d 70  p",.     "./temp
3e10: 22 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  ",.  };.  int i;
3e20: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
3e30: 75 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  uf;.  for(i=0; i
3e40: 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
3e50: 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
3e60: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
3e70: 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c   stat(azDirs[i],
3e80: 20 26 62 75 66 29 3d 3d 30 20 26 26 20 53 5f 49   &buf)==0 && S_I
3e90: 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
3ea0: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 53 5f  ).         && S_
3eb0: 49 57 55 53 52 28 62 75 66 2e 73 74 5f 6d 6f 64  IWUSR(buf.st_mod
3ec0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74  e) ){.       ret
3ed0: 75 72 6e 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20  urn azDirs[i];. 
3ee0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3ef0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
3f00: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
3f10: 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20  cache and put a 
3f20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
3f30: 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70  age cache in *pp
3f40: 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69  Pager..** The fi
3f50: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  le to be cached 
3f60: 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20  need not exist. 
3f70: 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
3f80: 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a   locked until.**
3f90: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
3fa0: 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67  to sqlitepager_g
3fb0: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
3fc0: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
3fd0: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
3fe0: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
3ff0: 69 6e 67 20 73 71 6c 69 74 65 70 61 67 65 72 5f  ing sqlitepager_
4000: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20  unref()..*/.int 
4010: 73 71 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e  sqlitepager_open
4020: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
4030: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
4040: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
4050: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
4060: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
4070: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
4080: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
4090: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
40a0: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  en */.  int mxPa
40b0: 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
40c0: 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f   /* Max number o
40d0: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  f in-memory cach
40e0: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  e pages */.  int
40f0: 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
4100: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
4110: 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
4120: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
4130: 67 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  ge */.){.  Pager
4140: 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
4150: 6e 61 6d 65 4c 65 6e 3b 0a 20 20 69 6e 74 20 66  nameLen;.  int f
4160: 64 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  d;.  int tempFil
4170: 65 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  e;.  int readOnl
4180: 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 54  y = 0;.  char zT
4190: 65 6d 70 5b 33 30 30 5d 3b 0a 0a 20 20 2a 70 70  emp[300];..  *pp
41a0: 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  Pager = 0;.  if(
41b0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
41c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
41d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
41e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
41f0: 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 66 64 20  ename ){.    fd 
4200: 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  = open(zFilename
4210: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
4220: 2c 20 30 36 34 34 29 3b 0a 20 20 20 20 69 66 28  , 0644);.    if(
4230: 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 66   fd<0 ){.      f
4240: 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  d = open(zFilena
4250: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  me, O_RDONLY, 0)
4260: 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79  ;.      readOnly
4270: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
4280: 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
4290: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
42a0: 6e 74 20 3d 20 38 3b 0a 20 20 20 20 63 68 61 72  nt = 8;.    char
42b0: 20 2a 7a 44 69 72 20 3d 20 66 69 6e 64 54 65 6d   *zDir = findTem
42c0: 70 44 69 72 28 29 3b 0a 20 20 20 20 69 66 28 20  pDir();.    if( 
42d0: 7a 44 69 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  zDir==0 ) return
42e0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
42f0: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
4300: 63 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 73 70 72  cnt--;.      spr
4310: 69 6e 74 66 28 7a 54 65 6d 70 2c 22 25 73 2f 5f  intf(zTemp,"%s/_
4320: 73 71 6c 69 74 65 5f 25 75 22 2c 28 75 6e 73 69  sqlite_%u",(unsi
4330: 67 6e 65 64 29 73 71 6c 69 74 65 52 61 6e 64 6f  gned)sqliteRando
4340: 6d 49 6e 74 65 67 65 72 28 29 29 3b 0a 20 20 20  mInteger());.   
4350: 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 54 65     fd = open(zTe
4360: 6d 70 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  mp, O_RDWR|O_CRE
4370: 41 54 7c 4f 5f 45 58 43 4c 2c 20 30 36 30 30 29  AT|O_EXCL, 0600)
4380: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 63 6e  ;.    }while( cn
4390: 74 3e 30 20 26 26 20 66 64 3c 30 20 29 3b 0a 20  t>0 && fd<0 );. 
43a0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
43b0: 54 65 6d 70 3b 0a 20 20 20 20 74 65 6d 70 46 69  Temp;.    tempFi
43c0: 6c 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  le = 1;.  }.  if
43d0: 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65  ( fd<0 ){.    re
43e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
43f0: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65  OPEN;.  }.  name
4400: 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69  Len = strlen(zFi
4410: 6c 65 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65  lename);.  pPage
4420: 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r = sqliteMalloc
4430: 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  ( sizeof(*pPager
4440: 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32 20 2b 20  ) + nameLen*2 + 
4450: 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  30 );.  if( pPag
4460: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f  er==0 ){.    clo
4470: 73 65 28 66 64 29 3b 0a 20 20 20 20 72 65 74 75  se(fd);.    retu
4480: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4490: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 7a  .  }.  pPager->z
44a0: 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
44b0: 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20  *)&pPager[1];.  
44c0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
44d0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
44e0: 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ename[nameLen+1]
44f0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
4500: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46  r->zFilename, zF
4510: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  ilename);.  strc
4520: 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
4530: 6e 61 6c 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  nal, zFilename);
4540: 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65  .  strcpy(&pPage
4550: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
4560: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
4570: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
4580: 3d 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e  = fd;.  pPager->
4590: 6a 66 64 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67  jfd = -1;.  pPag
45a0: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
45b0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
45c0: 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e   -1;.  pPager->n
45d0: 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Page = 0;.  pPag
45e0: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
45f0: 61 67 65 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a  age>5 ? mxPage :
4600: 20 31 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73   10;.  pPager->s
4610: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e  tate = SQLITE_UN
4620: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
4630: 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  errMask = 0;.  p
4640: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
4650: 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  = tempFile;.  pP
4660: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
4670: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61   readOnly;.  pPa
4680: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
4690: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
46a0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
46b0: 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b  nExtra = nExtra;
46c0: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
46d0: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
46e0: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
46f0: 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ));.  *ppPager =
4700: 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
4710: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4720: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
4730: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
4740: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
4750: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
4760: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
4770: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
4780: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
4790: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
47a0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
47b0: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
47c0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
47d0: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
47e0: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
47f0: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
4800: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
4810: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
4820: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
4830: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 70  a result sqlitep
4840: 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a  ager_close().  .
4850: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
4860: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
4870: 79 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e  y sqlitepager_un
4880: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
4890: 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 64  qlitepager_set_d
48a0: 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20  estructor(Pager 
48b0: 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
48c0: 78 44 65 73 63 29 28 76 6f 69 64 2a 29 29 7b 0a  xDesc)(void*)){.
48d0: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
48e0: 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
48f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4900: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
4910: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4920: 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
4930: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
4940: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
4950: 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  tepager_pagecoun
4960: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
4970: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 74 72  {.  int n;.  str
4980: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
4990: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
49a0: 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
49b0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
49c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
49d0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
49e0: 20 7d 0a 20 20 69 66 28 20 66 73 74 61 74 28 70   }.  if( fstat(p
49f0: 50 61 67 65 72 2d 3e 66 64 2c 20 26 73 74 61 74  Pager->fd, &stat
4a00: 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  buf)!=0 ){.    n
4a10: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
4a20: 20 20 20 6e 20 3d 20 73 74 61 74 62 75 66 2e 73     n = statbuf.s
4a30: 74 5f 73 69 7a 65 2f 53 51 4c 49 54 45 5f 50 41  t_size/SQLITE_PA
4a40: 47 45 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 69  GE_SIZE;.  }.  i
4a50: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
4a60: 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20  !=SQLITE_UNLOCK 
4a70: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
4a80: 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20  bSize = n;.  }. 
4a90: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
4aa0: 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
4ab0: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
4ac0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
4ad0: 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
4ae0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
4af0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
4b00: 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
4b10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4b20: 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
4b30: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
4b40: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
4b50: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
4b60: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
4b70: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
4b80: 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
4b90: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
4ba0: 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
4bb0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
4bc0: 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
4bd0: 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
4be0: 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
4bf0: 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
4c00: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
4c10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
4c20: 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  r_close(Pager *p
4c30: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
4c40: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
4c50: 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e  switch( pPager->
4c60: 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  state ){.    cas
4c70: 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  e SQLITE_WRITELO
4c80: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CK: {.      sqli
4c90: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
4ca0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
4cb0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
4cc0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
4cd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4ce0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
4cf0: 44 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 70  DLOCK: {.      p
4d00: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
4d10: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 62  er->fd);.      b
4d20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4d30: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4d40: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
4d50: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
4d60: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
4d70: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
4d80: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
4d90: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
4da0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
4db0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
4dc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
4dd0: 65 72 2d 3e 66 64 3e 3d 30 20 29 20 63 6c 6f 73  er->fd>=0 ) clos
4de0: 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
4df0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
4e00: 3e 6a 66 64 3c 30 20 29 3b 0a 20 20 69 66 28 20  >jfd<0 );.  if( 
4e10: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
4e20: 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 70   ){.    unlink(p
4e30: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
4e40: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
4e50: 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
4e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4e70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4e80: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
4e90: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
4ea0: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
4eb0: 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61  o sqlitepager_pa
4ec0: 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70  genumber(void *p
4ed0: 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
4ee0: 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  p = DATA_TO_PGHD
4ef0: 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
4f00: 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  rn p->pgno;.}../
4f10: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
4f20: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
4f30: 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
4f40: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a  If the page is.*
4f50: 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  * currently on t
4f60: 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65  he freelist (the
4f70: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4f80: 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a   is zero) then.*
4f90: 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * remove it from
4fa0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
4fb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
4fc0: 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
4fd0: 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
4fe0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
4ff0: 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
5000: 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
5010: 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
5020: 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
5030: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
5040: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
5050: 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
5060: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
5070: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
5080: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
5090: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
50a0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a  NextFree;.    }.
50b0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
50c0: 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  xtFree ){.      
50d0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
50e0: 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
50f0: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
5100: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
5110: 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  ->pPager->pLast 
5120: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
5130: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
5140: 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b  >pPager->nRef++;
5150: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66  .  }.  pPg->nRef
5160: 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  ++;.  REFINFO(pP
5170: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  g);.}../*.** Inc
5180: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
5190: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
51a0: 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
51b0: 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
51c0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
51d0: 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
51e0: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
51f0: 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61  _ref(void *pData
5200: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
5210: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
5220: 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72  pData);.  page_r
5230: 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
5240: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5250: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
5260: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  page..**.** A re
5270: 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
5280: 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61  isk file is obta
5290: 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  ined when the fi
52a0: 72 73 74 20 70 61 67 65 20 61 63 71 75 69 72 65  rst page acquire
52b0: 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
52c0: 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
52d0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
52e0: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
52f0: 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f  .**.** A _get wo
5300: 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65  rks for any page
5310: 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
5320: 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20  than 0.  If the 
5330: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
5340: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
5350: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
5360: 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74  age, then no act
5370: 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  ual disk.** read
5380: 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
5390: 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
53a0: 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74  the page is init
53b0: 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c  ialized to.** al
53c0: 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78  l zeros.  The ex
53d0: 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
53e0: 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
53f0: 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
5400: 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68  d.** to zeros th
5410: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  e first time a p
5420: 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
5430: 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  to memory..**.**
5440: 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
5450: 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
5460: 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
5470: 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
5480: 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
5490: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
54a0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
54b0: 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
54c0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
54d0: 6c 73 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f  lso sqlitepager_
54e0: 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  lookup().  Both 
54f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
5500: 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d   _lookup() attem
5510: 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
5520: 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
5530: 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
5540: 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
5550: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
5560: 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
5570: 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
5580: 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
5590: 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f  t in whereas _lo
55a0: 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
55b0: 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
55c0: 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
55d0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
55e0: 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
55f0: 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
5600: 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
5610: 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
5620: 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
5630: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
5640: 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76  ce _lookup() nev
5650: 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
5660: 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
5670: 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
5680: 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
5690: 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
56a0: 69 74 65 70 61 67 65 72 5f 67 65 74 28 50 61 67  itepager_get(Pag
56b0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
56c0: 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70   pgno, void **pp
56d0: 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
56e0: 70 50 67 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  pPg;..  /* Make 
56f0: 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
5700: 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
5710: 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
5720: 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20    if( pPager==0 
5730: 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  || pgno==0 ){.  
5740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5750: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
5760: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
5770: 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46   & ~(PAGER_ERR_F
5780: 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ULL) ){.    retu
5790: 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
57a0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
57b0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
57c0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
57d0: 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
57e0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a 20 20 2a   a read lock.  *
57f0: 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
5800: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
5810: 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
5820: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61  =0 ){.    if( pa
5830: 67 65 72 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2d  ger_lock(pPager-
5840: 3e 66 64 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  >fd, 0)!=0 ){.  
5850: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
5860: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
5870: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
5880: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
5890: 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  te = SQLITE_READ
58a0: 4c 4f 43 4b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  LOCK;..    /* If
58b0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
58c0: 65 78 69 73 74 73 2c 20 74 72 79 20 74 6f 20 70  exists, try to p
58d0: 6c 61 79 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  lay it back..   
58e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 63 63 65   */.    if( acce
58f0: 73 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ss(pPager->zJour
5900: 6e 61 6c 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20  nal,0)==0 ){.   
5910: 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
5920: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
5930: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 65 78 63 6c  journal for excl
5940: 75 73 69 76 65 20 61 63 63 65 73 73 2e 20 20 52  usive access.  R
5950: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
5960: 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77  Y if.       ** w
5970: 65 20 63 61 6e 6e 6f 74 20 67 65 74 20 65 78 63  e cannot get exc
5980: 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 74 6f  lusive access to
5990: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
59a0: 65 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e.       */.    
59b0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d     pPager->jfd =
59c0: 20 6f 70 65 6e 28 70 50 61 67 65 72 2d 3e 7a 4a   open(pPager->zJ
59d0: 6f 75 72 6e 61 6c 2c 20 4f 5f 52 44 4f 4e 4c 59  ournal, O_RDONLY
59e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 69 66 28  , 0);.       if(
59f0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 3c 30 20 7c   pPager->jfd<0 |
5a00: 7c 20 70 61 67 65 72 5f 6c 6f 63 6b 28 70 50 61  | pager_lock(pPa
5a10: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 21 3d 30 20  ger->jfd, 1)!=0 
5a20: 29 7b 0a 20 20 20 20 20 20 20 20 20 69 66 28 20  ){.         if( 
5a30: 70 50 61 67 65 72 2d 3e 6a 66 64 3e 3d 30 20 29  pPager->jfd>=0 )
5a40: 7b 20 63 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  { close(pPager->
5a50: 6a 66 64 29 3b 20 70 50 61 67 65 72 2d 3e 6a 66  jfd); pPager->jf
5a60: 64 20 3d 20 2d 31 3b 20 7d 0a 20 20 20 20 20 20  d = -1; }.      
5a70: 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
5a80: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
5a90: 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
5aa0: 30 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  0;.         retu
5ab0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5ac0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
5ad0: 20 2f 2a 20 47 65 74 20 61 20 77 72 69 74 65 20   /* Get a write 
5ae0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
5af0: 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 70  base */.       p
5b00: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
5b10: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
5b20: 69 66 28 20 70 61 67 65 72 5f 6c 6f 63 6b 28 70  if( pager_lock(p
5b30: 50 61 67 65 72 2d 3e 66 64 2c 20 31 29 21 3d 30  Pager->fd, 1)!=0
5b40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 6c 6f   ){.         clo
5b50: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
5b60: 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
5b70: 2d 3e 6a 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20  ->jfd = -1;.    
5b80: 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
5b90: 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
5ba0: 6e 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  n SQLITE_PROTOCO
5bb0: 4c 3b 0a 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  L;.       }..   
5bc0: 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
5bd0: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
5be0: 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
5bf0: 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
5c00: 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  .       ** lock 
5c10: 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
5c20: 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
5c30: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
5c40: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
5c50: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
5c60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5c70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
5c80: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
5c90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
5ca0: 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
5cb0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
5cc0: 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  r page in cache 
5cd0: 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
5ce0: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
5cf0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
5d00: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
5d10: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
5d20: 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
5d30: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
5d40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20   */.    int h;. 
5d50: 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73     pPager->nMiss
5d60: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
5d70: 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72  er->nPage<pPager
5d80: 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67  ->mxPage || pPag
5d90: 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 29 7b  er->pFirst==0 ){
5da0: 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
5db0: 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20   a new page */. 
5dc0: 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
5dd0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
5de0: 2a 70 50 67 29 20 2b 20 53 51 4c 49 54 45 5f 50  *pPg) + SQLITE_P
5df0: 41 47 45 5f 53 49 5a 45 20 2b 20 70 50 61 67 65  AGE_SIZE + pPage
5e00: 72 2d 3e 6e 45 78 74 72 61 20 29 3b 0a 20 20 20  r->nExtra );.   
5e10: 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
5e20: 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
5e30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 61   = 0;.        pa
5e40: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
5e50: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
5e60: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
5e70: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d 45   |= PAGER_ERR_ME
5e80: 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  M;.        retur
5e90: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
5eb0: 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
5ec0: 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  er;.      pPg->p
5ed0: 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
5ee0: 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 69 66  ->pAll;.      if
5ef0: 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29  ( pPager->pAll )
5f00: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
5f10: 2d 3e 70 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c  ->pAll->pPrevAll
5f20: 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 7d 0a   = pPg;.      }.
5f30: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
5f40: 41 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  All = 0;.      p
5f50: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
5f60: 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  g;.      pPager-
5f70: 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65  >nPage++;.    }e
5f80: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  lse{.      /* Re
5f90: 63 79 63 6c 65 20 61 6e 20 6f 6c 64 65 72 20 70  cycle an older p
5fa0: 61 67 65 2e 20 20 46 69 72 73 74 20 6c 6f 63 61  age.  First loca
5fb0: 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 62  te the page to b
5fc0: 65 20 72 65 63 79 63 6c 65 64 2e 0a 20 20 20 20  e recycled..    
5fd0: 20 20 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    ** Try to find
5fe0: 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74   one that is not
5ff0: 20 64 69 72 74 79 20 61 6e 64 20 69 73 20 6e 65   dirty and is ne
6000: 61 72 20 74 68 65 20 68 65 61 64 20 6f 66 0a 20  ar the head of. 
6010: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
6020: 72 65 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  ree list */.    
6030: 20 20 69 6e 74 20 63 6e 74 20 3d 20 70 50 61 67    int cnt = pPag
6040: 65 72 2d 3e 6d 78 50 61 67 65 2f 32 3b 0a 20 20  er->mxPage/2;.  
6050: 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72      pPg = pPager
6060: 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20  ->pFirst;.      
6070: 77 68 69 6c 65 28 20 70 50 67 2d 3e 64 69 72 74  while( pPg->dirt
6080: 79 20 26 26 20 30 3c 63 6e 74 2d 2d 20 26 26 20  y && 0<cnt-- && 
6090: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
60a0: 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  {.        pPg = 
60b0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
60c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
60d0: 28 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d  ( pPg==0 || pPg-
60e0: 3e 64 69 72 74 79 20 29 20 70 50 67 20 3d 20 70  >dirty ) pPg = p
60f0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
6100: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
6110: 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
6120: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
6130: 67 65 20 74 6f 20 62 65 20 72 65 63 79 63 6c 65  ge to be recycle
6140: 64 20 69 73 20 64 69 72 74 79 2c 20 73 79 6e 63  d is dirty, sync
6150: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
6160: 20 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a   write .      **
6170: 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 69 6e   the old page in
6180: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
6190: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
61a0: 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
61b0: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
61c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
61d0: 3e 69 6e 4a 6f 75 72 6e 61 6c 3d 3d 31 20 29 3b  >inJournal==1 );
61e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
61f0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
6200: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
6210: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
6220: 20 66 73 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a   fsync(pPager->j
6230: 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fd);.        if(
6240: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
6250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70      rc = sqlitep
6260: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
6270: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
6280: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
6290: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
62a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
62b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
62c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
62d0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
62e0: 20 20 20 20 20 20 70 61 67 65 72 5f 73 65 65 6b        pager_seek
62f0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 50  (pPager->fd, (pP
6300: 67 2d 3e 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54  g->pgno-1)*SQLIT
6310: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
6320: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
6330: 5f 77 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  _write(pPager->f
6340: 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  d, PGHDR_TO_DATA
6350: 28 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41  (pPg), SQLITE_PA
6360: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
6370: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6380: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
6390: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
63a0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
63b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  r);.          *p
63c0: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
63d0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
63e0: 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
63f0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
6400: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
6410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6420: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69  }..      /* Unli
6430: 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
6440: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
6450: 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
6460: 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20  table.      */. 
6470: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50       if( pPg->pP
6480: 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
6490: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
64a0: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
64b0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
64c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
64d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
64e0: 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20  er->pFirst==pPg 
64f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
6500: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
6510: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
6520: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
6530: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
6540: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65          pPg->pNe
6550: 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
6560: 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
6570: 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ee;.      }else{
6580: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6590: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d   pPager->pLast==
65a0: 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70  pPg );.        p
65b0: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
65c0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
65d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
65e0: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
65f0: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30  g->pPrevFree = 0
6600: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  ;.      if( pPg-
6610: 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
6620: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
6630: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
6640: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
6650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6660: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61  if( pPg->pPrevHa
6670: 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  sh ){.        pP
6680: 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
6690: 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
66a0: 4e 65 78 74 48 61 73 68 3b 0a 20 20 20 20 20 20  NextHash;.      
66b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 68  }else{.        h
66c0: 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50   = pager_hash(pP
66d0: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
66e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
66f0: 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20  ->aHash[h]==pPg 
6700: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
6710: 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
6720: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
6730: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
6740: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
6750: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
6760: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
6770: 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Ovfl++;.    }.  
6780: 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
6790: 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  no;.    if( pPag
67a0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
67b0: 26 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  & pgno<=pPager->
67c0: 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
67d0: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
67e0: 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
67f0: 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
6800: 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
6810: 29 21 3d 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  )!=0;.    }else{
6820: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
6830: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  urnal = 0;.    }
6840: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
6850: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  = 0;.    pPg->nR
6860: 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49  ef = 1;.    REFI
6870: 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50  NFO(pPg);.    pP
6880: 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
6890: 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68    h = pager_hash
68a0: 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d  (pgno);.    pPg-
68b0: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
68c0: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
68d0: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
68e0: 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  [h] = pPg;.    i
68f0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
6900: 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
6910: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
6920: 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  h->pPrevHash==0 
6930: 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  );.      pPg->pN
6940: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
6950: 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
6960: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
6970: 64 62 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74  dbSize<0 ) sqlit
6980: 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  epager_pagecount
6990: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
69a0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
69b0: 3c 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d  <pgno ){.      m
69c0: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
69d0: 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53 51 4c  ATA(pPg), 0, SQL
69e0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
69f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6a00: 20 70 61 67 65 72 5f 73 65 65 6b 28 70 50 61 67   pager_seek(pPag
6a10: 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
6a20: 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  *SQLITE_PAGE_SIZ
6a30: 45 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  E);.      pager_
6a40: 72 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  read(pPager->fd,
6a50: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
6a60: 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  Pg), SQLITE_PAGE
6a70: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
6a80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45    if( pPager->nE
6a90: 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20  xtra>0 ){.      
6aa0: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
6ab0: 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
6ac0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
6ad0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6ae0: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
6af0: 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
6b00: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
6b10: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48  /.    pPager->nH
6b20: 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72  it++;.    page_r
6b30: 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
6b40: 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54  ppPage = PGHDR_T
6b50: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72  O_DATA(pPg);.  r
6b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
6b80: 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
6b90: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
6ba0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
6bb0: 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
6bc0: 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
6bd0: 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
6be0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
6bf0: 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
6c00: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
6c10: 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
6c20: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 70  See also sqlitep
6c30: 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65  ager_get().  The
6c40: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
6c50: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
6c60: 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 70 61  .** and sqlitepa
6c70: 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61  ger_get() is tha
6c80: 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
6c90: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
6ca0: 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
6cb0: 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
6cc0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
6cd0: 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
6ce0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
6cf0: 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
6d00: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
6d10: 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
6d20: 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
6d30: 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
6d40: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
6d50: 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  epager_lookup(Pa
6d60: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
6d70: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
6d80: 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 4d 61 6b   *pPg;..  /* Mak
6d90: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
6da0: 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
6db0: 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
6dc0: 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d   .  if( pPager==
6dd0: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a  0 || pgno==0 ){.
6de0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6df0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
6e00: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
6e10: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
6e20: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6e30: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
6e40: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Ref==0 ){.    re
6e50: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50  turn 0;.  }.  pP
6e60: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
6e70: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
6e80: 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72    if( pPg==0 ) r
6e90: 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f  eturn 0;.  page_
6ea0: 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
6eb0: 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
6ec0: 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
6ed0: 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
6ee0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
6ef0: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
6f00: 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
6f10: 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
6f20: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
6f30: 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
6f40: 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
6f50: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
6f60: 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
6f70: 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
6f80: 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
6f90: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
6fa0: 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
6fb0: 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
6fc0: 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
6fd0: 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
6fe0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
6ff0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
7000: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
7010: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
7020: 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
7030: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54    */.  pPg = DAT
7040: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
7050: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
7060: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50  ->nRef>0 );.  pP
7070: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7080: 65 72 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d  er;.  pPg->nRef-
7090: 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  -;.  REFINFO(pPg
70a0: 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68  );..  /* When th
70b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
70c0: 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65  rences to a page
70d0: 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74   reach 0, call t
70e0: 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74  he.  ** destruct
70f0: 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  or and add the p
7100: 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
7110: 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
7120: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
7130: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
7140: 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
7150: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
7160: 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
7170: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
7180: 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
7190: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
71a0: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
71b0: 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
71c0: 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
71d0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
71e0: 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
71f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
7200: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
7210: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
7220: 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
7230: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  a);.    }.  .   
7240: 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67   /* When all pag
7250: 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65  es reach the fre
7260: 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20  elist, drop the 
7270: 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20  read lock from. 
7280: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
7290: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
72a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
72b0: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
72c0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20  pPager->nRef>=0 
72d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
72e0: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
72f0: 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
7300: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
7310: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7320: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7330: 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
7340: 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20   as writeable.  
7350: 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
7360: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
7370: 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69  rnal .** if it i
7380: 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
7390: 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ady.  This routi
73a0: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
73b0: 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a  d before making.
73c0: 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  ** changes to a 
73d0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
73e0: 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
73f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7400: 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65  d, the pager cre
7410: 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f  ates a new.** jo
7420: 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72  urnal and acquir
7430: 65 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  es a write lock 
7440: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
7450: 20 20 49 66 20 74 68 65 20 77 72 69 74 65 0a 2a    If the write.*
7460: 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
7470: 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
7480: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
7490: 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
74a0: 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
74b0: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
74c0: 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
74d0: 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
74e0: 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
74f0: 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
7500: 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
7510: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
7520: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
7530: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
7540: 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
7550: 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
7560: 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
7570: 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
7580: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
7590: 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
75a0: 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
75b0: 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
75c0: 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
75d0: 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
75e0: 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
75f0: 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
7600: 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
7610: 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f   to sqlitepager_
7620: 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  commit() or sqli
7630: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
7640: 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
7650: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
7660: 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70  er_write(void *p
7670: 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
7680: 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
7690: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
76a0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
76b0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
76c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
76d0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
76e0: 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20  errMask ){ .    
76f0: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
7700: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
7710: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
7720: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
7730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
7740: 52 4d 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 64  RM;.  }.  pPg->d
7750: 69 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20  irty = 1;.  if( 
7760: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  pPg->inJournal )
7770: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
7780: 4f 4b 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20  OK; }.  assert( 
7790: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53  pPager->state!=S
77a0: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  QLITE_UNLOCK );.
77b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
77c0: 61 74 65 3d 3d 53 51 4c 49 54 45 5f 52 45 41 44  ate==SQLITE_READ
77d0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
77e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
77f0: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
7800: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
7810: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nal = sqliteMall
7820: 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
7830: 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20  ze/8 + 1 );.    
7840: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
7850: 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
7860: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7870: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
7880: 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
7890: 6f 70 65 6e 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  open(pPager->zJo
78a0: 75 72 6e 61 6c 2c 20 4f 5f 52 44 57 52 7c 4f 5f  urnal, O_RDWR|O_
78b0: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 20 20  CREAT, 0644);.  
78c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
78d0: 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  d<0 ){.      ret
78e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
78f0: 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  PEN;.    }.    i
7900: 66 28 20 70 61 67 65 72 5f 6c 6f 63 6b 28 70 50  f( pager_lock(pP
7910: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 20 29 7b  ager->jfd, 1) ){
7920: 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 70 50 61  .      close(pPa
7930: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
7940: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 2d   pPager->jfd = -
7950: 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
7960: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
7970: 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c   }.    pager_unl
7980: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ock(pPager->fd);
7990: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 6c  .    if( pager_l
79a0: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
79b0: 31 29 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  1) ){.      clos
79c0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
79d0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
79e0: 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 50  d = -1;.      pP
79f0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
7a00: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  LITE_UNLOCK;.   
7a10: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
7a20: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
7a30: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 72 65 74 75  LOCK;.      retu
7a40: 72 6e 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  rn SQLITE_PROTOC
7a50: 4f 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  OL;.    }.    pP
7a60: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
7a70: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a  LITE_WRITELOCK;.
7a80: 20 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f      sqlitepager_
7a90: 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
7aa0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  );.    pPager->o
7ab0: 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
7ac0: 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
7ad0: 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
7ae0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
7af0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
7b00: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7b10: 63 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  c));.    if( rc=
7b20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7b30: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
7b40: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
7b50: 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  , &pPager->dbSiz
7b60: 65 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29  e, sizeof(Pgno))
7b70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7b80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7b90: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
7ba0: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
7bb0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
7bc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7bd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
7be0: 4c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  L;.      return 
7bf0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
7c00: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
7c10: 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57 52  state==SQLITE_WR
7c20: 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ITELOCK );.  ass
7c30: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 66 64  ert( pPager->jfd
7c40: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67  >=0 );.  if( pPg
7c50: 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
7c60: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
7c70: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
7c80: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
7c90: 2c 20 26 70 50 67 2d 3e 70 67 6e 6f 2c 20 73 69  , &pPg->pgno, si
7ca0: 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
7cb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7cc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
7cd0: 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61   pager_write(pPa
7ce0: 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 2c  ger->jfd, pData,
7cf0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
7d00: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
7d10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7d20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70  ){.      sqlitep
7d30: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
7d40: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
7d50: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
7d60: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
7d70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
7d80: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
7d90: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
7da0: 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
7db0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
7dc0: 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
7dd0: 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
7de0: 26 37 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  &7);.  }.  pPg->
7df0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
7e00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
7e10: 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
7e20: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
7e30: 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
7e40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7e50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7e60: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
7e70: 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
7e80: 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
7e90: 76 69 6f 75 73 20 70 61 73 73 65 64 0a 2a 2a 20  vious passed.** 
7ea0: 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77  to sqlitepager_w
7eb0: 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
7ec0: 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
7ed0: 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
7ee0: 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
7ef0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
7f00: 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   page..*/.int sq
7f10: 6c 69 74 65 70 61 67 65 72 5f 69 73 77 72 69 74  litepager_iswrit
7f20: 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74  eable(void *pDat
7f30: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
7f40: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
7f50: 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
7f60: 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
7f70: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c  ./*.** Commit al
7f80: 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  l changes to the
7f90: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
7fa0: 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
7fb0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
7fc0: 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20  he commit fails 
7fd0: 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
7fe0: 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d  a rollback attem
7ff0: 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e  pt is made.** an
8000: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
8010: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
8020: 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b   the commit work
8030: 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  ed, SQLITE_OK.**
8040: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
8050: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
8060: 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  _commit(Pager *p
8070: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 2c  Pager){.  int i,
8080: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
8090: 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  g;..  if( pPager
80a0: 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52  ->errMask==PAGER
80b0: 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  _ERR_FULL ){.   
80c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
80d0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
80e0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
80f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
8100: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
8110: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8120: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
8130: 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
8140: 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
8150: 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
8160: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8170: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8180: 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate!=SQLITE_WRIT
8190: 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  ELOCK ){.    ret
81a0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
81b0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
81c0: 70 50 61 67 65 72 2d 3e 6a 66 64 3e 3d 30 20 29  pPager->jfd>=0 )
81d0: 3b 0a 20 20 69 66 28 20 66 73 79 6e 63 28 70 50  ;.  if( fsync(pP
81e0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
81f0: 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
8200: 6f 72 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ort;.  }.  for(i
8210: 3d 30 3b 20 69 3c 4e 5f 50 47 5f 48 41 53 48 3b  =0; i<N_PG_HASH;
8220: 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 70   i++){.    for(p
8230: 50 67 3d 70 50 61 67 65 72 2d 3e 61 48 61 73 68  Pg=pPager->aHash
8240: 5b 69 5d 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  [i]; pPg; pPg=pP
8250: 67 2d 3e 70 4e 65 78 74 48 61 73 68 29 7b 0a 20  g->pNextHash){. 
8260: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69       if( pPg->di
8270: 72 74 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  rty==0 ) continu
8280: 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e;.      rc = pa
8290: 67 65 72 5f 73 65 65 6b 28 70 50 61 67 65 72 2d  ger_seek(pPager-
82a0: 3e 66 64 2c 20 28 70 50 67 2d 3e 70 67 6e 6f 2d  >fd, (pPg->pgno-
82b0: 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  1)*SQLITE_PAGE_S
82c0: 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IZE);.      if( 
82d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
82e0: 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
82f0: 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  t;.      rc = pa
8300: 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 72  ger_write(pPager
8310: 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
8320: 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45  ATA(pPg), SQLITE
8330: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
8340: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8350: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
8360: 69 74 5f 61 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  it_abort;.    }.
8370: 20 20 7d 0a 20 20 69 66 28 20 66 73 79 6e 63 28    }.  if( fsync(
8380: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 67 6f  pPager->fd) ) go
8390: 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
83a0: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e  .  rc = pager_un
83b0: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
83c0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
83d0: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
83e0: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  rn rc;..  /* Jum
83f0: 70 20 68 65 72 65 20 69 66 20 61 6e 79 74 68 69  p here if anythi
8400: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75  ng goes wrong du
8410: 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
8420: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f  process..  */.co
8430: 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63  mmit_abort:.  rc
8440: 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72   = sqlitepager_r
8450: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
8460: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8470: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
8480: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
8490: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
84a0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
84b0: 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
84c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
84d0: 73 20 62 61 63 6b 20 74 6f 20 72 65 61 64 2d 6f  s back to read-o
84e0: 6e 6c 79 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  nly mode..** All
84f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
8500: 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
8510: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
8520: 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
8530: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
8540: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
8550: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
8560: 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
8570: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
8580: 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
8590: 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
85a0: 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
85b0: 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54  col (SQLITE_PROT
85c0: 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20  OCOL) or unless 
85d0: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
85e0: 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
85f0: 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
8600: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
8610: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
8620: 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
8630: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
8640: 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
8650: 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
8660: 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
8670: 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
8680: 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
8690: 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
86a0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
86b0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
86c0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f  t sqlitepager_ro
86d0: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
86e0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
86f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
8700: 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61  rrMask!=0 && pPa
8710: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41  ger->errMask!=PA
8720: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
8730: 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
8740: 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
8750: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
8760: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
8770: 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20  E_WRITELOCK ){. 
8780: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8790: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
87a0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
87b0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
87c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
87d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
87e0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67  ORRUPT;.    pPag
87f0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
8800: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
8810: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
8820: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72  dbSize = -1;.  r
8830: 65 74 75 72 6e 20 72 63 3b 0a 7d 3b 0a 0a 2f 2a  eturn rc;.};../*
8840: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
8850: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
8860: 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
8870: 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
8880: 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
8890: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
88a0: 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
88b0: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
88c0: 65 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c  epager_isreadonl
88d0: 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
88e0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
88f0: 72 2d 3e 72 65 61 64 6f 6e 6c 79 3b 0a 7d 0a 0a  r->readonly;.}..
8900: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8910: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
8920: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
8930: 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
8940: 20 2a 73 71 6c 69 74 65 70 61 67 65 72 5f 73 74   *sqlitepager_st
8950: 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
8960: 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
8970: 20 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20   a[9];.  a[0] = 
8980: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
8990: 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
89a0: 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
89b0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
89c0: 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
89d0: 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
89e0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
89f0: 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
8a00: 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d  >errMask;.  a[6]
8a10: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
8a20: 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
8a30: 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
8a40: 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b  = pPager->nOvfl;
8a50: 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a  .  return a;.}..
8a60: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  #if SQLITE_TEST.
8a70: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
8a80: 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
8a90: 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
8aa0: 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
8ab0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
8ac0: 65 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50  epager_refdump(P
8ad0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
8ae0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
8af0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
8b00: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
8b10: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
8b20: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
8b30: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
8b40: 20 20 20 70 72 69 6e 74 66 28 22 50 41 47 45 20     printf("PAGE 
8b50: 25 33 64 20 61 64 64 72 3d 30 78 25 30 38 78 20  %3d addr=0x%08x 
8b60: 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  nRef=%d\n", .   
8b70: 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28      pPg->pgno, (
8b80: 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  int)PGHDR_TO_DAT
8b90: 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
8ba0: 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
8bb0: 0a                                               .