/ Hex Artifact Content
Login

Artifact 16173a7b7aff0c7bd7da94070e46d38778ab0f76:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 32  : pager.c,v 1.32
0350: 20 32 30 30 31 2f 31 32 2f 30 35 20 30 30 3a 32   2001/12/05 00:2
0360: 31 3a 32 30 20 64 72 68 20 45 78 70 20 24 0a 2a  1:20 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0380: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
0390: 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e 63  e "pager.h".#inc
03a0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
03b0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
03c0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
03d0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  .h>../*.** The p
03e0: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
03f0: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0400: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0410: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0420: 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  :.**.**   SQLITE
0430: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 54 68  _UNLOCK       Th
0440: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0450: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
0460: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0490: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
04a0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
04d0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
04e0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0500: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0510: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 52 45 41  .**   SQLITE_REA
0520: 44 4c 4f 43 4b 20 20 20 20 20 54 68 65 20 70 61  DLOCK     The pa
0530: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0540: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0550: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0560: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0570: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0580: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0590: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
05b0: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
05c0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
05d0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0600: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0610: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0620: 4b 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61  K    The page ca
0630: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0640: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0670: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0680: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0690: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
06a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
06b0: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
06c0: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
06d0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0700: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
0710: 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20 75  ge cache comes u
0720: 70 20 69 6e 20 53 51 4c 49 54 45 5f 55 4e 4c 4f  p in SQLITE_UNLO
0730: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0740: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 5f  ime a.** sqlite_
0750: 70 61 67 65 5f 67 65 74 28 29 20 6f 63 63 75 72  page_get() occur
0760: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0770: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53 51 4c 49  nsitions to SQLI
0780: 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2a 20  TE_READLOCK..** 
0790: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
07a0: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
07b0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
07c0: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
07d0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
07e0: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 53  itions back to S
07f0: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54  QLITE_UNLOCK.  T
0800: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0810: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0820: 65 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c  e_write() is cal
0830: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0840: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0850: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0860: 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  K.  (Note that s
0870: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0880: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0890: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
08a0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
08b0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
08c0: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
08d0: 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49 54 45 5f  ** be in SQLITE_
08e0: 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f 72 65 20  READLOCK before 
08f0: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0900: 6f 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  o SQLITE_WRITELO
0910: 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73 71 6c 69  CK.).** The sqli
0920: 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62 61 63 6b  te_page_rollback
0930: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 5f 70 61  () and sqlite_pa
0940: 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66 75 6e 63  ge_commit() func
0950: 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61 6e 73 69  tions .** transi
0960: 74 69 6f 6e 20 74 68 65 20 73 74 61 74 65 20 66  tion the state f
0970: 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52 49 54 45  rom SQLITE_WRITE
0980: 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20 53 51 4c  LOCK back to SQL
0990: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2f  ITE_READLOCK..*/
09a0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
09b0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64  UNLOCK      0.#d
09c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 45 41  efine SQLITE_REA
09d0: 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64 65 66 69  DLOCK    1.#defi
09e0: 6e 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  ne SQLITE_WRITEL
09f0: 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a 2a 2a 20  OCK   2.../*.** 
0a00: 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  Each in-memory i
0a10: 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62  mage of a page b
0a20: 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66  egins with the f
0a30: 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e  ollowing header.
0a40: 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20  .** This header 
0a50: 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20  is only visible 
0a60: 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f  to this pager mo
0a70: 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e  dule.  The clien
0a80: 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63  t.** code that c
0a90: 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20  alls pager sees 
0aa0: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68  only the data th
0ab0: 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68  at follows the h
0ac0: 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  eader..*/.typede
0ad0: 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50  f struct PgHdr P
0ae0: 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48  gHdr;.struct PgH
0af0: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
0b00: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
0b10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
0b20: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
0b30: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
0b40: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b60: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
0b70: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
0b80: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
0b90: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
0ba0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
0bb0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
0bc0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
0bd0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
0c00: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
0c10: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
0c20: 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46  extFree, *pPrevF
0c30: 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73  ree;  /* Freelis
0c40: 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65  t of pages where
0c50: 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67   nRef==0 */.  Pg
0c60: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 2c 20 2a  Hdr *pNextAll, *
0c70: 70 50 72 65 76 41 6c 6c 3b 20 20 20 20 2f 2a 20  pPrevAll;    /* 
0c80: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
0c90: 67 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 69 6e  ges */.  char in
0ca0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0cb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
0cc0: 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  if has been writ
0cd0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
0ce0: 2f 0a 20 20 63 68 61 72 20 64 69 72 74 79 3b 20  /.  char dirty; 
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65     /* TRUE if we
0d10: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 62   need to write b
0d20: 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ack changes */. 
0d30: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 5f   /* SQLITE_PAGE_
0d40: 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20 70 61  SIZE bytes of pa
0d50: 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74  ge data follow t
0d60: 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  his header */.  
0d70: 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  /* Pager.nExtra 
0d80: 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64  bytes of local d
0d90: 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  ata follow the p
0da0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a  age data */.};..
0db0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
0dc0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
0dd0: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
0de0: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
0df0: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
0e00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
0e10: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28  R_TO_DATA(P)  ((
0e20: 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29  void*)(&(P)[1]))
0e30: 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f  .#define DATA_TO
0e40: 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50  _PGHDR(D)  (&((P
0e50: 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a  gHdr*)(D))[-1]).
0e60: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
0e70: 5f 45 58 54 52 41 28 50 29 20 28 28 76 6f 69 64  _EXTRA(P) ((void
0e80: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
0e90: 5b 31 5d 29 29 5b 53 51 4c 49 54 45 5f 50 41 47  [1]))[SQLITE_PAG
0ea0: 45 5f 53 49 5a 45 5d 29 0a 0a 2f 2a 0a 2a 2a 20  E_SIZE])../*.** 
0eb0: 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20  How big to make 
0ec0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75  the hash table u
0ed0: 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  sed for locating
0ee0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
0ef0: 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62  .** by page numb
0f00: 65 72 2e 20 20 4b 6e 75 74 68 20 73 61 79 73 20  er.  Knuth says 
0f10: 74 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 61  this should be a
0f20: 20 70 72 69 6d 65 20 6e 75 6d 62 65 72 2e 0a 2a   prime number..*
0f30: 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48  /.#define N_PG_H
0f40: 41 53 48 20 33 37 33 0a 0a 2f 2a 0a 2a 2a 20 41  ASH 373../*.** A
0f50: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
0f60: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
0f70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0f80: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
0f90: 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20  truct Pager {.  
0fa0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0fc0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
0fd0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
0fe0: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
0ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1000: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1010: 20 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46 69 6c   file */.  OsFil
1020: 65 20 66 64 2c 20 6a 66 64 3b 20 20 20 20 20 20  e fd, jfd;      
1030: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1040: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
1050: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
1060: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  nal */.  int jou
1070: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
1080: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1090: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
10a0: 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69  criptors is vali
10b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  d */.  int dbSiz
10c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10e0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
10f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
1100: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
1110: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
1120: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
1130: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
1140: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
1150: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1160: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
1170: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
1180: 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20   page */.  void 
1190: 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76  (*xDestructor)(v
11a0: 6f 69 64 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  oid*); /* Call t
11b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
11c0: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
11d0: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
1200: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
1210: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
1220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1230: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1240: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
1250: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
1260: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
1270: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1280: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
1290: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
12a0: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
12b0: 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  */.  int nHit, n
12c0: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
12d0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
12e0: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
12f0: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
1300: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
1310: 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  ate;        /* S
1320: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f 52  QLITE_UNLOCK, _R
1330: 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49 54  EADLOCK or _WRIT
1340: 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 6e 73 69 67  ELOCK */.  unsig
1350: 6e 65 64 20 63 68 61 72 20 65 72 72 4d 61 73 6b  ned char errMask
1360: 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;      /* One of
1370: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
1380: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 6e  f errors */.  un
1390: 73 69 67 6e 65 64 20 63 68 61 72 20 74 65 6d 70  signed char temp
13a0: 46 69 6c 65 3b 20 20 20 20 20 2f 2a 20 7a 46 69  File;     /* zFi
13b0: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
13c0: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
13d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 72 65  unsigned char re
13e0: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 2f 2a 20 54  adOnly;     /* T
13f0: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
1400: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
1410: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1420: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 2f 2a  needSync;     /*
1430: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
1440: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
1450: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1460: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1470: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 2f 2a  *aInJournal;  /*
1480: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
1490: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
14a0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
14b0: 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20   PgHdr *pFirst, 
14c0: 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20  *pLast;      /* 
14d0: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  List of free pag
14e0: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
14f0: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
1500: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
1510: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
1520: 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f  Hdr *aHash[N_PG_
1530: 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73  HASH];    /* Has
1540: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
1550: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 50 67  age number of Pg
1560: 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Hdr */.};../*.**
1570: 20 54 68 65 73 65 20 61 72 65 20 62 69 74 73 20   These are bits 
1580: 74 68 61 74 20 63 61 6e 20 62 65 20 73 65 74 20  that can be set 
1590: 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b  in Pager.errMask
15a0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
15b0: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20 20 20 20  ER_ERR_FULL     
15c0: 30 78 30 31 20 20 2f 2a 20 61 20 77 72 69 74 65  0x01  /* a write
15d0: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65  () failed */.#de
15e0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4d  fine PAGER_ERR_M
15f0: 45 4d 20 20 20 20 20 20 30 78 30 32 20 20 2f 2a  EM      0x02  /*
1600: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
1610: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
1620: 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30  R_ERR_LOCK     0
1630: 78 30 34 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e  x04  /* error in
1640: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f   the locking pro
1650: 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65  tocol */.#define
1660: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
1670: 50 54 20 20 30 78 30 38 20 20 2f 2a 20 64 61 74  PT  0x08  /* dat
1680: 61 62 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c  abase or journal
1690: 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23   corruption */.#
16a0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
16b0: 5f 44 49 53 4b 20 20 20 20 20 30 78 31 30 20 20  _DISK     0x10  
16c0: 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69 73 6b 20  /* general disk 
16d0: 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62 61 64 20  I/O error - bad 
16e0: 68 61 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a  hard drive? */..
16f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
1700: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
1710: 70 61 67 65 20 72 65 63 6f 72 64 73 20 69 6e 20  page records in 
1720: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1730: 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 74 79 70 65   format..*/.type
1740: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 52  def struct PageR
1750: 65 63 6f 72 64 20 50 61 67 65 52 65 63 6f 72 64  ecord PageRecord
1760: 3b 0a 73 74 72 75 63 74 20 50 61 67 65 52 65 63  ;.struct PageRec
1770: 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  ord {.  Pgno pgn
1780: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1790: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
17a0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  ge number */.  c
17b0: 68 61 72 20 61 44 61 74 61 5b 53 51 4c 49 54 45  har aData[SQLITE
17c0: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a  _PAGE_SIZE];  /*
17d0: 20 4f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 66   Original data f
17e0: 6f 72 20 70 61 67 65 20 70 67 6e 6f 20 2a 2f 0a  or page pgno */.
17f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  };../*.** Journa
1800: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
1810: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1820: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
1830: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
1840: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
1850: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
1860: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
1870: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
1880: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1890: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
18a0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
18b0: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
18c0: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
18d0: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
18e0: 34 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 73  4,.};../*.** Has
18f0: 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  h a page number.
1900: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  */.#define pager
1910: 5f 68 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29  _hash(PN)  ((PN)
1920: 25 4e 5f 50 47 5f 48 41 53 48 29 0a 0a 2f 2a 0a  %N_PG_HASH)../*.
1930: 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65  ** Enable refere
1940: 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69  nce count tracki
1950: 6e 67 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 20  ng here:.*/.#if 
1960: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
1970: 74 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f  t pager_refinfo_
1980: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
1990: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
19a0: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
19b0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
19c0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
19d0: 66 28 20 21 70 61 67 65 72 5f 72 65 66 69 6e 66  f( !pager_refinf
19e0: 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75 72  o_enable ) retur
19f0: 6e 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 0a 20  n;.    printf(. 
1a00: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
1a10: 34 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e  4d addr=0x%08x n
1a20: 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Ref=%d\n",.     
1a30: 20 20 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29    p->pgno, (int)
1a40: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
1a50: 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  , p->nRef.    );
1a60: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
1a70: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
1a80: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
1a90: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
1aa0: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
1ab0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
1ac0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
1ad0: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
1ae0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  ./*.** Convert t
1af0: 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 70  he bits in the p
1b00: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69  Pager->errMask i
1b10: 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74  nto an approprat
1b20: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65  e.** return code
1b30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b40: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61  pager_errcode(Pa
1b50: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b60: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b70: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
1b80: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
1b90: 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20  R_ERR_LOCK )    
1ba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54  rc = SQLITE_PROT
1bb0: 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67  OCOL;.  if( pPag
1bc0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
1bd0: 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20  GER_ERR_DISK )  
1be0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1bf0: 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ERR;.  if( pPage
1c00: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
1c10: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20  ER_ERR_FULL )   
1c20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
1c30: 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  L;.  if( pPager-
1c40: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
1c50: 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20 72  _ERR_MEM )     r
1c60: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1c70: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1c80: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
1c90: 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63  ERR_CORRUPT ) rc
1ca0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1cb0: 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  T;.  return rc;.
1cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
1cd0: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
1ce0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
1cf0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
1d00: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
1d10: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
1d20: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
1d30: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
1d40: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
1d50: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
1d60: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
1d70: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65  PgHdr *p = pPage
1d80: 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 25 20  r->aHash[pgno % 
1d90: 4e 5f 50 47 5f 48 41 53 48 5d 3b 0a 20 20 77 68  N_PG_HASH];.  wh
1da0: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
1db0: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
1dc0: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
1dd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
1de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
1df0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
1e00: 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  d clear the in-m
1e10: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
1e20: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
1e30: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
1e40: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
1e50: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
1e60: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
1e70: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
1e80: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
1e90: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
1ea0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
1eb0: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
1ec0: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
1ed0: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
1ee0: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
1ef0: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
1f00: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
1f10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f20: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
1f30: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d  Next;.  for(pPg=
1f40: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
1f50: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
1f60: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
1f70: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
1f80: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
1f90: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69   }.  pPager->pFi
1fa0: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
1fb0: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
1fc0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
1fd0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
1fe0: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
1ff0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2000: 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  h));.  pPager->n
2010: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
2020: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53  pPager->state==S
2030: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
2040: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67  ){.    sqlitepag
2050: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
2060: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
2070: 65 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  eOsUnlock(pPager
2080: 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d  ->fd);.  pPager-
2090: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
20a0: 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72  UNLOCK;.  pPager
20b0: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
20c0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
20d0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
20e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
20f0: 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
2100: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
2110: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
2120: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
2130: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
2140: 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69 74 65 20   and.** a write 
2150: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2160: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
2170: 69 6e 65 20 72 65 6c 65 61 73 65 73 20 74 68 65  ine releases the
2180: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77 72 69   database.** wri
2190: 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75  te lock and acqu
21a0: 69 72 65 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  ires a read lock
21b0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20   in its place.  
21c0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
21d0: 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65 64 20 61  .** is deleted a
21e0: 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  nd closed..**.**
21f0: 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 6c 65   We have to rele
2200: 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
2210: 63 6b 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ck before acquir
2220: 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
2230: 6b 2c 0a 2a 2a 20 73 6f 20 74 68 65 72 65 20 69  k,.** so there i
2240: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
2250: 6f 6e 20 77 68 65 72 65 20 61 6e 6f 74 68 65 72  on where another
2260: 20 70 72 6f 63 65 73 73 20 63 61 6e 20 67 65 74   process can get
2270: 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 77 68 69   the lock.** whi
2280: 6c 65 20 77 65 20 61 72 65 20 6e 6f 74 20 68 6f  le we are not ho
2290: 6c 64 69 6e 67 20 69 74 2e 20 20 42 75 74 2c 20  lding it.  But, 
22a0: 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
22b0: 20 73 68 6f 75 6c 64 20 64 6f 20 74 68 69 73 0a   should do this.
22c0: 2a 2a 20 62 65 63 61 75 73 65 20 77 65 20 61 72  ** because we ar
22d0: 65 20 61 6c 73 6f 20 68 6f 6c 64 69 6e 67 20 61  e also holding a
22e0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6a 6f 75   lock on the jou
22f0: 72 6e 61 6c 2c 20 61 6e 64 20 6e 6f 20 70 72 6f  rnal, and no pro
2300: 63 65 73 73 0a 2a 2a 20 73 68 6f 75 6c 64 20 67  cess.** should g
2310: 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  et a write lock 
2320: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2330: 77 69 74 68 6f 75 74 20 66 69 72 73 74 20 67 65  without first ge
2340: 74 74 69 6e 67 20 61 20 6c 6f 63 6b 0a 2a 2a 20  tting a lock.** 
2350: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  on the journal. 
2360: 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   So this routine
2370: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 66 61   should never fa
2380: 69 6c 2e 20 20 42 75 74 20 69 74 20 63 61 6e 20  il.  But it can 
2390: 66 61 69 6c 0a 2a 2a 20 69 66 20 61 6e 6f 74 68  fail.** if anoth
23a0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
23b0: 74 20 70 6c 61 79 69 6e 67 20 62 79 20 74 68 65  t playing by the
23c0: 20 72 75 6c 65 73 2e 20 20 49 66 20 69 74 20 64   rules.  If it d
23d0: 6f 65 73 20 66 61 69 6c 2c 0a 2a 2a 20 61 6c 6c  oes fail,.** all
23e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
23f0: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
2400: 69 64 61 74 65 64 2c 20 74 68 65 20 50 41 47 45  idated, the PAGE
2410: 52 5f 45 52 52 5f 4c 4f 43 4b 20 62 69 74 0a 2a  R_ERR_LOCK bit.*
2420: 2a 20 69 73 20 73 65 74 20 69 6e 20 70 50 61 67  * is set in pPag
2430: 65 72 2d 3e 65 72 72 4d 61 73 6b 2c 20 61 6e 64  er->errMask, and
2440: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2450: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f  turns SQLITE_PRO
2460: 54 4f 43 4f 4c 2e 0a 2a 2a 20 53 51 4c 49 54 45  TOCOL..** SQLITE
2470: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2480: 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73  on success..*/.s
2490: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
24a0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
24b0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
24c0: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
24d0: 50 67 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  Pg;.  if( pPager
24e0: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
24f0: 57 52 49 54 45 4c 4f 43 4b 20 29 20 72 65 74 75  WRITELOCK ) retu
2500: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2510: 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 70  sqliteOsUnlock(p
2520: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 72 63  Pager->fd);.  rc
2530: 20 3d 20 73 71 6c 69 74 65 4f 73 4c 6f 63 6b 28   = sqliteOsLock(
2540: 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
2550: 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28    sqliteOsClose(
2560: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2570: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2580: 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  pen = 0;.  sqlit
2590: 65 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  eOsDelete(pPager
25a0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 73  ->zJournal);.  s
25b0: 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
25c0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->aInJournal );
25d0: 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
25e0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 66 6f 72  urnal = 0;.  for
25f0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
2600: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
2610: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
2620: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
2630: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   0;.    pPg->dir
2640: 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ty = 0;.  }.  if
2650: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2660: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
2670: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e  tate = SQLITE_UN
2680: 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  LOCK;.    rc = S
2690: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a  QLITE_PROTOCOL;.
26a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
26b0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
26c0: 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _LOCK;.  }else{.
26d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26e0: 4f 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  OK;.    pPager->
26f0: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52  state = SQLITE_R
2700: 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72  EADLOCK;.  }.  r
2710: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2720: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
2730: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
2740: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
2750: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
2760: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
2770: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
2780: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
2790: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
27a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27b0: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
27c0: 6c 6f 77 73 3a 20 20 54 68 65 72 65 20 69 73 20  lows:  There is 
27d0: 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 66 69  an initial.** fi
27e0: 6c 65 2d 74 79 70 65 20 73 74 72 69 6e 67 20 66  le-type string f
27f0: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
2800: 6e 67 2e 20 20 54 68 65 6e 20 74 68 65 72 65 20  ng.  Then there 
2810: 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 50  is a single.** P
2820: 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68 69 63 68  gno number which
2830: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2840: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
2850: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
2860: 2a 20 63 68 61 6e 67 65 73 20 77 65 72 65 20 6d  * changes were m
2870: 61 64 65 2e 20 20 54 68 65 20 64 61 74 61 62 61  ade.  The databa
2880: 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  se is truncated 
2890: 74 6f 20 74 68 69 73 20 73 69 7a 65 2e 0a 2a 2a  to this size..**
28a0: 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65 72 6f 20   Next come zero 
28b0: 6f 72 20 6d 6f 72 65 20 70 61 67 65 20 72 65 63  or more page rec
28c0: 6f 72 64 73 20 77 68 65 72 65 20 65 61 63 68 20  ords where each 
28d0: 70 61 67 65 20 72 65 63 6f 72 64 0a 2a 2a 20 63  page record.** c
28e0: 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 50 67 6e  onsists of a Pgn
28f0: 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f 50 41 47  o and SQLITE_PAG
2900: 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20  E_SIZE bytes of 
2910: 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a 20 74 68  data.  See.** th
2920: 65 20 50 61 67 65 52 65 63 6f 72 64 20 73 74 72  e PageRecord str
2930: 75 63 74 75 72 65 20 66 6f 72 20 64 65 74 61 69  ucture for detai
2940: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 70 6c  ls..**.** For pl
2950: 61 79 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65  ayback, the page
2960: 73 20 68 61 76 65 20 74 6f 20 62 65 20 72 65 61  s have to be rea
2970: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
2980: 61 6c 20 69 6e 0a 2a 2a 20 72 65 76 65 72 73 65  al in.** reverse
2990: 20 6f 72 64 65 72 20 61 6e 64 20 70 75 74 20 62   order and put b
29a0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
29b0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
29c0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
29d0: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
29e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29f0: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
2a00: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
2a10: 6c 20 66 69 6c 65 20 28 61 73 20 64 65 74 65 72  l file (as deter
2a20: 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  mined by looking
2a30: 20 61 74 20 74 68 65 20 6d 61 67 69 63 20 6e 75   at the magic nu
2a40: 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  mber.** at the b
2a50: 65 67 69 6e 6e 69 6e 67 29 20 74 68 65 6e 20 74  eginning) then t
2a60: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2a70: 72 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  rns SQLITE_PROTO
2a80: 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  COL..** If any o
2a90: 74 68 65 72 20 65 72 72 6f 72 73 20 6f 63 63 75  ther errors occu
2aa0: 72 20 64 75 72 69 6e 67 20 70 6c 61 79 62 61 63  r during playbac
2ab0: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
2ac0: 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c 79 20 62  will.** likely b
2ad0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 73 6f 20  e corrupted, so 
2ae0: 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  the PAGER_ERR_CO
2af0: 52 52 55 50 54 20 62 69 74 20 69 73 20 73 65 74  RRUPT bit is set
2b00: 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 65   in.** pPager->e
2b10: 72 72 4d 61 73 6b 20 61 6e 64 20 53 51 4c 49 54  rrMask and SQLIT
2b20: 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
2b30: 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20 61 6c  urned.  If it al
2b40: 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74 68 65 6e  l.** works, then
2b50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2b60: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
2b70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2b80: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
2b90: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2ba0: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
2bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2bc0: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f  er of Records */
2bd0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2bf0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2c00: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
2c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2c20: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
2c30: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
2c40: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  */.  PgHdr *pPg;
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c60: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
2c70: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
2c80: 2f 0a 20 20 50 61 67 65 52 65 63 6f 72 64 20 70  /.  PageRecord p
2c90: 67 52 65 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  gRec;.  unsigned
2ca0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 73 69 7a   char aMagic[siz
2cb0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
2cc0: 63 29 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  c)];.  int rc;..
2cd0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
2ce0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
2cf0: 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
2d00: 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
2d10: 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
2d20: 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
2d30: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2d40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
2d50: 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73  en );.  sqliteOs
2d60: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
2d70: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
2d80: 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  iteOsFileSize(pP
2d90: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65 63  ager->jfd, &nRec
2da0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2db0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
2dc0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
2dd0: 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 6e  .  }.  nRec = (n
2de0: 52 65 63 20 2d 20 28 73 69 7a 65 6f 66 28 61 4d  Rec - (sizeof(aM
2df0: 61 67 69 63 29 2b 73 69 7a 65 6f 66 28 50 67 6e  agic)+sizeof(Pgn
2e00: 6f 29 29 29 20 2f 20 73 69 7a 65 6f 66 28 50 61  o))) / sizeof(Pa
2e10: 67 65 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  geRecord);.  if(
2e20: 20 6e 52 65 63 3c 3d 30 20 29 7b 0a 20 20 20 20   nRec<=0 ){.    
2e30: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
2e40: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
2e50: 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  d the beginning 
2e60: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
2e70: 6e 64 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  nd truncate the.
2e80: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2e90: 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
2ea0: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
2eb0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
2ec0: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
2ed0: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
2ee0: 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69  of(aMagic));.  i
2ef0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f00: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
2f10: 63 2c 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  c,aJournalMagic,
2f20: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
2f30: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
2f40: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a  QLITE_PROTOCOL;.
2f50: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
2f60: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  yback;.  }.  rc 
2f70: 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 70  = sqliteOsRead(p
2f80: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6d 78 50  Pager->jfd, &mxP
2f90: 67 2c 20 73 69 7a 65 6f 66 28 6d 78 50 67 29 29  g, sizeof(mxPg))
2fa0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2fb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
2fc0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
2fd0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
2fe0: 65 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  eOsTruncate(pPag
2ff0: 65 72 2d 3e 66 64 2c 20 6d 78 50 67 2a 53 51 4c  er->fd, mxPg*SQL
3000: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
3010: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3020: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
3030: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
3040: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
3050: 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20  ze = mxPg;.  .  
3060: 2f 2a 20 50 72 6f 63 65 73 73 20 73 65 67 6d 65  /* Process segme
3070: 6e 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  nts beginning wi
3080: 74 68 20 74 68 65 20 6c 61 73 74 20 61 6e 64 20  th the last and 
3090: 77 6f 72 6b 69 6e 67 20 62 61 63 6b 77 61 72 64  working backward
30a0: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69  s.  ** to the fi
30b0: 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  rst..  */.  for(
30c0: 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20  i=nRec-1; i>=0; 
30d0: 69 2d 2d 29 7b 0a 20 20 20 20 2f 2a 20 53 65 65  i--){.    /* See
30e0: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
30f0: 6e 67 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  ng of the segmen
3100: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 66 73  t */.    int ofs
3110: 74 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 69 2a  t;.    ofst = i*
3120: 73 69 7a 65 6f 66 28 50 61 67 65 52 65 63 6f 72  sizeof(PageRecor
3130: 64 29 20 2b 20 73 69 7a 65 6f 66 28 61 4d 61 67  d) + sizeof(aMag
3140: 69 63 29 20 2b 20 73 69 7a 65 6f 66 28 50 67 6e  ic) + sizeof(Pgn
3150: 6f 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  o);.    rc = sql
3160: 69 74 65 4f 73 53 65 65 6b 28 70 50 61 67 65 72  iteOsSeek(pPager
3170: 2d 3e 6a 66 64 2c 20 6f 66 73 74 29 3b 0a 20 20  ->jfd, ofst);.  
3180: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3190: 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  _OK ) break;.   
31a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
31b0: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
31c0: 26 70 67 52 65 63 2c 20 73 69 7a 65 6f 66 28 70  &pgRec, sizeof(p
31d0: 67 52 65 63 29 29 3b 0a 20 20 20 20 69 66 28 20  gRec));.    if( 
31e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
31f0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 53  break;..    /* S
3200: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
3210: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
3220: 20 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f    if( pgRec.pgno
3230: 3e 6d 78 50 67 20 7c 7c 20 70 67 52 65 63 2e 70  >mxPg || pgRec.p
3240: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  gno==0 ){.      
3250: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
3260: 55 50 54 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  UPT;.      break
3270: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3280: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 70 61 67  Playback the pag
3290: 65 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 69  e.  Update the i
32a0: 6e 2d 6d 65 6d 6f 72 79 20 63 6f 70 79 20 6f 66  n-memory copy of
32b0: 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
32c0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
32d0: 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  e, if there is o
32e0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
32f0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
3300: 70 28 70 50 61 67 65 72 2c 20 70 67 52 65 63 2e  p(pPager, pgRec.
3310: 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70  pgno);.    if( p
3320: 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  Pg ){.      memc
3330: 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
3340: 28 70 50 67 29 2c 20 70 67 52 65 63 2e 61 44 61  (pPg), pgRec.aDa
3350: 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ta, SQLITE_PAGE_
3360: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 6d 65 6d  SIZE);.      mem
3370: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
3380: 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  RA(pPg), 0, pPag
3390: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
33a0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
33b0: 74 65 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  teOsSeek(pPager-
33c0: 3e 66 64 2c 20 28 70 67 52 65 63 2e 70 67 6e 6f  >fd, (pgRec.pgno
33d0: 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  -1)*SQLITE_PAGE_
33e0: 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72  SIZE);.    if( r
33f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
3400: 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73  reak;.    rc = s
3410: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 70 50 61  qliteOsWrite(pPa
3420: 67 65 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61  ger->fd, pgRec.a
3430: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47  Data, SQLITE_PAG
3440: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28  E_SIZE);.    if(
3450: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3460: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 65 6e 64   break;.  }..end
3470: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
3480: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3490: 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72  {.    pager_unwr
34a0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
34b0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
34c0: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
34d0: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
34e0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
34f0: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
3500: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
3510: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
3520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
3540: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
3550: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
3560: 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
3570: 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
3580: 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65  d sqlitepager_se
3590: 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65  t_cachesize(Page
35a0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
35b0: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
35c0: 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
35d0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
35e0: 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  mxPage;.  }.}../
35f0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
3600: 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  w page cache and
3610: 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
3620: 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
3630: 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a   in *ppPager..**
3640: 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   The file to be 
3650: 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20  cached need not 
3660: 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65  exist.  The file
3670: 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75   is not locked u
3680: 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73  ntil.** the firs
3690: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
36a0: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
36b0: 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
36c0: 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
36d0: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
36e0: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
36f0: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  epager_unref()..
3700: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
3710: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
3720: 61 20 72 61 6e 64 6f 6d 20 74 65 6d 70 6f 72 61  a random tempora
3730: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
3740: 65 64 20 61 6e 64 20 75 73 65 64 0a 2a 2a 20 61  ed and used.** a
3750: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
3760: 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
3770: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
3780: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
3790: 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 63   when.** it is c
37a0: 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
37b0: 6c 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 28 0a  litepager_open(.
37c0: 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
37d0: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
37e0: 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
37f0: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
3800: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3810: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
3820: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
3830: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
3840: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
3850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3860: 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66 20  * Max number of 
3870: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
3880: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  pages */.  int n
3890: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
38a0: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
38b0: 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
38c0: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
38d0: 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a   */.){.  Pager *
38e0: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 6e 61  pPager;.  int na
38f0: 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20  meLen;.  OsFile 
3900: 66 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fd;.  int rc;.  
3910: 69 6e 74 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  int tempFile;.  
3920: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
3930: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
3940: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
3950: 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65  IZE];..  *ppPage
3960: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  r = 0;.  if( sql
3970: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
3980: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
3990: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
39a0: 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  }.  if( zFilenam
39b0: 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  e ){.    rc = sq
39c0: 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72  liteOsOpenReadWr
39d0: 69 74 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  ite(zFilename, &
39e0: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
39f0: 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 30      tempFile = 0
3a00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3a10: 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 20 20  nt cnt = 8;.    
3a20: 73 71 6c 69 74 65 4f 73 54 65 6d 70 46 69 6c 65  sqliteOsTempFile
3a30: 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Name(zTemp);.   
3a40: 20 64 6f 7b 0a 20 20 20 20 20 20 63 6e 74 2d 2d   do{.      cnt--
3a50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73  ;.      sqliteOs
3a60: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65  TempFileName(zTe
3a70: 6d 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mp);.      rc = 
3a80: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c  sqliteOsOpenExcl
3a90: 75 73 69 76 65 28 7a 54 65 6d 70 2c 20 26 66 64  usive(zTemp, &fd
3aa0: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 63  );.    }while( c
3ab0: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
3ac0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7a 46 69  TE_OK );.    zFi
3ad0: 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a  lename = zTemp;.
3ae0: 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
3af0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
3b00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3b10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
3b20: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e  ANTOPEN;.  }.  n
3b30: 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
3b40: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 70 50  zFilename);.  pP
3b50: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ager = sqliteMal
3b60: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61  loc( sizeof(*pPa
3b70: 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32  ger) + nameLen*2
3b80: 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70   + 30 );.  if( p
3b90: 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Pager==0 ){.    
3ba0: 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 66 64  sqliteOsClose(fd
3bb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
3bc0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
3bd0: 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
3be0: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
3bf0: 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
3c00: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
3c10: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
3c20: 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73  [nameLen+1];.  s
3c30: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  trcpy(pPager->zF
3c40: 69 6c 65 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61  ilename, zFilena
3c50: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50  me);.  strcpy(pP
3c60: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
3c70: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 74  zFilename);.  st
3c80: 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  rcpy(&pPager->zJ
3c90: 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c  ournal[nameLen],
3ca0: 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20   "-journal");.  
3cb0: 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b  pPager->fd = fd;
3cc0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
3cd0: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50  alOpen = 0;.  pP
3ce0: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
3cf0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
3d00: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d   = -1;.  pPager-
3d10: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
3d20: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d  ager->mxPage = m
3d30: 78 50 61 67 65 3e 35 20 3f 20 6d 78 50 61 67 65  xPage>5 ? mxPage
3d40: 20 3a 20 31 30 3b 0a 20 20 70 50 61 67 65 72 2d   : 10;.  pPager-
3d50: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
3d60: 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72  UNLOCK;.  pPager
3d70: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20  ->errMask = 0;. 
3d80: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
3d90: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
3da0: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
3db0: 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70   = readOnly;.  p
3dc0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
3dd0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
3de0: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
3df0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
3e00: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
3e10: 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 6d 65 6d   = nExtra;.  mem
3e20: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
3e30: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
3e40: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
3e50: 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
3e60: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
3e70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
3e80: 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
3e90: 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
3ea0: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
3eb0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
3ec0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
3ed0: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
3ee0: 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
3ef0: 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
3f00: 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
3f10: 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
3f20: 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
3f30: 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
3f40: 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
3f50: 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
3f60: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
3f70: 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
3f80: 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
3f90: 6c 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63  lt sqlitepager_c
3fa0: 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
3fb0: 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
3fc0: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
3fd0: 74 65 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  tepager_unref().
3fe0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70  .*/.void sqlitep
3ff0: 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63  ager_set_destruc
4000: 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  tor(Pager *pPage
4010: 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29  r, void (*xDesc)
4020: 28 76 6f 69 64 2a 29 29 7b 0a 20 20 70 50 61 67  (void*)){.  pPag
4030: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
4040: 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
4050: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
4060: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
4070: 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
4080: 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
4090: 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a  ith.** pPager..*
40a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
40b0: 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65  r_pagecount(Page
40c0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
40d0: 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t n;.  assert( p
40e0: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
40f0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
4100: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >=0 ){.    retur
4110: 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
4120: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
4130: 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  teOsFileSize(pPa
4140: 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51  ger->fd, &n)!=SQ
4150: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
4160: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
4170: 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  = PAGER_ERR_DISK
4180: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
4190: 20 20 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54    }.  n /= SQLIT
41a0: 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69  E_PAGE_SIZE;.  i
41b0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
41c0: 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20  !=SQLITE_UNLOCK 
41d0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
41e0: 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20  bSize = n;.  }. 
41f0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
4200: 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
4210: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
4220: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
4230: 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
4240: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
4250: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
4260: 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
4270: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4280: 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
4290: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
42a0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
42b0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
42c0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
42d0: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
42e0: 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
42f0: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
4300: 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
4310: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
4320: 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
4330: 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
4340: 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
4350: 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
4360: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
4370: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
4380: 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  r_close(Pager *p
4390: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
43a0: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
43b0: 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e  switch( pPager->
43c0: 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  state ){.    cas
43d0: 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  e SQLITE_WRITELO
43e0: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CK: {.      sqli
43f0: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
4400: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
4410: 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 70  sqliteOsUnlock(p
4420: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
4430: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
4440: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
4450: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
4460: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4470: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a  SQLITE_READLOCK:
4480: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f   {.      sqliteO
4490: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
44a0: 66 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  fd);.      break
44b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
44c0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
44d0: 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
44e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
44f0: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70  .  }.  for(pPg=p
4500: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
4510: 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
4520: 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
4530: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c  NextAll;.    sql
4540: 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
4550: 7d 0a 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73  }.  sqliteOsClos
4560: 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
4570: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
4580: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
4590: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
45a0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
45b0: 20 73 71 6c 69 74 65 4f 73 44 65 6c 65 74 65 28   sqliteOsDelete(
45c0: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
45d0: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
45e0: 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Free(pPager);.  
45f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4610: 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
4620: 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
4630: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
4640: 6e 6f 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70  no sqlitepager_p
4650: 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a  agenumber(void *
4660: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
4670: 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  *p = DATA_TO_PGH
4680: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  DR(pData);.  ret
4690: 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  urn p->pgno;.}..
46a0: 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
46b0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
46c0: 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
46d0: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 0a   If the page is.
46e0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  ** currently on 
46f0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68  the freelist (th
4700: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4710: 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a  t is zero) then.
4720: 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  ** remove it fro
4730: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  m the freelist..
4740: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4750: 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
4760: 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
4770: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
4780: 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
4790: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
47a0: 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
47b0: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
47c0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
47d0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
47e0: 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
47f0: 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
4800: 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ee;.    }else{. 
4810: 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
4820: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
4830: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d  pNextFree;.    }
4840: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
4850: 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20  extFree ){.     
4860: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
4870: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
4880: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
4890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
48a0: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  g->pPager->pLast
48b0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
48c0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  e;.    }.    pPg
48d0: 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
48e0: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
48f0: 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f++;.  REFINFO(p
4900: 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  Pg);.}../*.** In
4910: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
4920: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
4930: 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
4940: 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
4950: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
4960: 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
4970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
4980: 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  r_ref(void *pDat
4990: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
49a0: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
49b0: 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f  (pData);.  page_
49c0: 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
49d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
49e0: 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
49f0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 6e  journal and then
4a00: 20 77 72 69 74 65 20 61 6c 6c 20 66 72 65 65 20   write all free 
4a10: 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
4a20: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
4a30: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 69  ile..**.** Writi
4a40: 6e 67 20 61 6c 6c 20 66 72 65 65 20 64 69 72 74  ng all free dirt
4a50: 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
4a60: 61 74 61 62 61 73 65 20 61 66 74 65 72 20 74 68  atabase after th
4a70: 65 20 73 79 6e 63 20 69 73 20 61 0a 2a 2a 20 6e  e sync is a.** n
4a80: 6f 6e 2d 6f 62 76 69 6f 75 73 20 6f 70 74 69 6d  on-obvious optim
4a90: 69 7a 61 74 69 6f 6e 2e 20 20 66 73 79 6e 63 28  ization.  fsync(
4aa0: 29 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  ) is an expensiv
4ab0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 6f 20 77  e operation so w
4ac0: 65 0a 2a 2a 20 77 61 6e 74 20 74 6f 20 6d 69 6e  e.** want to min
4ad0: 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72  imize the number
4ae0: 20 74 68 61 74 20 6f 63 63 75 72 2e 20 20 53 6f   that occur.  So
4af0: 20 61 66 74 65 72 20 61 6e 20 66 73 79 6e 63 28   after an fsync(
4b00: 29 20 69 73 20 66 6f 72 63 65 64 0a 2a 2a 20 61  ) is forced.** a
4b10: 6e 64 20 77 65 20 61 72 65 20 66 72 65 65 20 74  nd we are free t
4b20: 6f 20 77 72 69 74 65 20 64 69 72 74 79 20 70 61  o write dirty pa
4b30: 67 65 73 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ges back to the 
4b40: 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
4b50: 62 65 73 74 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  best.** to go ah
4b60: 65 61 64 20 61 6e 64 20 64 6f 20 61 73 20 6d 75  ead and do as mu
4b70: 63 68 20 6f 66 20 74 68 61 74 20 61 73 20 70 6f  ch of that as po
4b80: 73 73 69 62 6c 65 20 74 6f 20 6d 69 6e 69 6d 69  ssible to minimi
4b90: 7a 65 20 74 68 65 20 63 68 61 6e 63 65 0a 2a 2a  ze the chance.**
4ba0: 20 6f 66 20 68 61 76 69 6e 67 20 74 6f 20 64 6f   of having to do
4bb0: 20 61 6e 6f 74 68 65 72 20 66 73 79 6e 63 28 29   another fsync()
4bc0: 20 6c 61 74 65 72 20 6f 6e 2e 20 20 57 72 69 74   later on.  Writ
4bd0: 69 6e 67 20 64 69 72 74 79 20 66 72 65 65 20 70  ing dirty free p
4be0: 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ages.** in this 
4bf0: 77 61 79 20 6d 61 6b 65 20 64 61 74 61 62 61 73  way make databas
4c00: 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 67 6f 20  e operations go 
4c10: 75 70 20 74 6f 20 31 30 20 74 69 6d 65 73 20 66  up to 10 times f
4c20: 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aster..*/.static
4c30: 20 69 6e 74 20 73 79 6e 63 41 6c 6c 50 61 67 65   int syncAllPage
4c40: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
4c50: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
4c60: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4c70: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
4c80: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
4c90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
4ca0: 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
4cb0: 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
4cc0: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
4cd0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
4ce0: 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66  ync = 0;.  }.  f
4cf0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
4d00: 46 69 72 73 74 3b 20 70 50 67 3b 20 70 50 67 3d  First; pPg; pPg=
4d10: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 29 7b  pPg->pNextFree){
4d20: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69  .    if( pPg->di
4d30: 72 74 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  rty ){.      sql
4d40: 69 74 65 4f 73 53 65 65 6b 28 70 50 61 67 65 72  iteOsSeek(pPager
4d50: 2d 3e 66 64 2c 20 28 70 50 67 2d 3e 70 67 6e 6f  ->fd, (pPg->pgno
4d60: 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  -1)*SQLITE_PAGE_
4d70: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63 20  SIZE);.      rc 
4d80: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28  = sqliteOsWrite(
4d90: 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
4da0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
4db0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
4dc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
4dd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
4de0: 61 6b 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  ak;.      pPg->d
4df0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irty = 0;.    }.
4e00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
4e20: 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
4e30: 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
4e40: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
4e50: 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
4e60: 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
4e70: 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
4e80: 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
4e90: 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
4ea0: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
4eb0: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  leased..**.** A 
4ec0: 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61  _get works for a
4ed0: 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
4ee0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
4ef0: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
4f00: 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
4f10: 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
4f20: 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
4f30: 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
4f40: 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
4f50: 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
4f60: 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
4f70: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
4f80: 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
4f90: 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
4fa0: 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
4fb0: 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
4fc0: 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
4fd0: 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
4fe0: 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
4ff0: 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
5000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
5010: 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
5020: 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
5030: 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
5040: 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
5050: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
5060: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
5070: 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
5080: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
5090: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
50a0: 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e  epager_lookup().
50b0: 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
50c0: 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28  ine and _lookup(
50d0: 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
50e0: 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
50f0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
5100: 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
5110: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
5120: 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
5130: 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
5140: 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
5150: 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
5160: 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a  eas _lookup().**
5170: 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
5180: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
5190: 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
51a0: 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
51b0: 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
51c0: 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
51d0: 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
51e0: 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
51f0: 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
5200: 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75  .** Since _looku
5210: 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
5220: 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
5230: 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
5240: 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
5250: 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
5260: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
5270: 67 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  get(Pager *pPage
5280: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
5290: 69 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20  id **ppPage){.  
52a0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
52b0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
52c0: 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
52d0: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
52e0: 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 50 61  .  */ .  if( pPa
52f0: 67 65 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  ger==0 || pgno==
5300: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5310: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5320: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
5330: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
5340: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
5350: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
5360: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
5370: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
5380: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
5390: 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
53a0: 68 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c  hen get a read l
53b0: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
53c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
53d0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
53e0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
53f0: 20 69 66 28 20 73 71 6c 69 74 65 4f 73 4c 6f 63   if( sqliteOsLoc
5400: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29  k(pPager->fd, 0)
5410: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5420: 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
5430: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
5440: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
5450: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
5460: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41  ate = SQLITE_REA
5470: 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20 2f 2a 20 49  DLOCK;..    /* I
5480: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
5490: 20 65 78 69 73 74 73 2c 20 74 72 79 20 74 6f 20   exists, try to 
54a0: 70 6c 61 79 20 69 74 20 62 61 63 6b 2e 0a 20 20  play it back..  
54b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
54c0: 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73 28  iteOsFileExists(
54d0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
54e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20  ) ){.       int 
54f0: 72 63 2c 20 64 75 6d 6d 79 3b 0a 0a 20 20 20 20  rc, dummy;..    
5500: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
5510: 6f 75 72 6e 61 6c 20 66 6f 72 20 65 78 63 6c 75  ournal for exclu
5520: 73 69 76 65 20 61 63 63 65 73 73 2e 20 20 52 65  sive access.  Re
5530: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5540: 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65   if.       ** we
5550: 20 63 61 6e 6e 6f 74 20 67 65 74 20 65 78 63 6c   cannot get excl
5560: 75 73 69 76 65 20 61 63 63 65 73 73 20 74 6f 20  usive access to 
5570: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5580: 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  . .       **.   
5590: 20 20 20 20 2a 2a 20 45 76 65 6e 20 74 68 6f 75      ** Even thou
55a0: 67 68 20 77 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  gh we will only 
55b0: 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
55c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74  the journal, not
55d0: 20 77 72 69 74 69 6e 67 2c 0a 20 20 20 20 20 20   writing,.      
55e0: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 6f   ** we have to o
55f0: 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
5600: 66 6f 72 20 77 72 69 74 69 6e 67 20 69 6e 20 6f  for writing in o
5610: 72 64 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 61  rder to obtain a
5620: 6e 0a 20 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  n.       ** excl
5630: 75 73 69 76 65 20 61 63 63 65 73 73 20 6c 6f 63  usive access loc
5640: 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  k..       */.   
5650: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
5660: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 70  sOpenReadWrite(p
5670: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
5680: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26   &pPager->jfd, &
5690: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 69  dummy);.       i
56a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
56b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 50 61   ){.         pPa
56c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
56d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 7d 0a 20   = 1;.       }. 
56e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
56f0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
5700: 65 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  eOsLock(pPager->
5710: 6a 66 64 2c 20 31 29 21 3d 53 51 4c 49 54 45 5f  jfd, 1)!=SQLITE_
5720: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69  OK ){.         i
5730: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
5740: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
5750: 20 20 20 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f       sqliteOsClo
5760: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
5770: 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67  .           pPag
5780: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
5790: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a  = 0;.         }.
57a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4f           sqliteO
57b0: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
57c0: 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 2a 70  fd);.         *p
57d0: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
57e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
57f0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d  E_BUSY;.       }
5800: 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ..       /* Get 
5810: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
5820: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
5830: 20 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 55         sqliteOsU
5840: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
5850: 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 73 71  );.       if( sq
5860: 6c 69 74 65 4f 73 4c 6f 63 6b 28 70 50 61 67 65  liteOsLock(pPage
5870: 72 2d 3e 66 64 2c 20 31 29 21 3d 53 51 4c 49 54  r->fd, 1)!=SQLIT
5880: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
5890: 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 70   sqliteOsClose(p
58a0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
58b0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
58c0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
58d0: 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
58e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 72 65  = 0;.         re
58f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 52 4f 54  turn SQLITE_PROT
5900: 4f 43 4f 4c 3b 0a 20 20 20 20 20 20 20 7d 0a 20  OCOL;.       }. 
5910: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
5920: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57 52 49  ate = SQLITE_WRI
5930: 54 45 4c 4f 43 4b 3b 0a 0a 20 20 20 20 20 20 20  TELOCK;..       
5940: 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
5950: 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
5960: 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
5970: 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
5980: 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
5990: 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
59a0: 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
59b0: 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70  */.       rc = p
59c0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
59d0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66  ager);.       if
59e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
59f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  ){.         retu
5a00: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a  rn rc;.       }.
5a10: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
5a20: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
5a30: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61  /* Search for pa
5a40: 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ge in cache */. 
5a50: 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c     pPg = pager_l
5a60: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
5a70: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  no);.  }.  if( p
5a80: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
5a90: 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
5aa0: 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
5ab0: 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
5ac0: 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70      int h;.    p
5ad0: 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a  Pager->nMiss++;.
5ae0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
5af0: 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
5b00: 50 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Page || pPager->
5b10: 70 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pFirst==0 ){.   
5b20: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
5b30: 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ew page */.     
5b40: 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
5b50: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 67  loc( sizeof(*pPg
5b60: 29 20 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ) + SQLITE_PAGE_
5b70: 53 49 5a 45 20 2b 20 70 50 61 67 65 72 2d 3e 6e  SIZE + pPager->n
5b80: 45 78 74 72 61 20 29 3b 0a 20 20 20 20 20 20 69  Extra );.      i
5b90: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
5ba0: 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
5bb0: 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  ;.        pager_
5bc0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
5bd0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
5be0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
5bf0: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20  PAGER_ERR_MEM;. 
5c00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
5c10: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5c20: 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
5c30: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
5c40: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
5c50: 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
5c60: 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ll;.      if( pP
5c70: 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
5c80: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
5c90: 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 70  ll->pPrevAll = p
5ca0: 50 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Pg;.      }.    
5cb0: 20 20 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c 20    pPg->pPrevAll 
5cc0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
5cd0: 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  r->pAll = pPg;. 
5ce0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
5cf0: 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ge++;.    }else{
5d00: 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 79 63 6c  .      /* Recycl
5d10: 65 20 61 6e 20 6f 6c 64 65 72 20 70 61 67 65 2e  e an older page.
5d20: 20 20 46 69 72 73 74 20 6c 6f 63 61 74 65 20 74    First locate t
5d30: 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 72 65  he page to be re
5d40: 63 79 63 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  cycled..      **
5d50: 20 54 72 79 20 74 6f 20 66 69 6e 64 20 6f 6e 65   Try to find one
5d60: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 64 69 72   that is not dir
5d70: 74 79 20 61 6e 64 20 69 73 20 6e 65 61 72 20 74  ty and is near t
5d80: 68 65 20 68 65 61 64 20 6f 66 0a 20 20 20 20 20  he head of.     
5d90: 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65 20   ** of the free 
5da0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  list */.      in
5db0: 74 20 63 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e  t cnt = pPager->
5dc0: 6d 78 50 61 67 65 2f 32 3b 0a 20 20 20 20 20 20  mxPage/2;.      
5dd0: 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
5de0: 69 72 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c  irst;.      whil
5df0: 65 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26  e( pPg->dirty &&
5e00: 20 30 3c 63 6e 74 2d 2d 20 26 26 20 70 50 67 2d   0<cnt-- && pPg-
5e10: 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
5e20: 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
5e30: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
5e40: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
5e50: 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69   we could not fi
5e60: 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20 68  nd a page that h
5e70: 61 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65 64  as not been used
5e80: 20 72 65 63 65 6e 74 6c 79 0a 20 20 20 20 20 20   recently.      
5e90: 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 69 73 20  ** and which is 
5ea0: 6e 6f 74 20 64 69 72 74 79 2c 20 74 68 65 6e 20  not dirty, then 
5eb0: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
5ec0: 20 61 6e 64 20 77 72 69 74 65 20 61 6c 6c 0a 20   and write all. 
5ed0: 20 20 20 20 20 2a 2a 20 64 69 72 74 79 20 66 72       ** dirty fr
5ee0: 65 65 20 70 61 67 65 73 20 69 6e 74 6f 20 74 68  ee pages into th
5ef0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
5f00: 20 74 68 75 73 20 6d 61 6b 69 6e 67 20 74 68 65   thus making the
5f10: 6d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  m.      ** clean
5f20: 20 70 61 67 65 73 20 61 6e 64 20 61 76 61 69 6c   pages and avail
5f30: 61 62 6c 65 20 66 6f 72 20 72 65 63 79 63 6c 69  able for recycli
5f40: 6e 67 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ng..      **.   
5f50: 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f     ** We have to
5f60: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
5f70: 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  l before writing
5f80: 20 61 20 70 61 67 65 20 74 6f 20 74 68 65 20 6d   a page to the m
5f90: 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  ain.      ** dat
5fa0: 61 62 61 73 65 2e 20 20 42 75 74 20 73 79 6e 63  abase.  But sync
5fb0: 69 6e 67 20 69 73 20 61 20 76 65 72 79 20 73 6c  ing is a very sl
5fc0: 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ow operation.  S
5fd0: 6f 20 61 66 74 65 72 20 61 0a 20 20 20 20 20 20  o after a.      
5fe0: 2a 2a 20 73 79 6e 63 2c 20 69 74 20 69 73 20 62  ** sync, it is b
5ff0: 65 73 74 20 74 6f 20 77 72 69 74 65 20 65 76 65  est to write eve
6000: 72 79 74 68 69 6e 67 20 77 65 20 63 61 6e 20 62  rything we can b
6010: 61 63 6b 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a  ack to the main.
6020: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
6030: 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  e to minimize th
6040: 65 20 72 69 73 6b 20 6f 66 20 68 61 76 69 6e 67  e risk of having
6050: 20 74 6f 20 73 79 6e 63 20 61 67 61 69 6e 20 69   to sync again i
6060: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  n the.      ** n
6070: 65 61 72 20 66 75 74 75 72 65 2e 20 20 54 68 61  ear future.  Tha
6080: 74 20 69 73 20 77 61 79 20 77 65 20 77 72 69 74  t is way we writ
6090: 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
60a0: 73 20 61 66 74 65 72 20 61 0a 20 20 20 20 20 20  s after a.      
60b0: 2a 2a 20 73 79 6e 63 2e 0a 20 20 20 20 20 20 2a  ** sync..      *
60c0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  /.      if( pPg=
60d0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79  =0 || pPg->dirty
60e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
60f0: 72 63 20 3d 20 73 79 6e 63 41 6c 6c 50 61 67 65  rc = syncAllPage
6100: 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  s(pPager);.     
6110: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
6120: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6130: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
6140: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
6150: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
6160: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6170: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
6180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6190: 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
61a0: 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  irst;.      }.  
61b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
61c0: 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
61d0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
61e0: 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  irty==0 );..    
61f0: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
6200: 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68  old page from th
6210: 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20  e free list and 
6220: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20  the hash table. 
6230: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
6240: 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
6250: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
6260: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
6270: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
6280: 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 65  xtFree;.      }e
6290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
62a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
62b0: 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rst==pPg );.    
62c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
62d0: 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
62e0: 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ree;.      }.   
62f0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
6300: 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  tFree ){.       
6310: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
6320: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
6330: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
6340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6350: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
6360: 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
6370: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
6380: 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
6390: 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a  evFree;.      }.
63a0: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
63b0: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
63c0: 76 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  vFree = 0;.     
63d0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
63e0: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ash ){.        p
63f0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
6400: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
6410: 70 50 72 65 76 48 61 73 68 3b 0a 20 20 20 20 20  pPrevHash;.     
6420: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
6430: 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
6440: 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65         pPg->pPre
6450: 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
6460: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
6470: 68 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  h;.      }else{.
6480: 20 20 20 20 20 20 20 20 68 20 3d 20 70 61 67 65          h = page
6490: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
64a0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
64b0: 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
64c0: 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  [h]==pPg );.    
64d0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
64e0: 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
64f0: 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  tHash;.      }. 
6500: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
6510: 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
6520: 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
6530: 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b  pPager->nOvfl++;
6540: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
6550: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
6560: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
6570: 4a 6f 75 72 6e 61 6c 20 26 26 20 70 67 6e 6f 3c  Journal && pgno<
6580: 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
6590: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ize ){.      pPg
65a0: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
65b0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
65c0: 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
65d0: 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
65e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
65f0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
6600: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
6610: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
6620: 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
6630: 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
6640: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
6650: 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70  Ref++;.    h = p
6660: 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b  ager_hash(pgno);
6670: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
6680: 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
6690: 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67  ash[h];.    pPag
66a0: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
66b0: 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
66c0: 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
66d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
66e0: 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
66f0: 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
6700: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
6710: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
6720: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
6730: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
6740: 30 20 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f  0 ) sqlitepager_
6750: 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
6760: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
6770: 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 29  r->dbSize<pgno )
6780: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
6790: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
67a0: 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  ), 0, SQLITE_PAG
67b0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c  E_SIZE);.    }el
67c0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  se{.      int rc
67d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73  ;.      sqliteOs
67e0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
67f0: 20 28 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45   (pgno-1)*SQLITE
6800: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
6810: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
6820: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
6830: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
6840: 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  Pg), SQLITE_PAGE
6850: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66  _SIZE);.      if
6860: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6870: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
6880: 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
6890: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
68a0: 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
68b0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
68c0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29  DR_TO_EXTRA(pPg)
68d0: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
68e0: 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  tra);.    }.  }e
68f0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
6900: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
6910: 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
6920: 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  che. */.    pPag
6930: 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20  er->nHit++;.    
6940: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
6950: 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50   }.  *ppPage = P
6960: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
6970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6980: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6990: 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
69a0: 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
69b0: 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
69c0: 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
69d0: 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
69e0: 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
69f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
6a00: 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
6a10: 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
6a20: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a  s not in cache..
6a30: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
6a40: 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29  qlitepager_get()
6a50: 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
6a60: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
6a70: 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
6a80: 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29 20  litepager_get() 
6a90: 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
6aa0: 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
6ab0: 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
6ac0: 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
6ad0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
6ae0: 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
6af0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
6b00: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
6b10: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
6b20: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
6b30: 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
6b40: 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
6b50: 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ppened..*/.void 
6b60: 2a 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f  *sqlitepager_loo
6b70: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
6b80: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
6b90: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
6ba0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
6bb0: 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79  have not hit any
6bc0: 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73   critical errors
6bd0: 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 50  ..  */ .  if( pP
6be0: 61 67 65 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  ager==0 || pgno=
6bf0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6c00: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
6c10: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
6c20: 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
6c30: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
6c40: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
6c50: 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ger->nRef==0 ){.
6c60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6c70: 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
6c80: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
6c90: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
6ca0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
6cb0: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
6cc0: 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54    return PGHDR_T
6cd0: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a  O_DATA(pPg);.}..
6ce0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
6cf0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
6d00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
6d10: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
6d20: 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
6d30: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
6d40: 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
6d50: 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
6d60: 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
6d70: 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
6d80: 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
6d90: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
6da0: 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
6db0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
6dc0: 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
6dd0: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
6de0: 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  _unref(void *pDa
6df0: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
6e00: 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  g;..  /* Decreme
6e10: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
6e20: 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
6e30: 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20  page.  */.  pPg 
6e40: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
6e50: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
6e60: 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
6e70: 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
6e80: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
6e90: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
6ea0: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
6eb0: 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
6ec0: 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
6ed0: 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
6ee0: 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
6ef0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
6f00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
6f10: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
6f20: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
6f30: 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
6f40: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
6f50: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30  g->pNextFree = 0
6f60: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
6f70: 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Free = pPager->p
6f80: 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Last;.    pPager
6f90: 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20  ->pLast = pPg;. 
6fa0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
6fb0: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
6fc0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
6fd0: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a  NextFree = pPg;.
6fe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6ff0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
7000: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
7010: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
7020: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
7030: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
7040: 75 63 74 6f 72 28 70 44 61 74 61 29 3b 0a 20 20  uctor(pData);.  
7050: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
7060: 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
7070: 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
7080: 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
7090: 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
70a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
70b0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
70c0: 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
70d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
70e0: 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
70f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
7100: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  f==0 ){.      pa
7110: 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
7120: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
7130: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
7150: 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
7160: 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
7170: 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
7180: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
7190: 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
71a0: 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
71b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
71c0: 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
71d0: 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
71e0: 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
71f0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
7200: 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
7210: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
7220: 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
7230: 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
7240: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 77  and acquires a w
7250: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
7260: 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
7270: 68 65 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b  he write.** lock
7280: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
7290: 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
72a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
72b0: 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
72c0: 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
72d0: 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
72e0: 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
72f0: 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
7300: 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
7310: 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
7320: 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
7330: 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
7340: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
7350: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7360: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
7370: 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
7380: 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
7390: 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
73a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
73b0: 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
73c0: 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
73d0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
73e0: 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
73f0: 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
7400: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
7410: 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
7420: 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
7430: 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74  litepager_commit
7440: 28 29 20 6f 72 20 73 71 6c 69 74 65 70 61 67 65  () or sqlitepage
7450: 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  r_rollback() to.
7460: 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74  ** reset..*/.int
7470: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69   sqlitepager_wri
7480: 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  te(void *pData){
7490: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
74a0: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
74b0: 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
74c0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
74d0: 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
74e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
74f0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
7500: 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  k ){ .    return
7510: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
7520: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
7530: 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
7540: 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
7550: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
7560: 7d 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  }.  pPg->dirty =
7570: 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69   1;.  if( pPg->i
7580: 6e 4a 6f 75 72 6e 61 6c 20 29 7b 20 72 65 74 75  nJournal ){ retu
7590: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a  rn SQLITE_OK; }.
75a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
75b0: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
75c0: 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
75d0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53  pPager->state==S
75e0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 29  QLITE_READLOCK )
75f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7600: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
7610: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
7620: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
7630: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
7640: 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
7650: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50   1 );.    if( pP
7660: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
7670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
7680: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
7690: 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  aInJournal);.   
76a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
76b0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
76c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f    rc = sqliteOsO
76d0: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61  penExclusive(pPa
76e0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
76f0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
7700: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7710: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
7720: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
7730: 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  aInJournal);.   
7740: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7750: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
7760: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
7770: 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
7780: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
7790: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  nc = 0;.    if( 
77a0: 73 71 6c 69 74 65 4f 73 4c 6f 63 6b 28 70 50 61  sqliteOsLock(pPa
77b0: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 21 3d 53 51  ger->jfd, 1)!=SQ
77c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
77d0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
77e0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
77f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 43  .      sqliteOsC
7800: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
7810: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f  );.      sqliteO
7820: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
7830: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  zJournal);.     
7840: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7850: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
7860: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
7870: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  SY;.    }.    sq
7880: 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  liteOsUnlock(pPa
7890: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66  ger->fd);.    if
78a0: 28 20 73 71 6c 69 74 65 4f 73 4c 6f 63 6b 28 70  ( sqliteOsLock(p
78b0: 50 61 67 65 72 2d 3e 66 64 2c 20 31 29 21 3d 53  Pager->fd, 1)!=S
78c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
78d0: 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b    sqliteOsUnlock
78e0: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
78f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
7900: 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
7910: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7920: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
7930: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
7940: 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28    sqliteOsClose(
7950: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
7960: 20 20 20 20 73 71 6c 69 74 65 4f 73 44 65 6c 65      sqliteOsDele
7970: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
7980: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 67  nal);.      pPag
7990: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
79a0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
79b0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  c ){.        pPa
79c0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
79d0: 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ITE_UNLOCK;.    
79e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
79f0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
7a00: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 72  _LOCK;.        r
7a10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 52 4f  eturn SQLITE_PRO
7a20: 54 4f 43 4f 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  TOCOL;.      }el
7a30: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67  se{.        pPag
7a40: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
7a50: 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 20  TE_READLOCK;.   
7a60: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7a70: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d  TE_BUSY;.      }
7a80: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
7a90: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
7aa0: 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20  E_WRITELOCK;.   
7ab0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67   sqlitepager_pag
7ac0: 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
7ad0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
7ae0: 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
7af0: 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  >dbSize;.    rc 
7b00: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28  = sqliteOsWrite(
7b10: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
7b20: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7b30: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b40: 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ));.    if( rc==
7b50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7b60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
7b70: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
7b80: 64 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  d, &pPager->dbSi
7b90: 7a 65 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ze, sizeof(Pgno)
7ba0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7bb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7bc0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
7bd0: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
7be0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
7bf0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7c00: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55  ) rc = SQLITE_FU
7c10: 4c 4c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  LL;.      return
7c20: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
7c30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7c40: 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57  >state==SQLITE_W
7c50: 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RITELOCK );.  as
7c60: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
7c70: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 69  urnalOpen );.  i
7c80: 66 28 20 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  f( pPg->pgno <= 
7c90: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
7ca0: 7a 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ze ){.    rc = s
7cb0: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 70 50 61  qliteOsWrite(pPa
7cc0: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 67 2d 3e  ger->jfd, &pPg->
7cd0: 70 67 6e 6f 2c 20 73 69 7a 65 6f 66 28 50 67 6e  pgno, sizeof(Pgn
7ce0: 6f 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  o));.    if( rc=
7cf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7d00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
7d10: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
7d20: 66 64 2c 20 70 44 61 74 61 2c 20 53 51 4c 49 54  fd, pData, SQLIT
7d30: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
7d40: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
7d50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7d60: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72     sqlitepager_r
7d70: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
7d80: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
7d90: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
7da0: 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
7db0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
7dc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
7dd0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
7de0: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
7df0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
7e00: 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
7e10: 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
7e20: 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
7e30: 79 6e 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  ync = 1;.  }.  p
7e40: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
7e50: 31 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  1;.  if( pPager-
7e60: 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e  >dbSize<pPg->pgn
7e70: 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
7e80: 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
7e90: 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
7ea0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
7eb0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
7ec0: 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
7ed0: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
7ee0: 20 70 72 65 76 69 6f 75 73 20 70 61 73 73 65 64   previous passed
7ef0: 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 70 61 67  .** to sqlitepag
7f00: 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20  er_write().  In 
7f10: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
7f20: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
7f30: 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
7f40: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
7f50: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e   the page..*/.in
7f60: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73  t sqlitepager_is
7f70: 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a  writeable(void *
7f80: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
7f90: 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
7fa0: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72  GHDR(pData);.  r
7fb0: 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
7fc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
7fd0: 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
7fe0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
7ff0: 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
8000: 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
8010: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
8020: 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
8030: 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
8040: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
8050: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
8060: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
8070: 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
8080: 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
8090: 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
80a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
80b0: 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65  ager_commit(Page
80c0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
80d0: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
80e0: 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
80f0: 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45  r->errMask==PAGE
8100: 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
8110: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
8120: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
8130: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
8140: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
8150: 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
8160: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8170: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
8180: 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
8190: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
81a0: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
81b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
81c0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
81d0: 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49  tate!=SQLITE_WRI
81e0: 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  TELOCK ){.    re
81f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
8200: 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
8210: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8220: 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 70 50  Open );.  if( pP
8230: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 26  ager->needSync &
8240: 26 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 70  & sqliteOsSync(p
8250: 50 61 67 65 72 2d 3e 6a 66 64 29 21 3d 53 51 4c  Pager->jfd)!=SQL
8260: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
8270: 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
8280: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70  .  }.  for(pPg=p
8290: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
82a0: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
82b0: 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50  All){.    if( pP
82c0: 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 20 63 6f  g->dirty==0 ) co
82d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d  ntinue;.    rc =
82e0: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 70 50   sqliteOsSeek(pP
82f0: 61 67 65 72 2d 3e 66 64 2c 20 28 70 50 67 2d 3e  ager->fd, (pPg->
8300: 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50  pgno-1)*SQLITE_P
8310: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69  AGE_SIZE);.    i
8320: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8330: 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61   ) goto commit_a
8340: 62 6f 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 73  bort;.    rc = s
8350: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 70 50 61  qliteOsWrite(pPa
8360: 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
8370: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c  O_DATA(pPg), SQL
8380: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
8390: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
83a0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
83b0: 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
83c0: 20 69 66 28 20 73 71 6c 69 74 65 4f 73 53 79 6e   if( sqliteOsSyn
83d0: 63 28 70 50 61 67 65 72 2d 3e 66 64 29 21 3d 53  c(pPager->fd)!=S
83e0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
83f0: 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
8400: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
8410: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
8420: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
8430: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
8440: 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  rc;..  /* Jump h
8450: 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ere if anything 
8460: 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e  goes wrong durin
8470: 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
8480: 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69  cess..  */.commi
8490: 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20  t_abort:.  rc = 
84a0: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
84b0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
84c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
84d0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  K ){.    rc = SQ
84e0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
84f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8500: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
8510: 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20  l changes.  The 
8520: 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
8530: 61 63 6b 20 74 6f 20 72 65 61 64 2d 6f 6e 6c 79  ack to read-only
8540: 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
8550: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
8560: 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
8570: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
8580: 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
8590: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
85a0: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
85b0: 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
85c0: 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
85d0: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
85e0: 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
85f0: 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
8600: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
8610: 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   (SQLITE_PROTOCO
8620: 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  L) or unless som
8630: 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
8640: 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
8650: 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
8660: 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
8670: 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
8680: 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
8690: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
86a0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
86b0: 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
86c0: 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
86d0: 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
86e0: 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
86f0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
8700: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
8710: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
8720: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
8730: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
8740: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
8750: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
8760: 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72  ask!=0 && pPager
8770: 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52  ->errMask!=PAGER
8780: 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  _ERR_FULL ){.   
8790: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
87a0: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
87b0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
87c0: 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57  >state!=SQLITE_W
87d0: 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RITELOCK ){.    
87e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
87f0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67  ;.  }.  rc = pag
8800: 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
8810: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
8820: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8830: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
8840: 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  UPT;.    pPager-
8850: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
8860: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
8870: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53   }.  pPager->dbS
8880: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
8890: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
88a0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
88b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
88c0: 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
88d0: 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
88e0: 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
88f0: 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
8900: 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
8910: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
8920: 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61  er_isreadonly(Pa
8930: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
8940: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
8950: 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
8960: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8970: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
8980: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
8990: 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
89a0: 6c 69 74 65 70 61 67 65 72 5f 73 74 61 74 73 28  litepager_stats(
89b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
89c0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39    static int a[9
89d0: 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
89e0: 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
89f0: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
8a00: 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
8a10: 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
8a20: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
8a30: 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
8a40: 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
8a50: 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
8a60: 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Mask;.  a[6] = p
8a70: 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
8a80: 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
8a90: 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50  iss;.  a[8] = pP
8aa0: 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72  ager->nOvfl;.  r
8ab0: 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 23 69 66 20  eturn a;.}..#if 
8ac0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
8ad0: 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
8ae0: 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
8af0: 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
8b00: 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
8b10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67  /.void sqlitepag
8b20: 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72  er_refdump(Pager
8b30: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
8b40: 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
8b50: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
8b60: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
8b70: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
8b80: 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
8b90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
8ba0: 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
8bb0: 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66  addr=0x%08x nRef
8bc0: 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
8bd0: 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29  pPg->pgno, (int)
8be0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
8bf0: 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a  g), pPg->nRef);.
8c00: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a             }.}.#endif.