/ Hex Artifact Content
Login

Artifact 592c16b06ad07c715240e382028e29b0e83378be:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 32 35  : pager.c,v 1.25
0350: 20 32 30 30 31 2f 31 30 2f 30 36 20 31 36 3a 33   2001/10/06 16:3
0360: 33 3a 30 33 20 64 72 68 20 45 78 70 20 24 0a 2a  3:03 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 0a   corruption */..
16a0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
16b0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
16c0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 69 6e 20  page records in 
16d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
16e0: 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 74 79 70 65   format..*/.type
16f0: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 52  def struct PageR
1700: 65 63 6f 72 64 20 50 61 67 65 52 65 63 6f 72 64  ecord PageRecord
1710: 3b 0a 73 74 72 75 63 74 20 50 61 67 65 52 65 63  ;.struct PageRec
1720: 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  ord {.  Pgno pgn
1730: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1740: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1750: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  ge number */.  c
1760: 68 61 72 20 61 44 61 74 61 5b 53 51 4c 49 54 45  har aData[SQLITE
1770: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a  _PAGE_SIZE];  /*
1780: 20 4f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 66   Original data f
1790: 6f 72 20 70 61 67 65 20 70 67 6e 6f 20 2a 2f 0a  or page pgno */.
17a0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  };../*.** Journa
17b0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
17c0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
17d0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
17e0: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
17f0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
1800: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
1810: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
1820: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
1830: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1840: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
1850: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
1860: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
1870: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
1880: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
1890: 34 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 73  4,.};../*.** Has
18a0: 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  h a page number.
18b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  */.#define pager
18c0: 5f 68 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29  _hash(PN)  ((PN)
18d0: 25 4e 5f 50 47 5f 48 41 53 48 29 0a 0a 2f 2a 0a  %N_PG_HASH)../*.
18e0: 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65  ** Enable refere
18f0: 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69  nce count tracki
1900: 6e 67 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 20  ng here:.*/.#if 
1910: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
1920: 74 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f  t pager_refinfo_
1930: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
1940: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
1950: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
1960: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
1970: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
1980: 66 28 20 21 70 61 67 65 72 5f 72 65 66 69 6e 66  f( !pager_refinf
1990: 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75 72  o_enable ) retur
19a0: 6e 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 0a 20  n;.    printf(. 
19b0: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
19c0: 34 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e  4d addr=0x%08x n
19d0: 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Ref=%d\n",.     
19e0: 20 20 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29    p->pgno, (int)
19f0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
1a00: 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  , p->nRef.    );
1a10: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
1a20: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
1a30: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
1a40: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
1a50: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
1a60: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
1a70: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
1a80: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
1a90: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  ./*.** Convert t
1aa0: 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 70  he bits in the p
1ab0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69  Pager->errMask i
1ac0: 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74  nto an approprat
1ad0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65  e.** return code
1ae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1af0: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61  pager_errcode(Pa
1b00: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b20: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
1b30: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
1b40: 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20  R_ERR_LOCK )    
1b50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54  rc = SQLITE_PROT
1b60: 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67  OCOL;.  if( pPag
1b70: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
1b80: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20  GER_ERR_FULL )  
1b90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
1ba0: 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  LL;.  if( pPager
1bb0: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
1bc0: 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20  R_ERR_MEM )     
1bd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1be0: 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  M;.  if( pPager-
1bf0: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
1c00: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72  _ERR_CORRUPT ) r
1c10: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1c20: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  PT;.  return rc;
1c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
1c40: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
1c50: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
1c60: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
1c70: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
1c80: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
1c90: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
1ca0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
1cb0: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
1cc0: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
1cd0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1ce0: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67   PgHdr *p = pPag
1cf0: 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 25  er->aHash[pgno %
1d00: 20 4e 5f 50 47 5f 48 41 53 48 5d 3b 0a 20 20 77   N_PG_HASH];.  w
1d10: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67  hile( p && p->pg
1d20: 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  no!=pgno ){.    
1d30: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68  p = p->pNextHash
1d40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
1d60: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  k the database a
1d70: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d  nd clear the in-
1d80: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54  memory cache.  T
1d90: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  his routine.** s
1da0: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
1db0: 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
1dc0: 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77  to what it was w
1dd0: 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74  hen it was first
1de0: 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79  .** opened.  Any
1df0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
1e00: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
1e10: 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  ed and subsequen
1e20: 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  t attempts.** to
1e30: 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61   access those pa
1e40: 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ges will likely 
1e50: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
1e60: 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dump..*/.static 
1e70: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
1e80: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e90: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
1ea0: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67  pNext;.  for(pPg
1eb0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1ec0: 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
1ed0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
1ee0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
1ef0: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
1f00: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46    }.  pPager->pF
1f10: 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  irst = 0;.  pPag
1f20: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
1f30: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
1f40: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  0;.  memset(pPag
1f50: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
1f60: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
1f70: 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  sh));.  pPager->
1f80: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  nPage = 0;.  if(
1f90: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1fa0: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
1fb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 70 61   ){.    sqlitepa
1fc0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
1fd0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
1fe0: 74 65 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  teOsUnlock(pPage
1ff0: 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65 72  r->fd);.  pPager
2000: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
2010: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
2020: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
2030: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
2040: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
2050: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
2060: 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n==0 );.}../*.**
2070: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
2080: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
2090: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
20a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
20b0: 6e 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69 74 65  n and.** a write
20c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20d0: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
20e0: 74 69 6e 65 20 72 65 6c 65 61 73 65 73 20 74 68  tine releases th
20f0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77 72  e database.** wr
2100: 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71  ite lock and acq
2110: 75 69 72 65 73 20 61 20 72 65 61 64 20 6c 6f 63  uires a read loc
2120: 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  k in its place. 
2130: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
2140: 65 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65 64 20  e.** is deleted 
2150: 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a  and closed..**.*
2160: 2a 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 6c  * We have to rel
2170: 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
2180: 6f 63 6b 20 62 65 66 6f 72 65 20 61 63 71 75 69  ock before acqui
2190: 72 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  ring the read lo
21a0: 63 6b 2c 0a 2a 2a 20 73 6f 20 74 68 65 72 65 20  ck,.** so there 
21b0: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
21c0: 69 6f 6e 20 77 68 65 72 65 20 61 6e 6f 74 68 65  ion where anothe
21d0: 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 67 65  r process can ge
21e0: 74 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 77 68  t the lock.** wh
21f0: 69 6c 65 20 77 65 20 61 72 65 20 6e 6f 74 20 68  ile we are not h
2200: 6f 6c 64 69 6e 67 20 69 74 2e 20 20 42 75 74 2c  olding it.  But,
2210: 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
2220: 73 20 73 68 6f 75 6c 64 20 64 6f 20 74 68 69 73  s should do this
2230: 0a 2a 2a 20 62 65 63 61 75 73 65 20 77 65 20 61  .** because we a
2240: 72 65 20 61 6c 73 6f 20 68 6f 6c 64 69 6e 67 20  re also holding 
2250: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6a 6f  a lock on the jo
2260: 75 72 6e 61 6c 2c 20 61 6e 64 20 6e 6f 20 70 72  urnal, and no pr
2270: 6f 63 65 73 73 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocess.** should 
2280: 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  get a write lock
2290: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22a0: 20 77 69 74 68 6f 75 74 20 66 69 72 73 74 20 67   without first g
22b0: 65 74 74 69 6e 67 20 61 20 6c 6f 63 6b 0a 2a 2a  etting a lock.**
22c0: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
22d0: 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
22e0: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 66  e should never f
22f0: 61 69 6c 2e 20 20 42 75 74 20 69 74 20 63 61 6e  ail.  But it can
2300: 20 66 61 69 6c 0a 2a 2a 20 69 66 20 61 6e 6f 74   fail.** if anot
2310: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
2320: 6f 74 20 70 6c 61 79 69 6e 67 20 62 79 20 74 68  ot playing by th
2330: 65 20 72 75 6c 65 73 2e 20 20 49 66 20 69 74 20  e rules.  If it 
2340: 64 6f 65 73 20 66 61 69 6c 2c 0a 2a 2a 20 61 6c  does fail,.** al
2350: 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  l in-memory cach
2360: 65 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  e pages are inva
2370: 6c 69 64 61 74 65 64 2c 20 74 68 65 20 50 41 47  lidated, the PAG
2380: 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 62 69 74 0a  ER_ERR_LOCK bit.
2390: 2a 2a 20 69 73 20 73 65 74 20 69 6e 20 70 50 61  ** is set in pPa
23a0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 2c 20 61 6e  ger->errMask, an
23b0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
23c0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52  eturns SQLITE_PR
23d0: 4f 54 4f 43 4f 4c 2e 0a 2a 2a 20 53 51 4c 49 54  OTOCOL..** SQLIT
23e0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
23f0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
2400: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2410: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
2420: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2430: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
2440: 70 50 67 3b 0a 20 20 69 66 28 20 70 50 61 67 65  pPg;.  if( pPage
2450: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
2460: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 20 72 65 74  _WRITELOCK ) ret
2470: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2480: 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28   sqliteOsUnlock(
2490: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 72  pPager->fd);.  r
24a0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 4c 6f 63 6b  c = sqliteOsLock
24b0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b  (pPager->fd, 0);
24c0: 0a 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65  .  sqliteOsClose
24d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
24e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
24f0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Open = 0;.  sqli
2500: 74 65 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  teOsDelete(pPage
2510: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
2520: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
2530: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
2540: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
2550: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 66 6f  ournal = 0;.  fo
2560: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
2570: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
2580: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
2590: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
25a0: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  = 0;.    pPg->di
25b0: 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  rty = 0;.  }.  i
25c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25d0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
25e0: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55  state = SQLITE_U
25f0: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  NLOCK;.    rc = 
2600: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b  SQLITE_PROTOCOL;
2610: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
2620: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
2630: 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b  R_LOCK;.  }else{
2640: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2650: 5f 4f 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  _OK;.    pPager-
2660: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
2670: 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  READLOCK;.  }.  
2680: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2690: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
26a0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
26b0: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
26c0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
26d0: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
26e0: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
26f0: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
2700: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
2710: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2720: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
2730: 6c 6c 6f 77 73 3a 20 20 54 68 65 72 65 20 69 73  llows:  There is
2740: 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 66   an initial.** f
2750: 69 6c 65 2d 74 79 70 65 20 73 74 72 69 6e 67 20  ile-type string 
2760: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
2770: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 65 72 65  ing.  Then there
2780: 20 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   is a single.** 
2790: 50 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68 69 63  Pgno number whic
27a0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
27b0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
27c0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
27d0: 2a 2a 20 63 68 61 6e 67 65 73 20 77 65 72 65 20  ** changes were 
27e0: 6d 61 64 65 2e 20 20 54 68 65 20 64 61 74 61 62  made.  The datab
27f0: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
2800: 20 74 6f 20 74 68 69 73 20 73 69 7a 65 2e 0a 2a   to this size..*
2810: 2a 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65 72 6f  * Next come zero
2820: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 20 72 65   or more page re
2830: 63 6f 72 64 73 20 77 68 65 72 65 20 65 61 63 68  cords where each
2840: 20 70 61 67 65 20 72 65 63 6f 72 64 0a 2a 2a 20   page record.** 
2850: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 50 67  consists of a Pg
2860: 6e 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f 50 41  no and SQLITE_PA
2870: 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66  GE_SIZE bytes of
2880: 20 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a 20 74   data.  See.** t
2890: 68 65 20 50 61 67 65 52 65 63 6f 72 64 20 73 74  he PageRecord st
28a0: 72 75 63 74 75 72 65 20 66 6f 72 20 64 65 74 61  ructure for deta
28b0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 70  ils..**.** For p
28c0: 6c 61 79 62 61 63 6b 2c 20 74 68 65 20 70 61 67  layback, the pag
28d0: 65 73 20 68 61 76 65 20 74 6f 20 62 65 20 72 65  es have to be re
28e0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
28f0: 6e 61 6c 20 69 6e 0a 2a 2a 20 72 65 76 65 72 73  nal in.** revers
2900: 65 20 6f 72 64 65 72 20 61 6e 64 20 70 75 74 20  e order and put 
2910: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72  back into the or
2920: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
2930: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2940: 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
2950: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
2960: 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
2970: 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
2980: 61 6c 20 66 69 6c 65 20 28 61 73 20 64 65 74 65  al file (as dete
2990: 72 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  rmined by lookin
29a0: 67 20 61 74 20 74 68 65 20 6d 61 67 69 63 20 6e  g at the magic n
29b0: 75 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68 65 20  umber.** at the 
29c0: 62 65 67 69 6e 6e 69 6e 67 29 20 74 68 65 6e 20  beginning) then 
29d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
29e0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f 54  urns SQLITE_PROT
29f0: 4f 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e 79 20  OCOL..** If any 
2a00: 6f 74 68 65 72 20 65 72 72 6f 72 73 20 6f 63 63  other errors occ
2a10: 75 72 20 64 75 72 69 6e 67 20 70 6c 61 79 62 61  ur during playba
2a20: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
2a30: 20 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c 79 20   will.** likely 
2a40: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 73 6f  be corrupted, so
2a50: 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f 43   the PAGER_ERR_C
2a60: 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73 65  ORRUPT bit is se
2a70: 74 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  t in.** pPager->
2a80: 65 72 72 4d 61 73 6b 20 61 6e 64 20 53 51 4c 49  errMask and SQLI
2a90: 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
2aa0: 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20 61  turned.  If it a
2ab0: 6c 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74 68 65  ll.** works, the
2ac0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
2ad0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2ae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2af0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
2b00: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2b10: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
2b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2b30: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
2b40: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b60: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2b70: 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
2b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2b90: 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
2ba0: 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
2bb0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 50 67   */.  PgHdr *pPg
2bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2bd0: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
2be0: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
2bf0: 2a 2f 0a 20 20 50 61 67 65 52 65 63 6f 72 64 20  */.  PageRecord 
2c00: 70 67 52 65 63 3b 0a 20 20 75 6e 73 69 67 6e 65  pgRec;.  unsigne
2c10: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 73 69  d char aMagic[si
2c20: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
2c30: 69 63 29 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ic)];.  int rc;.
2c40: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 62  .  /* Read the b
2c50: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2c60: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e  journal and trun
2c70: 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 64 61  cate the.  ** da
2c80: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
2c90: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
2ca0: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   size..  */.  as
2cb0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
2cc0: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
2cd0: 71 6c 69 74 65 4f 73 53 65 65 6b 28 70 50 61 67  qliteOsSeek(pPag
2ce0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 72  er->jfd, 0);.  r
2cf0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
2d00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
2d10: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
2d20: 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63 21  gic));.  if( rc!
2d30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65  =SQLITE_OK || me
2d40: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 61 4a 6f 75  mcmp(aMagic,aJou
2d50: 72 6e 61 6c 4d 61 67 69 63 2c 73 69 7a 65 6f 66  rnalMagic,sizeof
2d60: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
2d70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d80: 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 7d 0a  E_PROTOCOL;.  }.
2d90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52    rc = sqliteOsR
2da0: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
2db0: 20 26 6d 78 50 67 2c 20 73 69 7a 65 6f 66 28 6d   &mxPg, sizeof(m
2dc0: 78 50 67 29 29 3b 0a 20 20 69 66 28 20 72 63 21  xPg));.  if( rc!
2dd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2de0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2df0: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 7d 0a 20 20  PROTOCOL;.  }.  
2e00: 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65  sqliteOsTruncate
2e10: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6d 78 50  (pPager->fd, mxP
2e20: 67 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  g*SQLITE_PAGE_SI
2e30: 5a 45 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  ZE);.  pPager->d
2e40: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
2e50: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64  .  /* Begin read
2e60: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
2e70: 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 68 65  beginning at the
2e80: 20 65 6e 64 20 61 6e 64 20 6d 6f 76 69 6e 67 0a   end and moving.
2e90: 20 20 2a 2a 20 74 6f 77 61 72 64 20 74 68 65 20    ** toward the 
2ea0: 62 65 67 69 6e 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  beginning..  */.
2eb0: 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69    if( sqliteOsFi
2ec0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
2ed0: 66 64 2c 20 26 6e 52 65 63 29 21 3d 53 51 4c 49  fd, &nRec)!=SQLI
2ee0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
2ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2f00: 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 6e 52 65   }.  nRec = (nRe
2f10: 63 20 2d 20 28 73 69 7a 65 6f 66 28 61 4d 61 67  c - (sizeof(aMag
2f20: 69 63 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ic)+sizeof(Pgno)
2f30: 29 29 20 2f 20 73 69 7a 65 6f 66 28 50 61 67 65  )) / sizeof(Page
2f40: 52 65 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 50  Record);..  /* P
2f50: 72 6f 63 65 73 73 20 73 65 67 6d 65 6e 74 73 20  rocess segments 
2f60: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 74  beginning with t
2f70: 68 65 20 6c 61 73 74 20 61 6e 64 20 77 6f 72 6b  he last and work
2f80: 69 6e 67 20 62 61 63 6b 77 61 72 64 73 0a 20 20  ing backwards.  
2f90: 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 2e  ** to the first.
2fa0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52  .  */.  for(i=nR
2fb0: 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ec-1; i>=0; i--)
2fc0: 7b 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 6f  {.    /* Seek to
2fd0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
2fe0: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f  f the segment */
2ff0: 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20  .    int ofst;. 
3000: 20 20 20 6f 66 73 74 20 3d 20 69 2a 73 69 7a 65     ofst = i*size
3010: 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 20 2b  of(PageRecord) +
3020: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 20   sizeof(aMagic) 
3030: 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3b 0a  + sizeof(Pgno);.
3040: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
3050: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
3060: 64 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  d, ofst);.    if
3070: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3080: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
3090: 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 70  = sqliteOsRead(p
30a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 67 52  Pager->jfd, &pgR
30b0: 65 63 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63  ec, sizeof(pgRec
30c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ));.    if( rc!=
30d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
30e0: 6b 3b 0a 0a 20 20 20 20 2f 2a 20 53 61 6e 69 74  k;..    /* Sanit
30f0: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
3100: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66  e page */.    if
3110: 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e 6d 78 50  ( pgRec.pgno>mxP
3120: 67 20 7c 7c 20 70 67 52 65 63 2e 70 67 6e 6f 3d  g || pgRec.pgno=
3130: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
3140: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
3150: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3160: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6c 61 79    }..    /* Play
3170: 62 61 63 6b 20 74 68 65 20 70 61 67 65 2e 20 20  back the page.  
3180: 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Update the in-me
3190: 6d 6f 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65  mory copy of the
31a0: 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 61 74 20   page.    ** at 
31b0: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 69  the same time, i
31c0: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a  f there is one..
31d0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d      */.    pPg =
31e0: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
31f0: 61 67 65 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f  ager, pgRec.pgno
3200: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29  );.    if( pPg )
3210: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50  {.      memcpy(P
3220: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
3230: 29 2c 20 70 67 52 65 63 2e 61 44 61 74 61 2c 20  ), pgRec.aData, 
3240: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
3250: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
3260: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
3270: 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
3280: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
3290: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
32a0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
32b0: 20 28 70 67 52 65 63 2e 70 67 6e 6f 2d 31 29 2a   (pgRec.pgno-1)*
32c0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
32d0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
32e0: 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
32f0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
3300: 65 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  eOsWrite(pPager-
3310: 3e 66 64 2c 20 70 67 52 65 63 2e 61 44 61 74 61  >fd, pgRec.aData
3320: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
3330: 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ZE);.    if( rc!
3340: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
3350: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ak;.  }.  if( rc
3360: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
3370: 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65     pager_unwrite
3380: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
3390: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
33a0: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
33b0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ORRUPT;.    rc =
33c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
33d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
33e0: 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
33f0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
3400: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
3410: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3420: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
3430: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
3440: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
3450: 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
3460: 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74 5f 63  qlitepager_set_c
3470: 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
3480: 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
3490: 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
34a0: 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
34b0: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
34c0: 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  age;.  }.}../*.*
34d0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
34e0: 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75  age cache and pu
34f0: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
3500: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e  he page cache in
3510: 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68   *ppPager..** Th
3520: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
3530: 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69  hed need not exi
3540: 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73  st.  The file is
3550: 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69   not locked unti
3560: 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  l.** the first c
3570: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 70 61 67  all to sqlitepag
3580: 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20  er_get() and is 
3590: 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
35a0: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
35b0: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
35c0: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 70 61  d using sqlitepa
35d0: 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a  ger_unref()..**.
35e0: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
35f0: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
3600: 61 6e 64 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20  andom temporary 
3610: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 20  file is created 
3620: 61 6e 64 20 75 73 65 64 0a 2a 2a 20 61 73 20 74  and used.** as t
3630: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
3640: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
3650: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
3660: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
3670: 65 6e 0a 2a 2a 20 69 74 20 69 73 20 63 6c 6f 73  en.** it is clos
3680: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3690: 65 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50  epager_open(.  P
36a0: 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
36b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
36c0: 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
36d0: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
36e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
36f0: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
3700: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3710: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
3720: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20  .  int mxPage,  
3730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
3740: 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  ax number of in-
3750: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
3760: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  es */.  int nExt
3770: 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
3780: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
3790: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
37a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
37b0: 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  .){.  Pager *pPa
37c0: 67 65 72 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c  ger;.  int nameL
37d0: 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b  en;.  OsFile fd;
37e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
37f0: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 6e 74   tempFile;.  int
3800: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
3810: 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
3820: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
3830: 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ];..  *ppPager =
3840: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
3850: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
3860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
3870: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
3880: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29   if( zFilename )
3890: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
38a0: 65 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  eOsOpenReadWrite
38b0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 64 2c  (zFilename, &fd,
38c0: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
38d0: 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
38e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
38f0: 63 6e 74 20 3d 20 38 3b 0a 20 20 20 20 73 71 6c  cnt = 8;.    sql
3900: 69 74 65 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  iteOsTempFileNam
3910: 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 64 6f  e(zTemp);.    do
3920: 7b 0a 20 20 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  {.      cnt--;. 
3930: 20 20 20 20 20 73 71 6c 69 74 65 4f 73 54 65 6d       sqliteOsTem
3940: 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29  pFileName(zTemp)
3950: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
3960: 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  iteOsOpenExclusi
3970: 76 65 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a  ve(zTemp, &fd);.
3980: 20 20 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e      }while( cnt>
3990: 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 && rc!=SQLITE_
39a0: 4f 4b 20 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  OK );.    zFilen
39b0: 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  ame = zTemp;.   
39c0: 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
39d0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
39e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
39f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
3a00: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65  OPEN;.  }.  name
3a10: 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69  Len = strlen(zFi
3a20: 6c 65 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65  lename);.  pPage
3a30: 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r = sqliteMalloc
3a40: 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  ( sizeof(*pPager
3a50: 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32 20 2b 20  ) + nameLen*2 + 
3a60: 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  30 );.  if( pPag
3a70: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  er==0 ){.    sql
3a80: 69 74 65 4f 73 43 6c 6f 73 65 28 66 64 29 3b 0a  iteOsClose(fd);.
3a90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3aa0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
3ab0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
3ac0: 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
3ad0: 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
3ae0: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
3af0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61  er->zFilename[na
3b00: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
3b10: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
3b20: 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  name, zFilename)
3b30: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
3b40: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 69  r->zJournal, zFi
3b50: 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  lename);.  strcp
3b60: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
3b70: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
3b80: 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61  journal");.  pPa
3b90: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
3ba0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
3bb0: 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  pen = 0;.  pPage
3bc0: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70  r->nRef = 0;.  p
3bd0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
3be0: 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  -1;.  pPager->nP
3bf0: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
3c00: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
3c10: 67 65 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a 20  ge>5 ? mxPage : 
3c20: 31 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  10;.  pPager->st
3c30: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c  ate = SQLITE_UNL
3c40: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  OCK;.  pPager->e
3c50: 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50  rrMask = 0;.  pP
3c60: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
3c70: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61   tempFile;.  pPa
3c80: 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
3c90: 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67  readOnly;.  pPag
3ca0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
3cb0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
3cc0: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
3cd0: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  ->pLast = 0;.  p
3ce0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
3cf0: 6e 45 78 74 72 61 3b 0a 20 20 6d 65 6d 73 65 74  nExtra;.  memset
3d00: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
3d10: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
3d20: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70  ->aHash));.  *pp
3d30: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
3d40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3d50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
3d60: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
3d70: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3d80: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
3d90: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
3da0: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
3db0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
3dc0: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
3dd0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
3de0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
3df0: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
3e00: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
3e10: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
3e20: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
3e30: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
3e40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
3e50: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
3e60: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
3e70: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73  sqlitepager_clos
3e80: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
3e90: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
3ea0: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 70  alled by sqlitep
3eb0: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f  ager_unref()..*/
3ec0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65  .void sqlitepage
3ed0: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
3ee0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
3ef0: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
3f00: 69 64 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  id*)){.  pPager-
3f10: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
3f20: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Desc;.}../*.** R
3f30: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
3f40: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
3f50: 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
3f60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3f70: 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69  .** pPager..*/.i
3f80: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70  nt sqlitepager_p
3f90: 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
3fa0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e  pPager){.  int n
3fb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
3fc0: 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
3fd0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
3fe0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
3ff0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
4000: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 4f   }.  if( sqliteO
4010: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
4020: 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54  ->fd, &n)!=SQLIT
4030: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
4040: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d  rn 0;.  }.  n /=
4050: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
4060: 45 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  E;.  if( pPager-
4070: 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55  >state!=SQLITE_U
4080: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61  NLOCK ){.    pPa
4090: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
40a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
40b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
40c0: 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
40d0: 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
40e0: 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
40f0: 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
4100: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
4110: 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
4120: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
4130: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
4140: 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
4150: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
4160: 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
4170: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
4180: 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
4190: 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
41a0: 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
41b0: 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
41c0: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
41d0: 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
41e0: 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
41f0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
4200: 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
4210: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
4220: 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ump..*/.int sqli
4230: 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61  tepager_close(Pa
4240: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
4250: 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
4260: 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50  xt;.  switch( pP
4270: 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20  ager->state ){. 
4280: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57     case SQLITE_W
4290: 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20  RITELOCK: {.    
42a0: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f    sqlitepager_ro
42b0: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
42c0: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 55 6e        sqliteOsUn
42d0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29  lock(pPager->fd)
42e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
42f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
4300: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pen==0 );.      
4310: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4320: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
4330: 44 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73  DLOCK: {.      s
4340: 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 70 50  qliteOsUnlock(pP
4350: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
4360: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4370: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4380: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
4390: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
43a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
43b0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
43c0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
43d0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
43e0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
43f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
4400: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
4410: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
4420: 66 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  fd);.  assert( p
4430: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
4440: 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  en==0 );.  if( p
4450: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
4460: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 44  ){.    sqliteOsD
4470: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
4480: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ilename);.  }.  
4490: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
44a0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
44b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
44c0: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
44d0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
44e0: 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
44f0: 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 70  .*/.Pgno sqlitep
4500: 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
4510: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
4520: 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f  PgHdr *p = DATA_
4530: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
4540: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
4550: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  o;.}../*.** Incr
4560: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
4570: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
4580: 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
4590: 67 65 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  ge is.** current
45a0: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
45b0: 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
45c0: 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
45d0: 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
45e0: 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
45f0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
4600: 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
4610: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
4620: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
4630: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
4640: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
4650: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
4660: 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  Remove it. */.  
4670: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
4680: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
4690: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
46a0: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
46b0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
46c0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
46d0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
46e0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
46f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
4700: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
4710: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
4720: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
4730: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
4740: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
4750: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
4760: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
4770: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
4780: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
4790: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
47a0: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
47b0: 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  INFO(pPg);.}../*
47c0: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
47d0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
47e0: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
47f0: 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
4800: 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
4810: 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
4820: 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
4830: 74 65 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64  tepager_ref(void
4840: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
4850: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
4860: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
4870: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
4880: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4890: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
48a0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  c the journal an
48b0: 64 20 74 68 65 6e 20 77 72 69 74 65 20 61 6c 6c  d then write all
48c0: 20 66 72 65 65 20 64 69 72 74 79 20 70 61 67 65   free dirty page
48d0: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
48e0: 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  e.** file..**.**
48f0: 20 57 72 69 74 69 6e 67 20 61 6c 6c 20 66 72 65   Writing all fre
4900: 65 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  e dirty pages to
4910: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 66   the database af
4920: 74 65 72 20 74 68 65 20 73 79 6e 63 20 69 73 20  ter the sync is 
4930: 61 0a 2a 2a 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73  a.** non-obvious
4940: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
4950: 66 73 79 6e 63 28 29 20 69 73 20 61 6e 20 65 78  fsync() is an ex
4960: 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
4970: 6e 20 73 6f 20 77 65 0a 2a 2a 20 77 61 6e 74 20  n so we.** want 
4980: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
4990: 6e 75 6d 62 65 72 20 74 68 61 74 20 6f 63 63 75  number that occu
49a0: 72 2e 20 20 53 6f 20 61 66 74 65 72 20 61 6e 20  r.  So after an 
49b0: 66 73 79 6e 63 28 29 20 69 73 20 66 6f 72 63 65  fsync() is force
49c0: 64 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  d.** and we are 
49d0: 66 72 65 65 20 74 6f 20 77 72 69 74 65 20 64 69  free to write di
49e0: 72 74 79 20 70 61 67 65 73 20 62 61 63 6b 20 74  rty pages back t
49f0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
4a00: 69 74 20 69 73 20 62 65 73 74 0a 2a 2a 20 74 6f  it is best.** to
4a10: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 6f   go ahead and do
4a20: 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 61 74   as much of that
4a30: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   as possible to 
4a40: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 63 68 61  minimize the cha
4a50: 6e 63 65 0a 2a 2a 20 6f 66 20 68 61 76 69 6e 67  nce.** of having
4a60: 20 74 6f 20 64 6f 20 61 6e 6f 74 68 65 72 20 66   to do another f
4a70: 73 79 6e 63 28 29 20 6c 61 74 65 72 20 6f 6e 2e  sync() later on.
4a80: 20 20 57 72 69 74 69 6e 67 20 64 69 72 74 79 20    Writing dirty 
4a90: 66 72 65 65 20 70 61 67 65 73 0a 2a 2a 20 69 6e  free pages.** in
4aa0: 20 74 68 69 73 20 77 61 79 20 6d 61 6b 65 20 64   this way make d
4ab0: 61 74 61 62 61 73 65 20 6f 70 65 72 61 74 69 6f  atabase operatio
4ac0: 6e 73 20 67 6f 20 75 70 20 74 6f 20 31 30 20 74  ns go up to 10 t
4ad0: 69 6d 65 73 20 66 61 73 74 65 72 2e 0a 2a 2f 0a  imes faster..*/.
4ae0: 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 41  static int syncA
4af0: 6c 6c 50 61 67 65 73 28 50 61 67 65 72 20 2a 70  llPages(Pager *p
4b00: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
4b10: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
4b20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4b30: 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
4b40: 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
4b50: 71 6c 69 74 65 4f 73 53 79 6e 63 28 70 50 61 67  qliteOsSync(pPag
4b60: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 69 66  er->jfd);.    if
4b70: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
4b80: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
4b90: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
4ba0: 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61   }.  for(pPg=pPa
4bb0: 67 65 72 2d 3e 70 46 69 72 73 74 3b 20 70 50 67  ger->pFirst; pPg
4bc0: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
4bd0: 46 72 65 65 29 7b 0a 20 20 20 20 69 66 28 20 70  Free){.    if( p
4be0: 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
4bf0: 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28     sqliteOsSeek(
4c00: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 50 67  pPager->fd, (pPg
4c10: 2d 3e 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45  ->pgno-1)*SQLITE
4c20: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
4c30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
4c40: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
4c50: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
4c60: 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47  pPg), SQLITE_PAG
4c70: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69  E_SIZE);.      i
4c80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4c90: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4ca0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
4cb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4cc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4cd0: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
4ce0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
4cf0: 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
4d00: 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
4d10: 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
4d20: 69 72 73 74 20 70 61 67 65 20 61 63 71 75 69 72  irst page acquir
4d30: 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
4d40: 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
4d50: 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
4d60: 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
4d70: 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77  ..**.** A _get w
4d80: 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
4d90: 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
4da0: 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
4db0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
4dc0: 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
4dd0: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
4de0: 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
4df0: 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
4e00: 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
4e10: 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
4e20: 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
4e30: 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
4e40: 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
4e50: 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
4e60: 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
4e70: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
4e80: 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
4e90: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
4ea0: 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
4eb0: 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
4ec0: 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
4ed0: 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
4ee0: 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
4ef0: 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
4f00: 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
4f10: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
4f20: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
4f30: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
4f40: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
4f50: 61 6c 73 6f 20 73 71 6c 69 74 65 70 61 67 65 72  also sqlitepager
4f60: 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  _lookup().  Both
4f70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
4f80: 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65  d _lookup() atte
4f90: 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
4fa0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
4fb0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
4fc0: 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
4fd0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
4fe0: 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
4ff0: 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
5000: 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
5010: 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c  it in whereas _l
5020: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
5030: 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
5040: 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
5050: 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
5060: 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
5070: 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
5080: 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
5090: 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
50a0: 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
50b0: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
50c0: 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65  nce _lookup() ne
50d0: 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
50e0: 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
50f0: 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
5100: 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
5110: 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
5120: 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 50 61  litepager_get(Pa
5130: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
5140: 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70  o pgno, void **p
5150: 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  pPage){.  PgHdr 
5160: 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  *pPg;..  /* Make
5170: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
5180: 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
5190: 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
51a0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30  .  if( pPager==0
51b0: 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20   || pgno==0 ){. 
51c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
51d0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
51e0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
51f0: 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f  k & ~(PAGER_ERR_
5200: 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74  FULL) ){.    ret
5210: 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
5220: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  e(pPager);.  }..
5230: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
5240: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
5250: 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
5260: 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a 20 20  t a read lock.  
5270: 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
5280: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
5290: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
52a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ==0 ){.    if( s
52b0: 71 6c 69 74 65 4f 73 4c 6f 63 6b 28 70 50 61 67  qliteOsLock(pPag
52c0: 65 72 2d 3e 66 64 2c 20 30 29 21 3d 53 51 4c 49  er->fd, 0)!=SQLI
52d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
52e0: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
52f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5300: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
5310: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
5320: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b  SQLITE_READLOCK;
5330: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
5340: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
5350: 73 2c 20 74 72 79 20 74 6f 20 70 6c 61 79 20 69  s, try to play i
5360: 74 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  t back..    */. 
5370: 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 46     if( sqliteOsF
5380: 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72  ileExists(pPager
5390: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  ->zJournal) ){. 
53a0: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20        int rc;.. 
53b0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
53c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 65 78  e journal for ex
53d0: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2e 20  clusive access. 
53e0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   Return SQLITE_B
53f0: 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a  USY if.       **
5400: 20 77 65 20 63 61 6e 6e 6f 74 20 67 65 74 20 65   we cannot get e
5410: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
5420: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
5430: 69 6c 65 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ile.       */.  
5440: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5450: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70  OsOpenReadOnly(p
5460: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
5470: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a   &pPager->jfd);.
5480: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
5490: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
54a0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
54b0: 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
54c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 69 66       }.       if
54d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
54e0: 7c 7c 20 73 71 6c 69 74 65 4f 73 4c 6f 63 6b 28  || sqliteOsLock(
54f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 21  pPager->jfd, 1)!
5500: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5510: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
5520: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
5530: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  {.           sql
5540: 69 74 65 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  iteOsClose(pPage
5550: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
5560: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
5570: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
5580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5590: 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28   sqliteOsUnlock(
55a0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
55b0: 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
55c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  0;.         retu
55d0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
55e0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
55f0: 20 2f 2a 20 47 65 74 20 61 20 77 72 69 74 65 20   /* Get a write 
5600: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
5610: 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 73  base */.       s
5620: 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 70 50  qliteOsUnlock(pP
5630: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
5640: 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 4c 6f    if( sqliteOsLo
5650: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 31  ck(pPager->fd, 1
5660: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
5670: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4f           sqliteO
5680: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
5690: 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50  fd);.         pP
56a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
56b0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
56c0: 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
56d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
56e0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
56f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
5700: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
5710: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a  LITE_WRITELOCK;.
5720: 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62  .       /* Playb
5730: 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
5740: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
5750: 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
5760: 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c  rite.       ** l
5770: 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
5780: 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
5790: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
57a0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
57b0: 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
57c0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
57d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
57e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
57f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5800: 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
5810: 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  se{.    /* Searc
5820: 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61  h for page in ca
5830: 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  che */.    pPg =
5840: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
5850: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
5860: 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
5870: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
5880: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
5890: 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
58a0: 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
58b0: 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  h;.    pPager->n
58c0: 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Miss++;.    if( 
58d0: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
58e0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
58f0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
5900: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72  0 ){.      /* Cr
5910: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
5920: 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73  */.      pPg = s
5930: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
5940: 65 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49  eof(*pPg) + SQLI
5950: 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 2b 20 70  TE_PAGE_SIZE + p
5960: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 29 3b  Pager->nExtra );
5970: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
5980: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  0 ){.        *pp
5990: 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
59a0: 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c    pager_unwritel
59b0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
59c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
59d0: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
59e0: 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72  R_MEM;.        r
59f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5a00: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
5a10: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
5a20: 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50  pPager;.      pP
5a30: 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
5a40: 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
5a50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
5a60: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ll ){.        pP
5a70: 61 67 65 72 2d 3e 70 41 6c 6c 2d 3e 70 50 72 65  ager->pAll->pPre
5a80: 76 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  vAll = pPg;.    
5a90: 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
5aa0: 50 72 65 76 41 6c 6c 20 3d 20 30 3b 0a 20 20 20  PrevAll = 0;.   
5ab0: 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
5ac0: 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61  = pPg;.      pPa
5ad0: 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
5ae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
5af0: 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 6f 6c 64  * Recycle an old
5b00: 65 72 20 70 61 67 65 2e 20 20 46 69 72 73 74 20  er page.  First 
5b10: 6c 6f 63 61 74 65 20 74 68 65 20 70 61 67 65 20  locate the page 
5b20: 74 6f 20 62 65 20 72 65 63 79 63 6c 65 64 2e 0a  to be recycled..
5b30: 20 20 20 20 20 20 2a 2a 20 54 72 79 20 74 6f 20        ** Try to 
5b40: 66 69 6e 64 20 6f 6e 65 20 74 68 61 74 20 69 73  find one that is
5b50: 20 6e 6f 74 20 64 69 72 74 79 20 61 6e 64 20 69   not dirty and i
5b60: 73 20 6e 65 61 72 20 74 68 65 20 68 65 61 64 20  s near the head 
5b70: 6f 66 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  of.      ** of t
5b80: 68 65 20 66 72 65 65 20 6c 69 73 74 20 2a 2f 0a  he free list */.
5b90: 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20        int cnt = 
5ba0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 2f 32  pPager->mxPage/2
5bb0: 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
5bc0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
5bd0: 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 2d 3e      while( pPg->
5be0: 64 69 72 74 79 20 26 26 20 30 3c 63 6e 74 2d 2d  dirty && 0<cnt--
5bf0: 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 46 72   && pPg->pNextFr
5c00: 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ee ){.        pP
5c10: 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  g = pPg->pNextFr
5c20: 65 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ee;.      }..   
5c30: 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c     /* If we coul
5c40: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
5c50: 65 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62  e that has not b
5c60: 65 65 6e 20 75 73 65 64 20 72 65 63 65 6e 74 6c  een used recentl
5c70: 79 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 77  y.      ** and w
5c80: 68 69 63 68 20 69 73 20 6e 6f 74 20 64 69 72 74  hich is not dirt
5c90: 79 2c 20 74 68 65 6e 20 73 79 6e 63 20 74 68 65  y, then sync the
5ca0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 72 69   journal and wri
5cb0: 74 65 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  te all.      ** 
5cc0: 64 69 72 74 79 20 66 72 65 65 20 70 61 67 65 73  dirty free pages
5cd0: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
5ce0: 73 65 20 66 69 6c 65 2c 20 74 68 75 73 20 6d 61  se file, thus ma
5cf0: 6b 69 6e 67 20 74 68 65 6d 0a 20 20 20 20 20 20  king them.      
5d00: 2a 2a 20 63 6c 65 61 6e 20 70 61 67 65 73 20 61  ** clean pages a
5d10: 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
5d20: 20 72 65 63 79 63 6c 69 6e 67 2e 0a 20 20 20 20   recycling..    
5d30: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65    **.      ** We
5d40: 20 68 61 76 65 20 74 6f 20 73 79 6e 63 20 74 68   have to sync th
5d50: 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
5d60: 20 77 72 69 74 69 6e 67 20 61 20 70 61 67 65 20   writing a page 
5d70: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  to the main.    
5d80: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20    ** database.  
5d90: 42 75 74 20 73 79 6e 63 69 6e 67 20 69 73 20 61  But syncing is a
5da0: 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
5db0: 74 69 6f 6e 2e 20 20 53 6f 20 61 66 74 65 72 20  tion.  So after 
5dc0: 61 0a 20 20 20 20 20 20 2a 2a 20 73 79 6e 63 2c  a.      ** sync,
5dd0: 20 69 74 20 69 73 20 62 65 73 74 20 74 6f 20 77   it is best to w
5de0: 72 69 74 65 20 65 76 65 72 79 74 68 69 6e 67 20  rite everything 
5df0: 77 65 20 63 61 6e 20 62 61 63 6b 20 74 6f 20 74  we can back to t
5e00: 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 2a 2a  he main.      **
5e10: 20 64 61 74 61 62 61 73 65 20 74 6f 20 6d 69 6e   database to min
5e20: 69 6d 69 7a 65 20 74 68 65 20 72 69 73 6b 20 6f  imize the risk o
5e30: 66 20 68 61 76 69 6e 67 20 74 6f 20 73 79 6e 63  f having to sync
5e40: 20 61 67 61 69 6e 20 69 6e 20 74 68 65 0a 20 20   again in the.  
5e50: 20 20 20 20 2a 2a 20 6e 65 61 72 20 66 75 74 75      ** near futu
5e60: 72 65 2e 20 20 54 68 61 74 20 69 73 20 77 61 79  re.  That is way
5e70: 20 77 65 20 77 72 69 74 65 20 61 6c 6c 20 64 69   we write all di
5e80: 72 74 79 20 70 61 67 65 73 20 61 66 74 65 72 20  rty pages after 
5e90: 61 0a 20 20 20 20 20 20 2a 2a 20 73 79 6e 63 2e  a.      ** sync.
5ea0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5eb0: 69 66 28 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50  if( pPg==0 || pP
5ec0: 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
5ed0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
5ee0: 63 41 6c 6c 50 61 67 65 73 28 70 50 61 67 65 72  cAllPages(pPager
5ef0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
5f00: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
5f10: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f    sqlitepager_ro
5f20: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
5f30: 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67            *ppPag
5f40: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
5f50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
5f60: 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
5f70: 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50          pPg = pP
5f80: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
5f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
5fa0: 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
5fb0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
5fc0: 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
5fd0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c  );..      /* Unl
5fe0: 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65  ink the old page
5ff0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
6000: 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68  ist and the hash
6010: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a   table.      */.
6020: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
6030: 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
6040: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
6050: 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
6060: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
6070: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6080: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
6090: 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67  ger->pFirst==pPg
60a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
60b0: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
60c0: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
60d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
60e0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
60f0: 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  .        pPg->pN
6100: 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
6110: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
6120: 72 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ree;.      }else
6130: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6140: 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d  ( pPager->pLast=
6150: 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  =pPg );.        
6160: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
6170: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
6180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
6190: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  g->pNextFree = p
61a0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
61b0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  0;.      if( pPg
61c0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
61d0: 20 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78         pPg->pNex
61e0: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
61f0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
6200: 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  h;.      }.     
6210: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
6220: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ash ){.        p
6230: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70  Pg->pPrevHash->p
6240: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
6250: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 20 20 20  pNextHash;.     
6260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6270: 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
6280: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
6290: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
62a0: 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67  r->aHash[h]==pPg
62b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
62c0: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
62d0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
62e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
62f0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
6300: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
6310: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
6320: 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nOvfl++;.    }. 
6330: 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70     pPg->pgno = p
6340: 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61  gno;.    if( pPa
6350: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
6360: 26 26 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  && pgno<=pPager-
6370: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
6380: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
6390: 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
63a0: 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
63b0: 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
63c0: 29 29 21 3d 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ))!=0;.    }else
63d0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
63e0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
63f0: 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  }.    pPg->dirty
6400: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e   = 0;.    pPg->n
6410: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46  Ref = 1;.    REF
6420: 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70  INFO(pPg);.    p
6430: 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
6440: 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73     h = pager_has
6450: 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67  h(pgno);.    pPg
6460: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
6470: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
6480: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
6490: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
64a0: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
64b0: 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
64c0: 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
64d0: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  sh->pPrevHash==0
64e0: 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
64f0: 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
6500: 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ash = pPg;.    }
6510: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
6520: 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71 6c 69  >dbSize<0 ) sqli
6530: 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  tepager_pagecoun
6540: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
6550: 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
6560: 65 3c 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  e<pgno ){.      
6570: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
6580: 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53 51  DATA(pPg), 0, SQ
6590: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
65a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
65b0: 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 70    sqliteOsSeek(p
65c0: 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
65d0: 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  -1)*SQLITE_PAGE_
65e0: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  SIZE);.      sql
65f0: 69 74 65 4f 73 52 65 61 64 28 70 50 61 67 65 72  iteOsRead(pPager
6600: 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
6610: 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45  ATA(pPg), SQLITE
6620: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
6630: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
6640: 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
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 45 58 54 52 41 28 70 50 67 29 2c  R_TO_EXTRA(pPg),
6670: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
6680: 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ra);.    }.  }el
6690: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
66a0: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
66b0: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
66c0: 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  he. */.    pPage
66d0: 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70  r->nHit++;.    p
66e0: 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
66f0: 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47  }.  *ppPage = PG
6700: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
6710: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6720: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
6730: 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
6740: 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
6750: 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
6760: 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
6770: 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
6780: 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
6790: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
67a0: 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
67b0: 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
67c0: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
67d0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
67e0: 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29 2e  litepager_get().
67f0: 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
6800: 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
6810: 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
6820: 69 74 65 70 61 67 65 72 5f 67 65 74 28 29 20 69  itepager_get() i
6830: 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
6840: 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
6850: 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
6860: 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
6870: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
6880: 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
6890: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
68a0: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
68b0: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
68c0: 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
68d0: 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
68e0: 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
68f0: 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  pened..*/.void *
6900: 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b  sqlitepager_look
6910: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
6920: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
6930: 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
6940: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
6950: 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
6960: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
6970: 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 50 61  .  */ .  if( pPa
6980: 67 65 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  ger==0 || pgno==
6990: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
69a0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
69b0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
69c0: 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
69d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
69e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
69f0: 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  er->nRef==0 ){. 
6a00: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6a10: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
6a20: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
6a30: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
6a40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6a50: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
6a60: 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
6a70: 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
6a80: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
6a90: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
6aa0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
6ab0: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
6ac0: 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
6ad0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
6ae0: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
6af0: 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
6b00: 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
6b10: 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
6b20: 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
6b30: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
6b40: 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
6b50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
6b60: 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
6b70: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
6b80: 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  unref(void *pDat
6b90: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
6ba0: 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  ;..  /* Decremen
6bb0: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
6bc0: 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
6bd0: 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  age.  */.  pPg =
6be0: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
6bf0: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
6c00: 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
6c10: 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
6c20: 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
6c30: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
6c40: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
6c50: 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
6c60: 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
6c70: 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
6c80: 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
6c90: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
6ca0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
6cb0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
6cc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
6cd0: 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
6ce0: 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
6cf0: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
6d00: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
6d10: 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
6d20: 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
6d30: 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
6d40: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
6d50: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
6d60: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
6d70: 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
6d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d90: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
6da0: 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
6db0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
6dc0: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
6dd0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
6de0: 63 74 6f 72 28 70 44 61 74 61 29 3b 0a 20 20 20  ctor(pData);.   
6df0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
6e00: 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
6e10: 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
6e20: 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
6e30: 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
6e40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6e50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
6e60: 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
6e70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
6e80: 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
6e90: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
6ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67  ==0 ){.      pag
6eb0: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
6ec0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
6ef0: 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
6f00: 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
6f10: 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
6f20: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
6f30: 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
6f40: 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
6f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
6f60: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
6f70: 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
6f80: 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
6f90: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
6fa0: 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
6fb0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
6fc0: 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
6fd0: 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
6fe0: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 77 72  nd acquires a wr
6ff0: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
7000: 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
7010: 65 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20  e write.** lock 
7020: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
7030: 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
7040: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
7050: 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
7060: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
7070: 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
7080: 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
7090: 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
70a0: 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
70b0: 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
70c0: 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
70d0: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
70e0: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
70f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7100: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
7110: 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
7120: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
7130: 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
7140: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
7150: 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
7160: 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
7170: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
7180: 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
7190: 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
71a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
71b0: 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
71c0: 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
71d0: 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  itepager_commit(
71e0: 29 20 6f 72 20 73 71 6c 69 74 65 70 61 67 65 72  ) or sqlitepager
71f0: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  _rollback() to.*
7200: 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20  * reset..*/.int 
7210: 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74  sqlitepager_writ
7220: 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  e(void *pData){.
7230: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
7240: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
7250: 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
7260: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7270: 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
7280: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
7290: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
72a0: 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
72b0: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
72c0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
72d0: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
72e0: 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
72f0: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
7300: 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20  .  pPg->dirty = 
7310: 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  1;.  if( pPg->in
7320: 4a 6f 75 72 6e 61 6c 20 29 7b 20 72 65 74 75 72  Journal ){ retur
7330: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20  n SQLITE_OK; }. 
7340: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7350: 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55  >state!=SQLITE_U
7360: 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
7370: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51  Pager->state==SQ
7380: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 29 7b  LITE_READLOCK ){
7390: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
73a0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
73b0: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
73c0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
73d0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
73e0: 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
73f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  1 );.    if( pPa
7400: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
7410: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
7420: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
7430: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
7440: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c  sqliteOsOpenExcl
7450: 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a  usive(pPager->zJ
7460: 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
7470: 3e 6a 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  >jfd);.    if( r
7480: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7490: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
74a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
74b0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
74c0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
74d0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
74e0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 69  dSync = 0;.    i
74f0: 66 28 20 73 71 6c 69 74 65 4f 73 4c 6f 63 6b 28  f( sqliteOsLock(
7500: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 21  pPager->jfd, 1)!
7510: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7520: 20 20 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73      sqliteOsClos
7530: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
7540: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
7550: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
7560: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7570: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
7580: 20 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63     sqliteOsUnloc
7590: 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  k(pPager->fd);. 
75a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 4c     if( sqliteOsL
75b0: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
75c0: 31 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)!=SQLITE_OK ){
75d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 43  .      sqliteOsC
75e0: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
75f0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
7600: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
7610: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
7620: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55  state = SQLITE_U
7630: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 50 61  NLOCK;.      pPa
7640: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
7650: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 3b 0a  PAGER_ERR_LOCK;.
7660: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7670: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
7680: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
7690: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57  state = SQLITE_W
76a0: 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20 73 71  RITELOCK;.    sq
76b0: 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f  litepager_pageco
76c0: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
76d0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
76e0: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
76f0: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
7700: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 70 50 61  qliteOsWrite(pPa
7710: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
7720: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
7730: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
7740: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7750: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7760: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69  rc = sqliteOsWri
7770: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
7780: 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c  &pPager->dbSize,
7790: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a   sizeof(Pgno));.
77a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
77b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
77c0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
77d0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
77e0: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
77f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
7800: 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
7810: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
7820: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
7830: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
7840: 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate==SQLITE_WRIT
7850: 45 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  ELOCK );.  asser
7860: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
7870: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28 20  alOpen );.  if( 
7880: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
7890: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
78a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
78b0: 74 65 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  teOsWrite(pPager
78c0: 2d 3e 6a 66 64 2c 20 26 70 50 67 2d 3e 70 67 6e  ->jfd, &pPg->pgn
78d0: 6f 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29  o, sizeof(Pgno))
78e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
78f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7900: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
7910: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7920: 20 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50   pData, SQLITE_P
7930: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
7940: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7950: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7960: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
7970: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
7980: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
7990: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
79a0: 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 72 65 74  _FULL;.      ret
79b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
79c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
79d0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
79e0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
79f0: 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
7a00: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
7a10: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
7a20: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
7a30: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   = 1;.  }.  pPg-
7a40: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
7a50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
7a60: 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
7a70: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
7a80: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
7a90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7aa0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
7ab0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
7ac0: 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
7ad0: 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
7ae0: 65 76 69 6f 75 73 20 70 61 73 73 65 64 0a 2a 2a  evious passed.**
7af0: 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f   to sqlitepager_
7b00: 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  write().  In oth
7b10: 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
7b20: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
7b30: 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
7b40: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
7b50: 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  e page..*/.int s
7b60: 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77 72 69  qlitepager_iswri
7b70: 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61  teable(void *pDa
7b80: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
7b90: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
7ba0: 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
7bb0: 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
7bc0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
7bd0: 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
7be0: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
7bf0: 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
7c00: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
7c10: 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
7c20: 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
7c30: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
7c40: 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
7c50: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
7c60: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
7c70: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
7c80: 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
7c90: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
7ca0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
7cb0: 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  r_commit(Pager *
7cc0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
7cd0: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
7ce0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
7cf0: 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45  errMask==PAGER_E
7d00: 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  RR_FULL ){.    r
7d10: 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f  c = sqlitepager_
7d20: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
7d30: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
7d40: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
7d50: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
7d60: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
7d70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
7d80: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
7d90: 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
7da0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
7db0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7dc0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
7dd0: 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e!=SQLITE_WRITEL
7de0: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
7df0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
7e00: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
7e10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
7e20: 6e 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  n );.  if( pPage
7e30: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 26 26 20 73  r->needSync && s
7e40: 71 6c 69 74 65 4f 73 53 79 6e 63 28 70 50 61 67  qliteOsSync(pPag
7e50: 65 72 2d 3e 6a 66 64 29 21 3d 53 51 4c 49 54 45  er->jfd)!=SQLITE
7e60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
7e70: 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
7e80: 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  }.  for(pPg=pPag
7e90: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
7ea0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
7eb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
7ec0: 64 69 72 74 79 3d 3d 30 20 29 20 63 6f 6e 74 69  dirty==0 ) conti
7ed0: 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  nue;.    rc = sq
7ee0: 6c 69 74 65 4f 73 53 65 65 6b 28 70 50 61 67 65  liteOsSeek(pPage
7ef0: 72 2d 3e 66 64 2c 20 28 70 50 67 2d 3e 70 67 6e  r->fd, (pPg->pgn
7f00: 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45  o-1)*SQLITE_PAGE
7f10: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
7f20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7f30: 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
7f40: 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  t;.    rc = sqli
7f50: 74 65 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  teOsWrite(pPager
7f60: 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
7f70: 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45  ATA(pPg), SQLITE
7f80: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
7f90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7fa0: 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
7fb0: 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66  _abort;.  }.  if
7fc0: 28 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 70  ( sqliteOsSync(p
7fd0: 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49  Pager->fd)!=SQLI
7fe0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
7ff0: 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 72 63 20  mit_abort;.  rc 
8000: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
8010: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ock(pPager);.  p
8020: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
8030: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
8040: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
8050: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
8060: 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74  s wrong during t
8070: 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
8080: 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61  s..  */.commit_a
8090: 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c  bort:.  rc = sql
80a0: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
80b0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
80c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
80d0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
80e0: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
80f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8100: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
8110: 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
8120: 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
8130: 20 74 6f 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f   to read-only mo
8140: 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
8150: 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
8160: 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
8170: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
8180: 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
8190: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
81a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
81b0: 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
81c0: 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
81d0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
81e0: 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
81f0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
8200: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53  king protocol (S
8210: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20  QLITE_PROTOCOL) 
8220: 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
8230: 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
8240: 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
8250: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
8260: 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
8270: 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
8280: 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
8290: 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
82a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
82b0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
82c0: 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
82d0: 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
82e0: 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
82f0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
8300: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
8310: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
8320: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
8330: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8340: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
8350: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
8360: 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  !=0 && pPager->e
8370: 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52  rrMask!=PAGER_ER
8380: 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  R_FULL ){.    re
8390: 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
83a0: 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
83b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
83c0: 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate!=SQLITE_WRIT
83d0: 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  ELOCK ){.    ret
83e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
83f0: 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f   }.  rc = pager_
8400: 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
8410: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8420: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
8430: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
8440: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
8450: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
8460: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  RR_CORRUPT;.  }.
8470: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
8480: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
8490: 72 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.};../*.** Re
84a0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
84b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
84c0: 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
84d0: 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
84e0: 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
84f0: 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
8500: 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
8510: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
8520: 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  _isreadonly(Page
8530: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
8540: 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
8550: 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
8560: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8570: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
8580: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
8590: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
85a0: 74 65 70 61 67 65 72 5f 73 74 61 74 73 28 50 61  tepager_stats(Pa
85b0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
85c0: 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b  static int a[9];
85d0: 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
85e0: 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
85f0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
8600: 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
8610: 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
8620: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
8630: 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
8640: 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
8650: 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61   = pPager->errMa
8660: 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  sk;.  a[6] = pPa
8670: 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
8680: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
8690: 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67  s;.  a[8] = pPag
86a0: 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74  er->nOvfl;.  ret
86b0: 75 72 6e 20 61 3b 0a 7d 0a 0a 23 69 66 20 53 51  urn a;.}..#if SQ
86c0: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
86d0: 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
86e0: 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
86f0: 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
8700: 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
8710: 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72  void sqlitepager
8720: 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a  _refdump(Pager *
8730: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
8740: 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67   *pPg;.  for(pPg
8750: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
8760: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
8770: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
8780: 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63  pPg->nRef<=0 ) c
8790: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72 69  ontinue;.    pri
87a0: 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
87b0: 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25  dr=0x%08x nRef=%
87c0: 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50  d\n", .       pP
87d0: 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47  g->pgno, (int)PG
87e0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
87f0: 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
8800: 7d 0a 7d 0a 23 65 6e 64 69 66 0a                 }.}.#endif.