/ Hex Artifact Content
Login

Artifact f39d99e9339e5fff3fd9852f48d2fc8308933d3b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 33  : pager.c,v 1.33
0350: 20 32 30 30 31 2f 31 32 2f 31 34 20 31 35 3a 30   2001/12/14 15:0
0360: 39 3a 35 37 20 64 72 68 20 45 78 70 20 24 0a 2a  9:57 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0380: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
0390: 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e 63  e "pager.h".#inc
03a0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
03b0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
03c0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
03d0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  .h>../*.** The p
03e0: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
03f0: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0400: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0410: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0420: 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  :.**.**   SQLITE
0430: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 54 68  _UNLOCK       Th
0440: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0450: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
0460: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0490: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
04a0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
04d0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
04e0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0500: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0510: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 52 45 41  .**   SQLITE_REA
0520: 44 4c 4f 43 4b 20 20 20 20 20 54 68 65 20 70 61  DLOCK     The pa
0530: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0540: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0550: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0560: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0570: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0580: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0590: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
05b0: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
05c0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
05d0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0600: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0610: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0620: 4b 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61  K    The page ca
0630: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0640: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0670: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0680: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0690: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
06a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
06b0: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
06c0: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
06d0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0700: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
0710: 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20 75  ge cache comes u
0720: 70 20 69 6e 20 53 51 4c 49 54 45 5f 55 4e 4c 4f  p in SQLITE_UNLO
0730: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0740: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 5f  ime a.** sqlite_
0750: 70 61 67 65 5f 67 65 74 28 29 20 6f 63 63 75 72  page_get() occur
0760: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0770: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53 51 4c 49  nsitions to SQLI
0780: 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2a 20  TE_READLOCK..** 
0790: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
07a0: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
07b0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
07c0: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
07d0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
07e0: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 53  itions back to S
07f0: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54  QLITE_UNLOCK.  T
0800: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0810: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0820: 65 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c  e_write() is cal
0830: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0840: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0850: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0860: 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  K.  (Note that s
0870: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0880: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0890: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
08a0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
08b0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
08c0: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
08d0: 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49 54 45 5f  ** be in SQLITE_
08e0: 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f 72 65 20  READLOCK before 
08f0: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0900: 6f 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  o SQLITE_WRITELO
0910: 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73 71 6c 69  CK.).** The sqli
0920: 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62 61 63 6b  te_page_rollback
0930: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 5f 70 61  () and sqlite_pa
0940: 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66 75 6e 63  ge_commit() func
0950: 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61 6e 73 69  tions .** transi
0960: 74 69 6f 6e 20 74 68 65 20 73 74 61 74 65 20 66  tion the state f
0970: 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52 49 54 45  rom SQLITE_WRITE
0980: 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20 53 51 4c  LOCK back to SQL
0990: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2f  ITE_READLOCK..*/
09a0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
09b0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64  UNLOCK      0.#d
09c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 45 41  efine SQLITE_REA
09d0: 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64 65 66 69  DLOCK    1.#defi
09e0: 6e 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  ne SQLITE_WRITEL
09f0: 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a 2a 2a 20  OCK   2.../*.** 
0a00: 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  Each in-memory i
0a10: 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62  mage of a page b
0a20: 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66  egins with the f
0a30: 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e  ollowing header.
0a40: 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20  .** This header 
0a50: 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20  is only visible 
0a60: 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f  to this pager mo
0a70: 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e  dule.  The clien
0a80: 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63  t.** code that c
0a90: 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20  alls pager sees 
0aa0: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68  only the data th
0ab0: 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68  at follows the h
0ac0: 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  eader..*/.typede
0ad0: 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50  f struct PgHdr P
0ae0: 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48  gHdr;.struct PgH
0af0: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
0b00: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
0b10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
0b20: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
0b30: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
0b40: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b60: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
0b70: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
0b80: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
0b90: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
0ba0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
0bb0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
0bc0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
0bd0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
0c00: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
0c10: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
0c20: 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46  extFree, *pPrevF
0c30: 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73  ree;  /* Freelis
0c40: 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65  t of pages where
0c50: 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67   nRef==0 */.  Pg
0c60: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 2c 20 2a  Hdr *pNextAll, *
0c70: 70 50 72 65 76 41 6c 6c 3b 20 20 20 20 2f 2a 20  pPrevAll;    /* 
0c80: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
0c90: 67 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 69 6e  ges */.  char in
0ca0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0cb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
0cc0: 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  if has been writ
0cd0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
0ce0: 2f 0a 20 20 63 68 61 72 20 64 69 72 74 79 3b 20  /.  char dirty; 
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65     /* TRUE if we
0d10: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 62   need to write b
0d20: 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ack changes */. 
0d30: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 5f   /* SQLITE_PAGE_
0d40: 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20 70 61  SIZE bytes of pa
0d50: 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74  ge data follow t
0d60: 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  his header */.  
0d70: 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  /* Pager.nExtra 
0d80: 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64  bytes of local d
0d90: 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  ata follow the p
0da0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a  age data */.};..
0db0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
0dc0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
0dd0: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
0de0: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
0df0: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
0e00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
0e10: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28  R_TO_DATA(P)  ((
0e20: 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29  void*)(&(P)[1]))
0e30: 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f  .#define DATA_TO
0e40: 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50  _PGHDR(D)  (&((P
0e50: 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a  gHdr*)(D))[-1]).
0e60: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
0e70: 5f 45 58 54 52 41 28 50 29 20 28 28 76 6f 69 64  _EXTRA(P) ((void
0e80: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
0e90: 5b 31 5d 29 29 5b 53 51 4c 49 54 45 5f 50 41 47  [1]))[SQLITE_PAG
0ea0: 45 5f 53 49 5a 45 5d 29 0a 0a 2f 2a 0a 2a 2a 20  E_SIZE])../*.** 
0eb0: 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20  How big to make 
0ec0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75  the hash table u
0ed0: 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  sed for locating
0ee0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
0ef0: 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62  .** by page numb
0f00: 65 72 2e 20 20 4b 6e 75 74 68 20 73 61 79 73 20  er.  Knuth says 
0f10: 74 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 61  this should be a
0f20: 20 70 72 69 6d 65 20 6e 75 6d 62 65 72 2e 0a 2a   prime number..*
0f30: 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48  /.#define N_PG_H
0f40: 41 53 48 20 33 37 33 0a 0a 2f 2a 0a 2a 2a 20 41  ASH 373../*.** A
0f50: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
0f60: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
0f70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0f80: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
0f90: 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20  truct Pager {.  
0fa0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0fc0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
0fd0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
0fe0: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
0ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1000: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1010: 20 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46 69 6c   file */.  OsFil
1020: 65 20 66 64 2c 20 6a 66 64 3b 20 20 20 20 20 20  e fd, jfd;      
1030: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1040: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
1050: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
1060: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  nal */.  int jou
1070: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
1080: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1090: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
10a0: 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69  criptors is vali
10b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  d */.  int dbSiz
10c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10e0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
10f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
1100: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
1110: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
1120: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
1130: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
1140: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
1150: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1160: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
1170: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
1180: 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20   page */.  void 
1190: 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76  (*xDestructor)(v
11a0: 6f 69 64 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  oid*); /* Call t
11b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
11c0: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
11d0: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
1200: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
1210: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
1220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1230: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1240: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
1250: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
1260: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
1270: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1280: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
1290: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
12a0: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
12b0: 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  */.  int nHit, n
12c0: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
12d0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
12e0: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
12f0: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
1300: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
1310: 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  ate;        /* S
1320: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f 52  QLITE_UNLOCK, _R
1330: 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49 54  EADLOCK or _WRIT
1340: 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 6e 73 69 67  ELOCK */.  unsig
1350: 6e 65 64 20 63 68 61 72 20 65 72 72 4d 61 73 6b  ned char errMask
1360: 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;      /* One of
1370: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
1380: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 6e  f errors */.  un
1390: 73 69 67 6e 65 64 20 63 68 61 72 20 74 65 6d 70  signed char temp
13a0: 46 69 6c 65 3b 20 20 20 20 20 2f 2a 20 7a 46 69  File;     /* zFi
13b0: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
13c0: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
13d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 72 65  unsigned char re
13e0: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 2f 2a 20 54  adOnly;     /* T
13f0: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
1400: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
1410: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1420: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 2f 2a  needSync;     /*
1430: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
1440: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
1450: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1460: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1470: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 2f 2a  *aInJournal;  /*
1480: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
1490: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
14a0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
14b0: 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20   PgHdr *pFirst, 
14c0: 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20  *pLast;      /* 
14d0: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  List of free pag
14e0: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
14f0: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
1500: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
1510: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
1520: 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f  Hdr *aHash[N_PG_
1530: 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73  HASH];    /* Has
1540: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
1550: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 50 67  age number of Pg
1560: 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Hdr */.};../*.**
1570: 20 54 68 65 73 65 20 61 72 65 20 62 69 74 73 20   These are bits 
1580: 74 68 61 74 20 63 61 6e 20 62 65 20 73 65 74 20  that can be set 
1590: 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b  in Pager.errMask
15a0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
15b0: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20 20 20 20  ER_ERR_FULL     
15c0: 30 78 30 31 20 20 2f 2a 20 61 20 77 72 69 74 65  0x01  /* a write
15d0: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65  () failed */.#de
15e0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4d  fine PAGER_ERR_M
15f0: 45 4d 20 20 20 20 20 20 30 78 30 32 20 20 2f 2a  EM      0x02  /*
1600: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
1610: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
1620: 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30  R_ERR_LOCK     0
1630: 78 30 34 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e  x04  /* error in
1640: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f   the locking pro
1650: 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65  tocol */.#define
1660: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
1670: 50 54 20 20 30 78 30 38 20 20 2f 2a 20 64 61 74  PT  0x08  /* dat
1680: 61 62 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c  abase or journal
1690: 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23   corruption */.#
16a0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
16b0: 5f 44 49 53 4b 20 20 20 20 20 30 78 31 30 20 20  _DISK     0x10  
16c0: 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69 73 6b 20  /* general disk 
16d0: 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62 61 64 20  I/O error - bad 
16e0: 68 61 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a  hard drive? */..
16f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
1700: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
1710: 70 61 67 65 20 72 65 63 6f 72 64 73 20 69 6e 20  page records in 
1720: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1730: 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 74 79 70 65   format..*/.type
1740: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 52  def struct PageR
1750: 65 63 6f 72 64 20 50 61 67 65 52 65 63 6f 72 64  ecord PageRecord
1760: 3b 0a 73 74 72 75 63 74 20 50 61 67 65 52 65 63  ;.struct PageRec
1770: 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  ord {.  Pgno pgn
1780: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1790: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
17a0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  ge number */.  c
17b0: 68 61 72 20 61 44 61 74 61 5b 53 51 4c 49 54 45  har aData[SQLITE
17c0: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a  _PAGE_SIZE];  /*
17d0: 20 4f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 66   Original data f
17e0: 6f 72 20 70 61 67 65 20 70 67 6e 6f 20 2a 2f 0a  or page pgno */.
17f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  };../*.** Journa
1800: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
1810: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1820: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
1830: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
1840: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
1850: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
1860: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
1870: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
1880: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1890: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
18a0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
18b0: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
18c0: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
18d0: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
18e0: 34 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 73  4,.};../*.** Has
18f0: 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  h a page number.
1900: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  */.#define pager
1910: 5f 68 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29  _hash(PN)  ((PN)
1920: 25 4e 5f 50 47 5f 48 41 53 48 29 0a 0a 2f 2a 0a  %N_PG_HASH)../*.
1930: 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65  ** Enable refere
1940: 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69  nce count tracki
1950: 6e 67 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 20  ng here:.*/.#if 
1960: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
1970: 74 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f  t pager_refinfo_
1980: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
1990: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
19a0: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
19b0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
19c0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
19d0: 66 28 20 21 70 61 67 65 72 5f 72 65 66 69 6e 66  f( !pager_refinf
19e0: 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75 72  o_enable ) retur
19f0: 6e 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 0a 20  n;.    printf(. 
1a00: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
1a10: 34 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e  4d addr=0x%08x n
1a20: 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Ref=%d\n",.     
1a30: 20 20 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29    p->pgno, (int)
1a40: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
1a50: 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  , p->nRef.    );
1a60: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
1a70: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
1a80: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
1a90: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
1aa0: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
1ab0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
1ac0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
1ad0: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
1ae0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  ./*.** Convert t
1af0: 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 70  he bits in the p
1b00: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69  Pager->errMask i
1b10: 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74  nto an approprat
1b20: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65  e.** return code
1b30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b40: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61  pager_errcode(Pa
1b50: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b60: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b70: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
1b80: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
1b90: 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20  R_ERR_LOCK )    
1ba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54  rc = SQLITE_PROT
1bb0: 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67  OCOL;.  if( pPag
1bc0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
1bd0: 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20  GER_ERR_DISK )  
1be0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1bf0: 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ERR;.  if( pPage
1c00: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
1c10: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20  ER_ERR_FULL )   
1c20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
1c30: 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  L;.  if( pPager-
1c40: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
1c50: 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20 72  _ERR_MEM )     r
1c60: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1c70: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1c80: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
1c90: 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63  ERR_CORRUPT ) rc
1ca0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1cb0: 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  T;.  return rc;.
1cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
1cd0: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
1ce0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
1cf0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
1d00: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
1d10: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
1d20: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
1d30: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
1d40: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
1d50: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
1d60: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
1d70: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65  PgHdr *p = pPage
1d80: 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 25 20  r->aHash[pgno % 
1d90: 4e 5f 50 47 5f 48 41 53 48 5d 3b 0a 20 20 77 68  N_PG_HASH];.  wh
1da0: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
1db0: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
1dc0: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
1dd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
1de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
1df0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
1e00: 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  d clear the in-m
1e10: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
1e20: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
1e30: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
1e40: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
1e50: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
1e60: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
1e70: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
1e80: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
1e90: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
1ea0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
1eb0: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
1ec0: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
1ed0: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
1ee0: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
1ef0: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
1f00: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
1f10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f20: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
1f30: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d  Next;.  for(pPg=
1f40: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
1f50: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
1f60: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
1f70: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
1f80: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
1f90: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69   }.  pPager->pFi
1fa0: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
1fb0: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
1fc0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
1fd0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
1fe0: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
1ff0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2000: 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  h));.  pPager->n
2010: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
2020: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53  pPager->state==S
2030: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
2040: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67  ){.    sqlitepag
2050: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
2060: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
2070: 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  eOsUnlock(&pPage
2080: 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65 72  r->fd);.  pPager
2090: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
20a0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
20b0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
20c0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
20d0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
20e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
20f0: 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n==0 );.}../*.**
2100: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
2110: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
2120: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
2130: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
2140: 6e 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69 74 65  n and.** a write
2150: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2160: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
2170: 74 69 6e 65 20 72 65 6c 65 61 73 65 73 20 74 68  tine releases th
2180: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77 72  e database.** wr
2190: 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71  ite lock and acq
21a0: 75 69 72 65 73 20 61 20 72 65 61 64 20 6c 6f 63  uires a read loc
21b0: 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  k in its place. 
21c0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
21d0: 65 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65 64 20  e.** is deleted 
21e0: 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a  and closed..**.*
21f0: 2a 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 6c  * We have to rel
2200: 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
2210: 6f 63 6b 20 62 65 66 6f 72 65 20 61 63 71 75 69  ock before acqui
2220: 72 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  ring the read lo
2230: 63 6b 2c 0a 2a 2a 20 73 6f 20 74 68 65 72 65 20  ck,.** so there 
2240: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
2250: 69 6f 6e 20 77 68 65 72 65 20 61 6e 6f 74 68 65  ion where anothe
2260: 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 67 65  r process can ge
2270: 74 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 77 68  t the lock.** wh
2280: 69 6c 65 20 77 65 20 61 72 65 20 6e 6f 74 20 68  ile we are not h
2290: 6f 6c 64 69 6e 67 20 69 74 2e 20 20 42 75 74 2c  olding it.  But,
22a0: 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
22b0: 73 20 73 68 6f 75 6c 64 20 64 6f 20 74 68 69 73  s should do this
22c0: 0a 2a 2a 20 62 65 63 61 75 73 65 20 77 65 20 61  .** because we a
22d0: 72 65 20 61 6c 73 6f 20 68 6f 6c 64 69 6e 67 20  re also holding 
22e0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6a 6f  a lock on the jo
22f0: 75 72 6e 61 6c 2c 20 61 6e 64 20 6e 6f 20 70 72  urnal, and no pr
2300: 6f 63 65 73 73 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocess.** should 
2310: 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  get a write lock
2320: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2330: 20 77 69 74 68 6f 75 74 20 66 69 72 73 74 20 67   without first g
2340: 65 74 74 69 6e 67 20 61 20 6c 6f 63 6b 0a 2a 2a  etting a lock.**
2350: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
2360: 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
2370: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 66  e should never f
2380: 61 69 6c 2e 20 20 42 75 74 20 69 74 20 63 61 6e  ail.  But it can
2390: 20 66 61 69 6c 0a 2a 2a 20 69 66 20 61 6e 6f 74   fail.** if anot
23a0: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
23b0: 6f 74 20 70 6c 61 79 69 6e 67 20 62 79 20 74 68  ot playing by th
23c0: 65 20 72 75 6c 65 73 2e 20 20 49 66 20 69 74 20  e rules.  If it 
23d0: 64 6f 65 73 20 66 61 69 6c 2c 0a 2a 2a 20 61 6c  does fail,.** al
23e0: 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  l in-memory cach
23f0: 65 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  e pages are inva
2400: 6c 69 64 61 74 65 64 2c 20 74 68 65 20 50 41 47  lidated, the PAG
2410: 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 62 69 74 0a  ER_ERR_LOCK bit.
2420: 2a 2a 20 69 73 20 73 65 74 20 69 6e 20 70 50 61  ** is set in pPa
2430: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 2c 20 61 6e  ger->errMask, an
2440: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
2450: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52  eturns SQLITE_PR
2460: 4f 54 4f 43 4f 4c 2e 0a 2a 2a 20 53 51 4c 49 54  OTOCOL..** SQLIT
2470: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2480: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
2490: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
24a0: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
24b0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
24c0: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
24d0: 70 50 67 3b 0a 20 20 69 66 28 20 70 50 61 67 65  pPg;.  if( pPage
24e0: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
24f0: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 20 72 65 74  _WRITELOCK ) ret
2500: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2510: 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26   sqliteOsClose(&
2520: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2530: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2540: 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  pen = 0;.  sqlit
2550: 65 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  eOsDelete(pPager
2560: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 72  ->zJournal);.  r
2570: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
2580: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
2590: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
25a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
25b0: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
25c0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
25d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
25e0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 66 6f  ournal = 0;.  fo
25f0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
2600: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
2610: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
2620: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
2630: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  = 0;.    pPg->di
2640: 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  rty = 0;.  }.  p
2650: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53  Pager->state = S
2660: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a  QLITE_READLOCK;.
2670: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2680: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
2690: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
26a0: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
26c0: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
26d0: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
26e0: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
26f0: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
2700: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2710: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
2720: 66 6f 6c 6c 6f 77 73 3a 20 20 54 68 65 72 65 20  follows:  There 
2730: 69 73 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a  is an initial.**
2740: 20 66 69 6c 65 2d 74 79 70 65 20 73 74 72 69 6e   file-type strin
2750: 67 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  g for sanity che
2760: 63 6b 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 65  cking.  Then the
2770: 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a  re is a single.*
2780: 2a 20 50 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68  * Pgno number wh
2790: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
27a0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
27b0: 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
27c0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20 77 65 72  e.** changes wer
27d0: 65 20 6d 61 64 65 2e 20 20 54 68 65 20 64 61 74  e made.  The dat
27e0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
27f0: 65 64 20 74 6f 20 74 68 69 73 20 73 69 7a 65 2e  ed to this size.
2800: 0a 2a 2a 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65  .** Next come ze
2810: 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 20  ro or more page 
2820: 72 65 63 6f 72 64 73 20 77 68 65 72 65 20 65 61  records where ea
2830: 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 0a 2a  ch page record.*
2840: 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
2850: 50 67 6e 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f  Pgno and SQLITE_
2860: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
2870: 6f 66 20 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a  of data.  See.**
2880: 20 74 68 65 20 50 61 67 65 52 65 63 6f 72 64 20   the PageRecord 
2890: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 64 65  structure for de
28a0: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  tails..**.** For
28b0: 20 70 6c 61 79 62 61 63 6b 2c 20 74 68 65 20 70   playback, the p
28c0: 61 67 65 73 20 68 61 76 65 20 74 6f 20 62 65 20  ages have to be 
28d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
28e0: 75 72 6e 61 6c 20 69 6e 0a 2a 2a 20 72 65 76 65  urnal in.** reve
28f0: 72 73 65 20 6f 72 64 65 72 20 61 6e 64 20 70 75  rse order and pu
2900: 74 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  t back into the 
2910: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
2920: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
2930: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
2940: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
2950: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
2960: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
2970: 72 6e 61 6c 20 66 69 6c 65 20 28 61 73 20 64 65  rnal file (as de
2980: 74 65 72 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b  termined by look
2990: 69 6e 67 20 61 74 20 74 68 65 20 6d 61 67 69 63  ing at the magic
29a0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68   number.** at th
29b0: 65 20 62 65 67 69 6e 6e 69 6e 67 29 20 74 68 65  e beginning) the
29c0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
29d0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52  eturns SQLITE_PR
29e0: 4f 54 4f 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e  OTOCOL..** If an
29f0: 79 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 6f  y other errors o
2a00: 63 63 75 72 20 64 75 72 69 6e 67 20 70 6c 61 79  ccur during play
2a10: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
2a20: 73 65 20 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c  se will.** likel
2a30: 79 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  y be corrupted, 
2a40: 73 6f 20 74 68 65 20 50 41 47 45 52 5f 45 52 52  so the PAGER_ERR
2a50: 5f 43 4f 52 52 55 50 54 20 62 69 74 20 69 73 20  _CORRUPT bit is 
2a60: 73 65 74 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72  set in.** pPager
2a70: 2d 3e 65 72 72 4d 61 73 6b 20 61 6e 64 20 53 51  ->errMask and SQ
2a80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
2a90: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74  returned.  If it
2aa0: 20 61 6c 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74   all.** works, t
2ab0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2ac0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2ad0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
2ae0: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
2af0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2b00: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b20: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
2b30: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b50: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2b60: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
2b70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2b80: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
2b90: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
2ba0: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
2bb0: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
2bc0: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
2bd0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
2be0: 65 20 2a 2f 0a 20 20 50 61 67 65 52 65 63 6f 72  e */.  PageRecor
2bf0: 64 20 70 67 52 65 63 3b 0a 20 20 75 6e 73 69 67  d pgRec;.  unsig
2c00: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
2c10: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
2c20: 61 67 69 63 29 5d 3b 0a 20 20 69 6e 74 20 72 63  agic)];.  int rc
2c30: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
2c40: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
2c50: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
2c60: 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
2c70: 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
2c80: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
2c90: 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
2ca0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2cb0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
2cc0: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
2cd0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 72 63 20 3d  >jfd, 0);.  rc =
2ce0: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
2cf0: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
2d00: 26 6e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  &nRec);.  if( rc
2d10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d20: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
2d30: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63  back;.  }.  nRec
2d40: 20 3d 20 28 6e 52 65 63 20 2d 20 28 73 69 7a 65   = (nRec - (size
2d50: 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65 6f  of(aMagic)+sizeo
2d60: 66 28 50 67 6e 6f 29 29 29 20 2f 20 73 69 7a 65  f(Pgno))) / size
2d70: 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b 0a  of(PageRecord);.
2d80: 20 20 69 66 28 20 6e 52 65 63 3c 3d 30 20 29 7b    if( nRec<=0 ){
2d90: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
2da0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
2db0: 2a 20 52 65 61 64 20 74 68 65 20 62 65 67 69 6e  * Read the begin
2dc0: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
2dd0: 6e 61 6c 20 61 6e 64 20 74 72 75 6e 63 61 74 65  nal and truncate
2de0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
2df0: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
2e00: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
2e10: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
2e20: 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50 61  qliteOsRead(&pPa
2e30: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
2e40: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
2e50: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2e60: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
2e70: 28 61 4d 61 67 69 63 2c 61 4a 6f 75 72 6e 61 6c  (aMagic,aJournal
2e80: 4d 61 67 69 63 2c 73 69 7a 65 6f 66 28 61 4d 61  Magic,sizeof(aMa
2e90: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
2ea0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54  rc = SQLITE_PROT
2eb0: 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65  OCOL;.    goto e
2ec0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
2ed0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73  .  rc = sqliteOs
2ee0: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a 66  Read(&pPager->jf
2ef0: 64 2c 20 26 6d 78 50 67 2c 20 73 69 7a 65 6f 66  d, &mxPg, sizeof
2f00: 28 6d 78 50 67 29 29 3b 0a 20 20 69 66 28 20 72  (mxPg));.  if( r
2f10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f20: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
2f30: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  yback;.  }.  rc 
2f40: 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61  = sqliteOsTrunca
2f50: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
2f60: 6d 78 50 67 2a 53 51 4c 49 54 45 5f 50 41 47 45  mxPg*SQLITE_PAGE
2f70: 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 72 63  _SIZE);.  if( rc
2f80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f90: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
2fa0: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
2fb0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
2fc0: 67 3b 0a 20 20 0a 20 20 2f 2a 20 50 72 6f 63 65  g;.  .  /* Proce
2fd0: 73 73 20 73 65 67 6d 65 6e 74 73 20 62 65 67 69  ss segments begi
2fe0: 6e 6e 69 6e 67 20 77 69 74 68 20 74 68 65 20 6c  nning with the l
2ff0: 61 73 74 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20  ast and working 
3000: 62 61 63 6b 77 61 72 64 73 0a 20 20 2a 2a 20 74  backwards.  ** t
3010: 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 20 20 2a  o the first..  *
3020: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
3030: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
3040: 20 20 2f 2a 20 53 65 65 6b 20 74 6f 20 74 68 65    /* Seek to the
3050: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
3060: 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 20  e segment */.   
3070: 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 6f   int ofst;.    o
3080: 66 73 74 20 3d 20 69 2a 73 69 7a 65 6f 66 28 50  fst = i*sizeof(P
3090: 61 67 65 52 65 63 6f 72 64 29 20 2b 20 73 69 7a  ageRecord) + siz
30a0: 65 6f 66 28 61 4d 61 67 69 63 29 20 2b 20 73 69  eof(aMagic) + si
30b0: 7a 65 6f 66 28 50 67 6e 6f 29 3b 0a 20 20 20 20  zeof(Pgno);.    
30c0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 65 65  rc = sqliteOsSee
30d0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
30e0: 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  ofst);.    if( r
30f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
3100: 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73  reak;.    rc = s
3110: 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50 61  qliteOsRead(&pPa
3120: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 67 52 65 63  ger->jfd, &pgRec
3130: 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63 29 29  , sizeof(pgRec))
3140: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
3150: 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
3160: 0a 0a 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20  ..    /* Sanity 
3170: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
3180: 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  page */.    if( 
3190: 70 67 52 65 63 2e 70 67 6e 6f 3e 6d 78 50 67 20  pgRec.pgno>mxPg 
31a0: 7c 7c 20 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30  || pgRec.pgno==0
31b0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
31c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
31d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31e0: 7d 0a 0a 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  }..    /* Playba
31f0: 63 6b 20 74 68 65 20 70 61 67 65 2e 20 20 55 70  ck the page.  Up
3200: 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  date the in-memo
3210: 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70  ry copy of the p
3220: 61 67 65 0a 20 20 20 20 2a 2a 20 61 74 20 74 68  age.    ** at th
3230: 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 69 66 20  e same time, if 
3240: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 20 20  there is one..  
3250: 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70    */.    pPg = p
3260: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
3270: 65 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b  er, pgRec.pgno);
3280: 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a  .    if( pPg ){.
3290: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
32a0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
32b0: 20 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53 51   pgRec.aData, SQ
32c0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
32d0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
32e0: 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
32f0: 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
3300: 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
3310: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 65   rc = sqliteOsSe
3320: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
3330: 28 70 67 52 65 63 2e 70 67 6e 6f 2d 31 29 2a 53  (pgRec.pgno-1)*S
3340: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
3350: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
3360: 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
3370: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
3380: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
3390: 3e 66 64 2c 20 70 67 52 65 63 2e 61 44 61 74 61  >fd, pgRec.aData
33a0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
33b0: 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ZE);.    if( rc!
33c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
33d0: 61 6b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61  ak;.  }..end_pla
33e0: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21  yback:.  if( rc!
33f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3400: 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c    pager_unwritel
3410: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
3420: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3430: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f   |= PAGER_ERR_CO
3440: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
3450: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
3460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
3470: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
3480: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
3490: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34a0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
34b0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
34c0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
34d0: 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
34e0: 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
34f0: 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 63 61  litepager_set_ca
3500: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
3510: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
3520: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
3530: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
3540: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
3550: 67 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge;.  }.}../*.**
3560: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
3570: 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
3580: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3590: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
35a0: 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
35b0: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
35c0: 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
35d0: 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
35e0: 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
35f0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
3600: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65  ll to sqlitepage
3610: 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f  r_get() and is o
3620: 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e  nly held open un
3630: 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20  til the.** last 
3640: 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
3650: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 70 61 67   using sqlitepag
3660: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  er_unref()..**.*
3670: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
3680: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
3690: 6e 64 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 66  ndom temporary f
36a0: 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ile is created a
36b0: 6e 64 20 75 73 65 64 0a 2a 2a 20 61 73 20 74 68  nd used.** as th
36c0: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
36d0: 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77  hed.  The file w
36e0: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 61  ill be deleted a
36f0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
3700: 6e 0a 2a 2a 20 69 74 20 69 73 20 63 6c 6f 73 65  n.** it is close
3710: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
3720: 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61  pager_open(.  Pa
3730: 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
3740: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
3750: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
3760: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
3770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
3780: 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
3790: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
37a0: 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
37b0: 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20 20    int mxPage,   
37c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
37d0: 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  x number of in-m
37e0: 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
37f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
3800: 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a               
3810: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
3820: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
3830: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
3840: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
3850: 65 72 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65  er;.  int nameLe
3860: 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a  n;.  OsFile fd;.
3870: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
3880: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20  tempFile;.  int 
3890: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
38a0: 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54  char zTemp[SQLIT
38b0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
38c0: 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  ;..  *ppPager = 
38d0: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f  0;.  if( sqlite_
38e0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b  malloc_failed ){
38f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3900: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
3910: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 7b  if( zFilename ){
3920: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
3930: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
3940: 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 64 2c 20  zFilename, &fd, 
3950: 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20  &readOnly);.    
3960: 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
3970: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
3980: 6e 74 20 3d 20 38 3b 0a 20 20 20 20 73 71 6c 69  nt = 8;.    sqli
3990: 74 65 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  teOsTempFileName
39a0: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 64 6f 7b  (zTemp);.    do{
39b0: 0a 20 20 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20  .      cnt--;.  
39c0: 20 20 20 20 73 71 6c 69 74 65 4f 73 54 65 6d 70      sqliteOsTemp
39d0: 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b  FileName(zTemp);
39e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
39f0: 74 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  teOsOpenExclusiv
3a00: 65 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20  e(zTemp, &fd);. 
3a10: 20 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30     }while( cnt>0
3a20: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
3a30: 4b 20 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  K );.    zFilena
3a40: 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  me = zTemp;.    
3a50: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
3a60: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
3a70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
3a80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
3a90: 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c  PEN;.  }.  nameL
3aa0: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c  en = strlen(zFil
3ab0: 65 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72  ename);.  pPager
3ac0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
3ad0: 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
3ae0: 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32 20 2b 20 33   + nameLen*2 + 3
3af0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
3b00: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
3b10: 74 65 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  teOsClose(&fd);.
3b20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3b30: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
3b40: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
3b50: 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
3b60: 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
3b70: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
3b80: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61  er->zFilename[na
3b90: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
3ba0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
3bb0: 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  name, zFilename)
3bc0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
3bd0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 69  r->zJournal, zFi
3be0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  lename);.  strcp
3bf0: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
3c00: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
3c10: 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61  journal");.  pPa
3c20: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
3c30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
3c40: 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  pen = 0;.  pPage
3c50: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70  r->nRef = 0;.  p
3c60: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
3c70: 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  -1;.  pPager->nP
3c80: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
3c90: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
3ca0: 67 65 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a 20  ge>5 ? mxPage : 
3cb0: 31 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  10;.  pPager->st
3cc0: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c  ate = SQLITE_UNL
3cd0: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  OCK;.  pPager->e
3ce0: 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50  rrMask = 0;.  pP
3cf0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
3d00: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61   tempFile;.  pPa
3d10: 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
3d20: 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67  readOnly;.  pPag
3d30: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
3d40: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
3d50: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
3d60: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  ->pLast = 0;.  p
3d70: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
3d80: 6e 45 78 74 72 61 3b 0a 20 20 6d 65 6d 73 65 74  nExtra;.  memset
3d90: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
3da0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
3db0: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70  ->aHash));.  *pp
3dc0: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
3dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3de0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
3df0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
3e00: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3e10: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
3e20: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
3e30: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
3e40: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
3e50: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
3e60: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
3e70: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
3e80: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
3e90: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
3ea0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
3eb0: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
3ec0: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
3ed0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
3ee0: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
3ef0: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
3f00: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73  sqlitepager_clos
3f10: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
3f20: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
3f30: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 70  alled by sqlitep
3f40: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f  ager_unref()..*/
3f50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65  .void sqlitepage
3f60: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
3f70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
3f80: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
3f90: 69 64 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  id*)){.  pPager-
3fa0: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
3fb0: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Desc;.}../*.** R
3fc0: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
3fd0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
3fe0: 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
3ff0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4000: 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69  .** pPager..*/.i
4010: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70  nt sqlitepager_p
4020: 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
4030: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e  pPager){.  int n
4040: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
4050: 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
4060: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
4070: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
4080: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
4090: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 4f   }.  if( sqliteO
40a0: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
40b0: 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49  r->fd, &n)!=SQLI
40c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
40d0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
40e0: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a  PAGER_ERR_DISK;.
40f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4100: 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f  }.  n /= SQLITE_
4110: 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28  PAGE_SIZE;.  if(
4120: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
4130: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 7b  SQLITE_UNLOCK ){
4140: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
4150: 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  ize = n;.  }.  r
4160: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
4170: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
4180: 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
4190: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
41a0: 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
41b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
41c0: 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
41d0: 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
41e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
41f0: 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
4200: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
4210: 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
4220: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
4230: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
4240: 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
4250: 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
4260: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
4270: 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
4280: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
4290: 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
42a0: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
42b0: 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
42c0: 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
42d0: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
42e0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
42f0: 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  close(Pager *pPa
4300: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
4310: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77  Pg, *pNext;.  sw
4320: 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74  itch( pPager->st
4330: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
4340: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
4350: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4360: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
4370: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
4380: 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  liteOsUnlock(&pP
4390: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
43a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
43b0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
43c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
43d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
43e0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a 20  QLITE_READLOCK: 
43f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73  {.      sqliteOs
4400: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
4410: 66 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  fd);.      break
4420: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
4430: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
4440: 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
4450: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4460: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70  .  }.  for(pPg=p
4470: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
4480: 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
4490: 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
44a0: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c  NextAll;.    sql
44b0: 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
44c0: 7d 0a 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73  }.  sqliteOsClos
44d0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  e(&pPager->fd);.
44e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
44f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
4500: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
4510: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
4520: 20 20 73 71 6c 69 74 65 4f 73 44 65 6c 65 74 65    sqliteOsDelete
4530: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
4540: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
4550: 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
4560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4570: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
4580: 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
4590: 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
45a0: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
45b0: 67 6e 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f  gno sqlitepager_
45c0: 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20  pagenumber(void 
45d0: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
45e0: 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47   *p = DATA_TO_PG
45f0: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
4600: 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
4610: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
4620: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
4630: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
4640: 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
4650: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e  .** currently on
4660: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74   the freelist (t
4670: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
4680: 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e  nt is zero) then
4690: 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72  .** remove it fr
46a0: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  om the freelist.
46b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
46c0: 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
46d0: 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
46e0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
46f0: 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
4700: 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
4710: 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
4720: 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
4730: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
4740: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
4750: 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
4760: 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
4770: 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
4780: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
4790: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
47a0: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
47b0: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
47c0: 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
47d0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
47e0: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
47f0: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
4800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
4810: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73  Pg->pPager->pLas
4820: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
4830: 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ee;.    }.    pP
4840: 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b  g->pPager->nRef+
4850: 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52  +;.  }.  pPg->nR
4860: 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef++;.  REFINFO(
4870: 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pPg);.}../*.** I
4880: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
4890: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
48a0: 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e   a page.  The in
48b0: 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a  put pointer is.*
48c0: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  * a reference to
48d0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
48e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
48f0: 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61  er_ref(void *pDa
4900: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
4910: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
4920: 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65  R(pData);.  page
4930: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
4940: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4950: 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
4960: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
4970: 6e 20 77 72 69 74 65 20 61 6c 6c 20 66 72 65 65  n write all free
4980: 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
4990: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
49a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  file..**.** Writ
49b0: 69 6e 67 20 61 6c 6c 20 66 72 65 65 20 64 69 72  ing all free dir
49c0: 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
49d0: 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 74  database after t
49e0: 68 65 20 73 79 6e 63 20 69 73 20 61 0a 2a 2a 20  he sync is a.** 
49f0: 6e 6f 6e 2d 6f 62 76 69 6f 75 73 20 6f 70 74 69  non-obvious opti
4a00: 6d 69 7a 61 74 69 6f 6e 2e 20 20 66 73 79 6e 63  mization.  fsync
4a10: 28 29 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69  () is an expensi
4a20: 76 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 6f 20  ve operation so 
4a30: 77 65 0a 2a 2a 20 77 61 6e 74 20 74 6f 20 6d 69  we.** want to mi
4a40: 6e 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65  nimize the numbe
4a50: 72 20 74 68 61 74 20 6f 63 63 75 72 2e 20 20 53  r that occur.  S
4a60: 6f 20 61 66 74 65 72 20 61 6e 20 66 73 79 6e 63  o after an fsync
4a70: 28 29 20 69 73 20 66 6f 72 63 65 64 0a 2a 2a 20  () is forced.** 
4a80: 61 6e 64 20 77 65 20 61 72 65 20 66 72 65 65 20  and we are free 
4a90: 74 6f 20 77 72 69 74 65 20 64 69 72 74 79 20 70  to write dirty p
4aa0: 61 67 65 73 20 62 61 63 6b 20 74 6f 20 74 68 65  ages back to the
4ab0: 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
4ac0: 20 62 65 73 74 0a 2a 2a 20 74 6f 20 67 6f 20 61   best.** to go a
4ad0: 68 65 61 64 20 61 6e 64 20 64 6f 20 61 73 20 6d  head and do as m
4ae0: 75 63 68 20 6f 66 20 74 68 61 74 20 61 73 20 70  uch of that as p
4af0: 6f 73 73 69 62 6c 65 20 74 6f 20 6d 69 6e 69 6d  ossible to minim
4b00: 69 7a 65 20 74 68 65 20 63 68 61 6e 63 65 0a 2a  ize the chance.*
4b10: 2a 20 6f 66 20 68 61 76 69 6e 67 20 74 6f 20 64  * of having to d
4b20: 6f 20 61 6e 6f 74 68 65 72 20 66 73 79 6e 63 28  o another fsync(
4b30: 29 20 6c 61 74 65 72 20 6f 6e 2e 20 20 57 72 69  ) later on.  Wri
4b40: 74 69 6e 67 20 64 69 72 74 79 20 66 72 65 65 20  ting dirty free 
4b50: 70 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68 69 73  pages.** in this
4b60: 20 77 61 79 20 6d 61 6b 65 20 64 61 74 61 62 61   way make databa
4b70: 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 67 6f  se operations go
4b80: 20 75 70 20 74 6f 20 31 30 20 74 69 6d 65 73 20   up to 10 times 
4b90: 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  faster..*/.stati
4ba0: 63 20 69 6e 74 20 73 79 6e 63 41 6c 6c 50 61 67  c int syncAllPag
4bb0: 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
4bc0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
4bd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4be0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
4bf0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
4c00: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4c10: 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e  OsSync(&pPager->
4c20: 6a 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  jfd);.    if( rc
4c30: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
4c40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
4c50: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  dSync = 0;.  }. 
4c60: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
4c70: 3e 70 46 69 72 73 74 3b 20 70 50 67 3b 20 70 50  >pFirst; pPg; pP
4c80: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  g=pPg->pNextFree
4c90: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
4ca0: 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 73  dirty ){.      s
4cb0: 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61  qliteOsSeek(&pPa
4cc0: 67 65 72 2d 3e 66 64 2c 20 28 70 50 67 2d 3e 70  ger->fd, (pPg->p
4cd0: 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41  gno-1)*SQLITE_PA
4ce0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
4cf0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69  rc = sqliteOsWri
4d00: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
4d10: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
4d20: 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g), SQLITE_PAGE_
4d30: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28  SIZE);.      if(
4d40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4d50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 50   break;.      pP
4d60: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
4d70: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4d80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
4d90: 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
4da0: 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
4db0: 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
4dc0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
4dd0: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
4de0: 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
4df0: 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
4e00: 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
4e10: 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
4e20: 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
4e30: 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66  * A _get works f
4e40: 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
4e50: 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
4e60: 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
4e70: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
4e80: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
4e90: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
4ea0: 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
4eb0: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
4ec0: 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
4ed0: 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
4ee0: 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
4ef0: 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
4f00: 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
4f10: 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
4f20: 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
4f30: 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
4f40: 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
4f50: 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
4f60: 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
4f70: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
4f80: 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
4f90: 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
4fa0: 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
4fb0: 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
4fc0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
4fd0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
4fe0: 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
4ff0: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
5000: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
5010: 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75  qlitepager_looku
5020: 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
5030: 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f  routine and _loo
5040: 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
5050: 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
5060: 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
5070: 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
5080: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
5090: 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
50a0: 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
50b0: 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
50c0: 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
50d0: 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28  whereas _lookup(
50e0: 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
50f0: 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
5100: 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
5110: 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
5120: 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
5130: 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
5140: 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
5150: 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
5160: 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
5170: 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c  ary..** Since _l
5180: 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
5190: 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
51a0: 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
51b0: 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
51c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
51d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
51e0: 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70  ger_get(Pager *p
51f0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
5200: 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29  , void **ppPage)
5210: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
5220: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
5230: 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
5240: 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
5250: 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  ors..  */ .  if(
5260: 20 70 50 61 67 65 72 3d 3d 30 20 7c 7c 20 70 67   pPager==0 || pg
5270: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
5280: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
5290: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
52a0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
52b0: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
52c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
52d0: 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
52e0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
52f0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
5300: 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
5310: 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 72 65  d, then get a re
5320: 61 64 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ad lock.  ** on 
5330: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
5340: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
5350: 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ager->nRef==0 ){
5360: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f  .    if( sqliteO
5370: 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65  sReadLock(&pPage
5380: 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f  r->fd)!=SQLITE_O
5390: 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61  K ){.      *ppPa
53a0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
53b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
53c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
53d0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
53e0: 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20  TE_READLOCK;..  
53f0: 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
5400: 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
5410: 72 79 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61  ry to play it ba
5420: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ck..    */.    i
5430: 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 45  f( sqliteOsFileE
5440: 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
5450: 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
5460: 20 20 69 6e 74 20 72 63 2c 20 64 75 6d 6d 79 3b    int rc, dummy;
5470: 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ..       /* Get 
5480: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
5490: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
54a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
54b0: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
54c0: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
54d0: 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
54e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
54f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
5500: 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70  iteOsReadLock(&p
5510: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
5520: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
5530: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
5540: 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
5550: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74   0;.         ret
5560: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
5570: 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
5580: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
5590: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
55a0: 4b 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70  K;..       /* Op
55b0: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
55c0: 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
55d0: 65 73 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ess.  Return SQL
55e0: 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20  ITE_BUSY if.    
55f0: 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20     ** we cannot 
5600: 67 65 74 20 65 78 63 6c 75 73 69 76 65 20 61 63  get exclusive ac
5610: 63 65 73 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  cess to the jour
5620: 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nal file. .     
5630: 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 45    **.       ** E
5640: 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20 77 69  ven though we wi
5650: 6c 6c 20 6f 6e 6c 79 20 62 65 20 72 65 61 64 69  ll only be readi
5660: 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
5670: 6e 61 6c 2c 20 6e 6f 74 20 77 72 69 74 69 6e 67  nal, not writing
5680: 2c 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 68  ,.       ** we h
5690: 61 76 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ave to open the 
56a0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 77 72 69 74  journal for writ
56b0: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ing in order to 
56c0: 6f 62 74 61 69 6e 20 61 6e 0a 20 20 20 20 20 20  obtain an.      
56d0: 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63   ** exclusive ac
56e0: 63 65 73 73 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  cess lock..     
56f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
5700: 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61   sqliteOsOpenRea
5710: 64 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a  dWrite(pPager->z
5720: 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
5730: 2d 3e 6a 66 64 2c 20 26 64 75 6d 6d 79 29 3b 0a  ->jfd, &dummy);.
5740: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
5750: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5760: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5770: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
5780: 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ->fd);.         
5790: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
57a0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
57b0: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
57c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
57d0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
57e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
57f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
5800: 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  = 1;..       /* 
5810: 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
5820: 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
5830: 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
5840: 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
5850: 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
5860: 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
5870: 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  lock..       */.
5880: 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
5890: 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
58a0: 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  r);.       if( r
58b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
58c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
58d0: 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
58e0: 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a   }.    pPg = 0;.
58f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
5900: 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20  Search for page 
5910: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20  in cache */.    
5920: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
5930: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
5940: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  ;.  }.  if( pPg=
5950: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
5960: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
5970: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
5980: 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
5990: 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67   int h;.    pPag
59a0: 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20  er->nMiss++;.   
59b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
59c0: 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  ge<pPager->mxPag
59d0: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69  e || pPager->pFi
59e0: 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
59f0: 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
5a00: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50  page */.      pP
5a10: 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
5a20: 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  ( sizeof(*pPg) +
5a30: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
5a40: 45 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  E + pPager->nExt
5a50: 72 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ra );.      if( 
5a60: 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
5a70: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
5a80: 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77         pager_unw
5a90: 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
5aa0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
5ab0: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
5ac0: 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20  ER_ERR_MEM;.    
5ad0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5ae0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
5af0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
5b00: 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
5b10: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c     pPg->pNextAll
5b20: 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b   = pPager->pAll;
5b30: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
5b40: 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20  r->pAll ){.     
5b50: 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 2d     pPager->pAll-
5b60: 3e 70 50 72 65 76 41 6c 6c 20 3d 20 70 50 67 3b  >pPrevAll = pPg;
5b70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5b80: 50 67 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 30  Pg->pPrevAll = 0
5b90: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
5ba0: 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
5bb0: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
5bc0: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
5bd0: 20 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61      /* Recycle a
5be0: 6e 20 6f 6c 64 65 72 20 70 61 67 65 2e 20 20 46  n older page.  F
5bf0: 69 72 73 74 20 6c 6f 63 61 74 65 20 74 68 65 20  irst locate the 
5c00: 70 61 67 65 20 74 6f 20 62 65 20 72 65 63 79 63  page to be recyc
5c10: 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 72  led..      ** Tr
5c20: 79 20 74 6f 20 66 69 6e 64 20 6f 6e 65 20 74 68  y to find one th
5c30: 61 74 20 69 73 20 6e 6f 74 20 64 69 72 74 79 20  at is not dirty 
5c40: 61 6e 64 20 69 73 20 6e 65 61 72 20 74 68 65 20  and is near the 
5c50: 68 65 61 64 20 6f 66 0a 20 20 20 20 20 20 2a 2a  head of.      **
5c60: 20 6f 66 20 74 68 65 20 66 72 65 65 20 6c 69 73   of the free lis
5c70: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63  t */.      int c
5c80: 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50  nt = pPager->mxP
5c90: 61 67 65 2f 32 3b 0a 20 20 20 20 20 20 70 50 67  age/2;.      pPg
5ca0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
5cb0: 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  t;.      while( 
5cc0: 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20 30 3c  pPg->dirty && 0<
5cd0: 63 6e 74 2d 2d 20 26 26 20 70 50 67 2d 3e 70 4e  cnt-- && pPg->pN
5ce0: 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20  extFree ){.     
5cf0: 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e     pPg = pPg->pN
5d00: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  extFree;.      }
5d10: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65  ..      /* If we
5d20: 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
5d30: 61 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  a page that has 
5d40: 6e 6f 74 20 62 65 65 6e 20 75 73 65 64 20 72 65  not been used re
5d50: 63 65 6e 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  cently.      ** 
5d60: 61 6e 64 20 77 68 69 63 68 20 69 73 20 6e 6f 74  and which is not
5d70: 20 64 69 72 74 79 2c 20 74 68 65 6e 20 73 79 6e   dirty, then syn
5d80: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  c the journal an
5d90: 64 20 77 72 69 74 65 20 61 6c 6c 0a 20 20 20 20  d write all.    
5da0: 20 20 2a 2a 20 64 69 72 74 79 20 66 72 65 65 20    ** dirty free 
5db0: 70 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20 64  pages into the d
5dc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
5dd0: 75 73 20 6d 61 6b 69 6e 67 20 74 68 65 6d 0a 20  us making them. 
5de0: 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 70 61       ** clean pa
5df0: 67 65 73 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  ges and availabl
5e00: 65 20 66 6f 72 20 72 65 63 79 63 6c 69 6e 67 2e  e for recycling.
5e10: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
5e20: 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 73 79  ** We have to sy
5e30: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
5e40: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 20  efore writing a 
5e50: 70 61 67 65 20 74 6f 20 74 68 65 20 6d 61 69 6e  page to the main
5e60: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
5e70: 73 65 2e 20 20 42 75 74 20 73 79 6e 63 69 6e 67  se.  But syncing
5e80: 20 69 73 20 61 20 76 65 72 79 20 73 6c 6f 77 20   is a very slow 
5e90: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 61  operation.  So a
5ea0: 66 74 65 72 20 61 0a 20 20 20 20 20 20 2a 2a 20  fter a.      ** 
5eb0: 73 79 6e 63 2c 20 69 74 20 69 73 20 62 65 73 74  sync, it is best
5ec0: 20 74 6f 20 77 72 69 74 65 20 65 76 65 72 79 74   to write everyt
5ed0: 68 69 6e 67 20 77 65 20 63 61 6e 20 62 61 63 6b  hing we can back
5ee0: 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   to the main.   
5ef0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
5f00: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 72  o minimize the r
5f10: 69 73 6b 20 6f 66 20 68 61 76 69 6e 67 20 74 6f  isk of having to
5f20: 20 73 79 6e 63 20 61 67 61 69 6e 20 69 6e 20 74   sync again in t
5f30: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 61 72  he.      ** near
5f40: 20 66 75 74 75 72 65 2e 20 20 54 68 61 74 20 69   future.  That i
5f50: 73 20 77 61 79 20 77 65 20 77 72 69 74 65 20 61  s way we write a
5f60: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 61  ll dirty pages a
5f70: 66 74 65 72 20 61 0a 20 20 20 20 20 20 2a 2a 20  fter a.      ** 
5f80: 73 79 6e 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  sync..      */. 
5f90: 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
5fa0: 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  || pPg->dirty ){
5fb0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
5fc0: 3d 20 73 79 6e 63 41 6c 6c 50 61 67 65 73 28 70  = syncAllPages(p
5fd0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
5fe0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
5ff0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67         sqlitepag
6000: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
6010: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  er);.          *
6020: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
6030: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6040: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
6050: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67     }.        pPg
6060: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
6070: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
6080: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
6090: 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ef==0 );.      a
60a0: 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
60b0: 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f  y==0 );..      /
60c0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64  * Unlink the old
60d0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
60e0: 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ree list and the
60f0: 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20   hash table.    
6100: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
6110: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
6120: 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50  .        pPg->pP
6130: 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
6140: 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
6150: 72 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ree;.      }else
6160: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6170: 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
6180: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ==pPg );.       
6190: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
61a0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
61b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
61c0: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
61d0: 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ee ){.        pP
61e0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
61f0: 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
6200: 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20  PrevFree;.      
6210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
6220: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
6230: 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Last==pPg );.   
6240: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61       pPager->pLa
6250: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
6260: 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ree;.      }.   
6270: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
6280: 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
6290: 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ee = 0;.      if
62a0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
62b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
62c0: 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
62d0: 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  vHash = pPg->pPr
62e0: 65 76 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a  evHash;.      }.
62f0: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
6300: 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20  PrevHash ){.    
6310: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
6320: 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  sh->pNextHash = 
6330: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
6340: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6350: 20 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68       h = pager_h
6360: 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ash(pPg->pgno);.
6370: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6380: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
6390: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ==pPg );.       
63a0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
63b0: 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
63c0: 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sh;.      }.    
63d0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
63e0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
63f0: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  h = 0;.      pPa
6400: 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20  ger->nOvfl++;.  
6410: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e    }.    pPg->pgn
6420: 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66  o = pgno;.    if
6430: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
6440: 72 6e 61 6c 20 26 26 20 70 67 6e 6f 3c 3d 70 50  rnal && pgno<=pP
6450: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
6460: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   ){.      pPg->i
6470: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
6480: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
6490: 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
64a0: 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
64b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
64c0: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
64d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
64e0: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  dirty = 0;.    p
64f0: 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Pg->nRef = 1;.  
6500: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
6510: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
6520: 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65  ++;.    h = page
6530: 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20  r_hash(pgno);.  
6540: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
6550: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
6560: 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
6570: 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
6580: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
6590: 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
65a0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
65b0: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
65c0: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
65d0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
65e0: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
65f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
6600: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29  ager->dbSize<0 )
6610: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67   sqlitepager_pag
6620: 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
6630: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
6640: 64 62 53 69 7a 65 3c 70 67 6e 6f 20 29 7b 0a 20  dbSize<pgno ){. 
6650: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
6660: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
6670: 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  0, SQLITE_PAGE_S
6680: 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  IZE);.    }else{
6690: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
66a0: 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65       sqliteOsSee
66b0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
66c0: 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50  pgno-1)*SQLITE_P
66d0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
66e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
66f0: 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
6700: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
6710: 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g), SQLITE_PAGE_
6720: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28  SIZE);.      if(
6730: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6740: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6750: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
6760: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
6770: 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
6780: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
6790: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c  R_TO_EXTRA(pPg),
67a0: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
67b0: 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ra);.    }.  }el
67c0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
67d0: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
67e0: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
67f0: 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  he. */.    pPage
6800: 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70  r->nHit++;.    p
6810: 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
6820: 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47  }.  *ppPage = PG
6830: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
6840: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6850: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
6860: 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
6870: 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
6880: 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
6890: 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
68a0: 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
68b0: 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
68c0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
68d0: 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
68e0: 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
68f0: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
6900: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
6910: 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29 2e  litepager_get().
6920: 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
6930: 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
6940: 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
6950: 69 74 65 70 61 67 65 72 5f 67 65 74 28 29 20 69  itepager_get() i
6960: 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
6970: 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
6980: 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
6990: 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
69a0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
69b0: 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
69c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
69d0: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
69e0: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
69f0: 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
6a00: 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
6a10: 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
6a20: 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  pened..*/.void *
6a30: 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b  sqlitepager_look
6a40: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
6a50: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
6a60: 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
6a70: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
6a80: 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
6a90: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
6aa0: 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 50 61  .  */ .  if( pPa
6ab0: 67 65 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  ger==0 || pgno==
6ac0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6ad0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
6ae0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
6af0: 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
6b00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6b10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
6b20: 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  er->nRef==0 ){. 
6b30: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6b40: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
6b50: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
6b60: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
6b70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6b80: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
6b90: 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
6ba0: 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
6bb0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
6bc0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
6bd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
6be0: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
6bf0: 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
6c00: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
6c10: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
6c20: 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
6c30: 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
6c40: 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
6c50: 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
6c60: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
6c70: 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
6c80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
6c90: 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
6ca0: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
6cb0: 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  unref(void *pDat
6cc0: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
6cd0: 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  ;..  /* Decremen
6ce0: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
6cf0: 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
6d00: 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  age.  */.  pPg =
6d10: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
6d20: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
6d30: 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
6d40: 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
6d50: 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
6d60: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
6d70: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
6d80: 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
6d90: 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
6da0: 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
6db0: 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
6dc0: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
6dd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
6de0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
6df0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
6e00: 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
6e10: 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
6e20: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
6e30: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
6e40: 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
6e50: 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
6e60: 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
6e70: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
6e80: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
6e90: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
6ea0: 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
6eb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6ec0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
6ed0: 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
6ee0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
6ef0: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
6f00: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
6f10: 63 74 6f 72 28 70 44 61 74 61 29 3b 0a 20 20 20  ctor(pData);.   
6f20: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
6f30: 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
6f40: 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
6f50: 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
6f60: 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
6f70: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6f80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
6f90: 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
6fa0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
6fb0: 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
6fc0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
6fd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67  ==0 ){.      pag
6fe0: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
6ff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7010: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
7020: 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
7030: 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
7040: 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
7050: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
7060: 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
7070: 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
7080: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
7090: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
70a0: 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
70b0: 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
70c0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
70d0: 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
70e0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
70f0: 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
7100: 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
7110: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 77 72  nd acquires a wr
7120: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
7130: 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
7140: 65 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20  e write.** lock 
7150: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
7160: 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
7170: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
7180: 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
7190: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
71a0: 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
71b0: 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
71c0: 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
71d0: 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
71e0: 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
71f0: 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
7200: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
7210: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
7220: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7230: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
7240: 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
7250: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
7260: 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
7270: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
7280: 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
7290: 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
72a0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
72b0: 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
72c0: 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
72d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
72e0: 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
72f0: 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
7300: 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  itepager_commit(
7310: 29 20 6f 72 20 73 71 6c 69 74 65 70 61 67 65 72  ) or sqlitepager
7320: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  _rollback() to.*
7330: 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20  * reset..*/.int 
7340: 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74  sqlitepager_writ
7350: 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  e(void *pData){.
7360: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
7370: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
7380: 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
7390: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
73a0: 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
73b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
73c0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
73d0: 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
73e0: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
73f0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
7400: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
7410: 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
7420: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
7430: 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20  .  pPg->dirty = 
7440: 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  1;.  if( pPg->in
7450: 4a 6f 75 72 6e 61 6c 20 29 7b 20 72 65 74 75 72  Journal ){ retur
7460: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20  n SQLITE_OK; }. 
7470: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7480: 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55  >state!=SQLITE_U
7490: 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
74a0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51  Pager->state==SQ
74b0: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 29 7b  LITE_READLOCK ){
74c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
74d0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
74e0: 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
74f0: 71 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b  qliteOsWriteLock
7500: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
7510: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7520: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
7530: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
7540: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
7550: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
7560: 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
7570: 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
7580: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
7590: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
75a0: 20 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61       sqliteOsRea
75b0: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
75c0: 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
75d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
75e0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
75f0: 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73  liteOsOpenExclus
7600: 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ive(pPager->zJou
7610: 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
7620: 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fd);.    if( rc!
7630: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7640: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
7650: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
7660: 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  l);.      pPager
7670: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
7680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73  ;.      sqliteOs
7690: 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  ReadLock(&pPager
76a0: 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 72 65 74  ->fd);.      ret
76b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
76c0: 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  PEN;.    }.    p
76d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
76e0: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
76f0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
7700: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
7710: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57 52 49  ate = SQLITE_WRI
7720: 54 45 4c 4f 43 4b 3b 0a 20 20 20 20 73 71 6c 69  TELOCK;.    sqli
7730: 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  tepager_pagecoun
7740: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
7750: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
7760: 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
7770: 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
7780: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
7790: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
77a0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
77b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
77c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
77d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
77e0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
77f0: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
7800: 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c  &pPager->dbSize,
7810: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a   sizeof(Pgno));.
7820: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
7830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7840: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
7850: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
7860: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
7870: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
7880: 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
7890: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
78a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
78b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
78c0: 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate==SQLITE_WRIT
78d0: 45 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  ELOCK );.  asser
78e0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
78f0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28 20  alOpen );.  if( 
7900: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
7910: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
7920: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
7930: 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  teOsWrite(&pPage
7940: 72 2d 3e 6a 66 64 2c 20 26 70 50 67 2d 3e 70 67  r->jfd, &pPg->pg
7950: 6e 6f 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  no, sizeof(Pgno)
7960: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
7970: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7980: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
7990: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
79a0: 64 2c 20 70 44 61 74 61 2c 20 53 51 4c 49 54 45  d, pData, SQLITE
79b0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
79c0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
79d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
79e0: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f    sqlitepager_ro
79f0: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
7a00: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
7a10: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
7a20: 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 72  RR_FULL;.      r
7a30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
7a40: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
7a50: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
7a60: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
7a70: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
7a80: 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
7a90: 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
7aa0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
7ab0: 6e 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50  nc = 1;.  }.  pP
7ac0: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
7ad0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7ae0: 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
7af0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
7b00: 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
7b10: 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
7b20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
7b30: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
7b40: 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
7b50: 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
7b60: 70 72 65 76 69 6f 75 73 20 70 61 73 73 65 64 0a  previous passed.
7b70: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65  ** to sqlitepage
7b80: 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  r_write().  In o
7b90: 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
7ba0: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
7bb0: 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
7bc0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
7bd0: 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74  the page..*/.int
7be0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77   sqlitepager_isw
7bf0: 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70  riteable(void *p
7c00: 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
7c10: 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
7c20: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
7c30: 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b  turn pPg->dirty;
7c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
7c50: 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
7c60: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
7c70: 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
7c80: 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
7c90: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
7ca0: 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
7cb0: 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
7cc0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
7cd0: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
7ce0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
7cf0: 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
7d00: 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
7d10: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
7d20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
7d30: 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  ger_commit(Pager
7d40: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
7d50: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
7d60: 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  g;..  if( pPager
7d70: 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52  ->errMask==PAGER
7d80: 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  _ERR_FULL ){.   
7d90: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
7da0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
7db0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
7dc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
7dd0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
7de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
7df0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
7e00: 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
7e10: 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
7e20: 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
7e30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
7e40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7e50: 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate!=SQLITE_WRIT
7e60: 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  ELOCK ){.    ret
7e70: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
7e80: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
7e90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7ea0: 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 70 50 61  pen );.  if( pPa
7eb0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 26 26  ger->needSync &&
7ec0: 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70   sqliteOsSync(&p
7ed0: 50 61 67 65 72 2d 3e 6a 66 64 29 21 3d 53 51 4c  Pager->jfd)!=SQL
7ee0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
7ef0: 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
7f00: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70  .  }.  for(pPg=p
7f10: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
7f20: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
7f30: 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50  All){.    if( pP
7f40: 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 20 63 6f  g->dirty==0 ) co
7f50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d  ntinue;.    rc =
7f60: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70   sqliteOsSeek(&p
7f70: 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 50 67 2d  Pager->fd, (pPg-
7f80: 3e 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45 5f  >pgno-1)*SQLITE_
7f90: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
7fa0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7fb0: 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
7fc0: 61 62 6f 72 74 3b 0a 20 20 20 20 72 63 20 3d 20  abort;.    rc = 
7fd0: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
7fe0: 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
7ff0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53  _TO_DATA(pPg), S
8000: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
8010: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
8020: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
8030: 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d  ommit_abort;.  }
8040: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 53  .  if( sqliteOsS
8050: 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ync(&pPager->fd)
8060: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
8070: 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
8080: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e  .  rc = pager_un
8090: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
80a0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
80b0: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
80c0: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  rn rc;..  /* Jum
80d0: 70 20 68 65 72 65 20 69 66 20 61 6e 79 74 68 69  p here if anythi
80e0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75  ng goes wrong du
80f0: 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
8100: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f  process..  */.co
8110: 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63  mmit_abort:.  rc
8120: 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72   = sqlitepager_r
8130: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
8140: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8150: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
8160: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
8170: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8180: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
8190: 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
81a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
81b0: 73 20 62 61 63 6b 20 74 6f 20 72 65 61 64 2d 6f  s back to read-o
81c0: 6e 6c 79 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  nly mode..** All
81d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
81e0: 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
81f0: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
8200: 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
8210: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
8220: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
8230: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
8240: 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
8250: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
8260: 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
8270: 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
8280: 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
8290: 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54  col (SQLITE_PROT
82a0: 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20  OCOL) or unless 
82b0: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
82c0: 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
82d0: 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
82e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
82f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
8300: 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
8310: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
8320: 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
8330: 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
8340: 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
8350: 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
8360: 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
8370: 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
8380: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
8390: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
83a0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f  t sqlitepager_ro
83b0: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
83c0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
83d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
83e0: 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61  rrMask!=0 && pPa
83f0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41  ger->errMask!=PA
8400: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
8410: 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
8420: 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
8430: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
8440: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
8450: 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20  E_WRITELOCK ){. 
8460: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8470: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
8480: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
8490: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
84a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
84b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
84c0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67  ORRUPT;.    pPag
84d0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
84e0: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
84f0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
8500: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72  dbSize = -1;.  r
8510: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8520: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8530: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
8540: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
8550: 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
8560: 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
8570: 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
8580: 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
8590: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
85a0: 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79  pager_isreadonly
85b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
85c0: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
85d0: 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
85e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
85f0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
8600: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
8610: 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
8620: 2a 73 71 6c 69 74 65 70 61 67 65 72 5f 73 74 61  *sqlitepager_sta
8630: 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
8640: 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
8650: 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  a[9];.  a[0] = p
8660: 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
8670: 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
8680: 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
8690: 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
86a0: 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
86b0: 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
86c0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
86d0: 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
86e0: 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20  errMask;.  a[6] 
86f0: 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
8700: 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
8710: 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
8720: 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
8730: 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 23    return a;.}..#
8740: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  if SQLITE_TEST./
8750: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
8760: 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
8770: 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
8780: 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
8790: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
87a0: 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61  pager_refdump(Pa
87b0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
87c0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
87d0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
87e0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
87f0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
8800: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
8810: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
8820: 20 20 70 72 69 6e 74 66 28 22 50 41 47 45 20 25    printf("PAGE %
8830: 33 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e  3d addr=0x%08x n
8840: 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
8850: 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69     pPg->pgno, (i
8860: 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  nt)PGHDR_TO_DATA
8870: 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
8880: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.