/ Hex Artifact Content
Login

Artifact baf50d8308c61d079086f532c70155cd22c6d07a:


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 35 34  : pager.c,v 1.54
0350: 20 32 30 30 32 2f 31 31 2f 30 35 20 32 33 3a 30   2002/11/05 23:0
0360: 33 3a 30 33 20 64 72 68 20 45 78 70 20 24 0a 2a  3:03 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0380: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
0390: 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e 63  e "pager.h".#inc
03a0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
03b0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
03c0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
03d0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  .h>../*.** The p
03e0: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
03f0: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0400: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0410: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0420: 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  :.**.**   SQLITE
0430: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 54 68  _UNLOCK       Th
0440: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0450: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
0460: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0490: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
04a0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
04d0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
04e0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0500: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0510: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 52 45 41  .**   SQLITE_REA
0520: 44 4c 4f 43 4b 20 20 20 20 20 54 68 65 20 70 61  DLOCK     The pa
0530: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0540: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0550: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0560: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0570: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0580: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0590: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
05b0: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
05c0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
05d0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0600: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0610: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0620: 4b 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61  K    The page ca
0630: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0640: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0670: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0680: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0690: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
06a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
06b0: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
06c0: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
06d0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0700: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
0710: 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20 75  ge cache comes u
0720: 70 20 69 6e 20 53 51 4c 49 54 45 5f 55 4e 4c 4f  p in SQLITE_UNLO
0730: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0740: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 5f  ime a.** sqlite_
0750: 70 61 67 65 5f 67 65 74 28 29 20 6f 63 63 75 72  page_get() occur
0760: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0770: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53 51 4c 49  nsitions to SQLI
0780: 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2a 20  TE_READLOCK..** 
0790: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
07a0: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
07b0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
07c0: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
07d0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
07e0: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 53  itions back to S
07f0: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54  QLITE_UNLOCK.  T
0800: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0810: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0820: 65 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c  e_write() is cal
0830: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0840: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0850: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0860: 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  K.  (Note that s
0870: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0880: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0890: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
08a0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
08b0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
08c0: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
08d0: 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49 54 45 5f  ** be in SQLITE_
08e0: 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f 72 65 20  READLOCK before 
08f0: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0900: 6f 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  o SQLITE_WRITELO
0910: 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73 71 6c 69  CK.).** The sqli
0920: 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62 61 63 6b  te_page_rollback
0930: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 5f 70 61  () and sqlite_pa
0940: 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66 75 6e 63  ge_commit() func
0950: 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61 6e 73 69  tions .** transi
0960: 74 69 6f 6e 20 74 68 65 20 73 74 61 74 65 20 66  tion the state f
0970: 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52 49 54 45  rom SQLITE_WRITE
0980: 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20 53 51 4c  LOCK back to SQL
0990: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2f  ITE_READLOCK..*/
09a0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
09b0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64  UNLOCK      0.#d
09c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 45 41  efine SQLITE_REA
09d0: 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64 65 66 69  DLOCK    1.#defi
09e0: 6e 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  ne SQLITE_WRITEL
09f0: 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a 2a 2a 20  OCK   2.../*.** 
0a00: 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  Each in-memory i
0a10: 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62  mage of a page b
0a20: 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66  egins with the f
0a30: 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e  ollowing header.
0a40: 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20  .** This header 
0a50: 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20  is only visible 
0a60: 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f  to this pager mo
0a70: 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e  dule.  The clien
0a80: 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63  t.** code that c
0a90: 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20  alls pager sees 
0aa0: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68  only the data th
0ab0: 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68  at follows the h
0ac0: 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  eader..*/.typede
0ad0: 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50  f struct PgHdr P
0ae0: 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48  gHdr;.struct PgH
0af0: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
0b00: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
0b10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
0b20: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
0b30: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
0b40: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b60: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
0b70: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
0b80: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
0b90: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
0ba0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
0bb0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
0bc0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
0bd0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
0c00: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
0c10: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
0c20: 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46  extFree, *pPrevF
0c30: 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73  ree;  /* Freelis
0c40: 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65  t of pages where
0c50: 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67   nRef==0 */.  Pg
0c60: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 2c 20 2a  Hdr *pNextAll, *
0c70: 70 50 72 65 76 41 6c 6c 3b 20 20 20 20 2f 2a 20  pPrevAll;    /* 
0c80: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
0c90: 67 65 73 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f  ges */.  u8 inJo
0ca0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
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 75 38 20 69 6e 43 6b 70 74 3b 20 20  /.  u8 inCkpt;  
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 72     /* TRUE if wr
0d10: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 68 65  itten to the che
0d20: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
0d30: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20  */.  u8 dirty;  
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77      /* TRUE if w
0d60: 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  e need to write 
0d70: 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a  back changes */.
0d80: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
0d90: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ack;            
0da0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74   /* Disable dont
0db0: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
0dc0: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 2f  this page */.  /
0dd0: 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  * SQLITE_PAGE_SI
0de0: 5a 45 20 62 79 74 65 73 20 6f 66 20 70 61 67 65  ZE bytes of page
0df0: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69   data follow thi
0e00: 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a  s header */.  /*
0e10: 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
0e20: 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74  tes of local dat
0e30: 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67  a follow the pag
0e40: 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e data */.};../*
0e50: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f  .** Convert a po
0e60: 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72  inter to a PgHdr
0e70: 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
0e80: 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61  to its data.** a
0e90: 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a  nd back again..*
0ea0: 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  /.#define PGHDR_
0eb0: 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f  TO_DATA(P)  ((vo
0ec0: 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23  id*)(&(P)[1])).#
0ed0: 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50  define DATA_TO_P
0ee0: 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48  GHDR(D)  (&((PgH
0ef0: 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64  dr*)(D))[-1]).#d
0f00: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45  efine PGHDR_TO_E
0f10: 58 54 52 41 28 50 29 20 28 28 76 6f 69 64 2a 29  XTRA(P) ((void*)
0f20: 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31  &((char*)(&(P)[1
0f30: 5d 29 29 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f  ]))[SQLITE_PAGE_
0f40: 53 49 5a 45 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f  SIZE])../*.** Ho
0f50: 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68  w big to make th
0f60: 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65  e hash table use
0f70: 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69  d for locating i
0f80: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a  n-memory pages.*
0f90: 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  * by page number
0fa0: 2e 20 20 4b 6e 75 74 68 20 73 61 79 73 20 74 68  .  Knuth says th
0fb0: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 61 20 70  is should be a p
0fc0: 72 69 6d 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  rime number..*/.
0fd0: 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53  #define N_PG_HAS
0fe0: 48 20 32 30 30 33 0a 0a 2f 2a 0a 2a 2a 20 41 20  H 2003../*.** A 
0ff0: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
1000: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
1010: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1020: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
1030: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63  ruct Pager {.  c
1040: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
1050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1060: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1070: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
1080: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
1090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
10a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10b0: 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  file */.  OsFile
10c0: 20 66 64 2c 20 6a 66 64 3b 20 20 20 20 20 20 20   fd, jfd;       
10d0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
10e0: 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61  scriptors for da
10f0: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
1100: 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 63  al */.  OsFile c
1110: 70 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  pfd;            
1120: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
1130: 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 63  riptor for the c
1140: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
1150: 6c 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  l */.  int dbSiz
1160: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1170: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1180: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
1190: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
11a0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
11b0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
11c0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
11d0: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
11e0: 63 6b 70 74 53 69 7a 65 3b 20 20 20 20 20 20 20  ckptSize;       
11f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1200: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  of database (in 
1210: 70 61 67 65 73 29 20 61 74 20 63 6b 70 74 5f 62  pages) at ckpt_b
1220: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 6f 66 66 5f  egin() */.  off_
1230: 74 20 63 6b 70 74 4a 53 69 7a 65 3b 20 20 20 20  t ckptJSize;    
1240: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1250: 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 63 6b  of journal at ck
1260: 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  pt_begin() */.  
1270: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
1280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1290: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
12a0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
12b0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76  mory page */.  v
12c0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
12d0: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61  r)(void*); /* Ca
12e0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
12f0: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
1300: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  es */.  int nPag
1310: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1320: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1330: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
1340: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1350: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1360: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1370: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
1380: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
1390: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
13a0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
13b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
13c0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
13d0: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
13e0: 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69  che */.  int nHi
13f0: 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b  t, nMiss, nOvfl;
1400: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
1410: 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64  ts, missing, and
1420: 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a   LRU overflows *
1430: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
1440: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
1450: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
1460: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
1470: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
1480: 20 20 75 38 20 63 6b 70 74 4f 70 65 6e 3b 20 20    u8 ckptOpen;  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a0: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 68 65   True if the che
14b0: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
14c0: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
14d0: 63 6b 70 74 49 6e 55 73 65 3b 20 20 20 20 20 20  ckptInUse;      
14e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14f0: 20 77 65 20 61 72 65 20 69 6e 20 61 20 63 68 65   we are in a che
1500: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20  ckpoint */.  u8 
1510: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
1520: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
1530: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
1540: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
1550: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1570: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f  SQLITE_UNLOCK, _
1580: 52 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49  READLOCK or _WRI
1590: 54 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 38 20 65  TELOCK */.  u8 e
15a0: 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rrMask;         
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
15c0: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
15d0: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75  of errors */.  u
15e0: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
15f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
1600: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
1610: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
1620: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1640: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
1650: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
1660: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1680: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79  * True if an fsy
1690: 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f  nc() is needed o
16a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
16b0: 0a 20 20 75 38 20 64 69 72 74 79 46 69 6c 65 3b  .  u8 dirtyFile;
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16d0: 2a 20 54 72 75 65 20 69 66 20 64 61 74 61 62 61  * True if databa
16e0: 73 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  se file has chan
16f0: 67 65 64 20 69 6e 20 61 6e 79 20 77 61 79 20 2a  ged in any way *
1700: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1710: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1720: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1730: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  rollback() for a
1740: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
1750: 20 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 3b 20   journalFormat; 
1760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72            /* Ver
1770: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74  sion number of t
1780: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1790: 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72  */.  u8 *aInJour
17a0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
17b0: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
17c0: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
17d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
17e0: 2f 0a 20 20 75 38 20 2a 61 49 6e 43 6b 70 74 3b  /.  u8 *aInCkpt;
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
1810: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
1820: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
1830: 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c  Hdr *pFirst, *pL
1840: 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ast;      /* Lis
1850: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
1860: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
1870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1880: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
1890: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
18a0: 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53   *aHash[N_PG_HAS
18b0: 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74  H];    /* Hash t
18c0: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
18d0: 20 6e 75 6d 62 65 72 20 6f 66 20 50 67 48 64 72   number of PgHdr
18e0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
18f0: 65 73 65 20 61 72 65 20 62 69 74 73 20 74 68 61  ese are bits tha
1900: 74 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20  t can be set in 
1910: 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a  Pager.errMask..*
1920: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1930: 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30  ERR_FULL     0x0
1940: 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20  1  /* a write() 
1950: 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  failed */.#defin
1960: 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20  e PAGER_ERR_MEM 
1970: 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61       0x02  /* ma
1980: 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f  lloc() failed */
1990: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
19a0: 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34  RR_LOCK     0x04
19b0: 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68    /* error in th
19c0: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  e locking protoc
19d0: 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ol */.#define PA
19e0: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
19f0: 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61   0x08  /* databa
1a00: 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f  se or journal co
1a10: 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66  rruption */.#def
1a20: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49  ine PAGER_ERR_DI
1a30: 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20  SK     0x10  /* 
1a40: 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f  general disk I/O
1a50: 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72   error - bad har
1a60: 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a  d drive? */../*.
1a70: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
1a80: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 70 61 67  ile contains pag
1a90: 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
1aa0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f   following.** fo
1ab0: 72 6d 61 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  rmat..*/.typedef
1ac0: 20 73 74 72 75 63 74 20 50 61 67 65 52 65 63 6f   struct PageReco
1ad0: 72 64 20 50 61 67 65 52 65 63 6f 72 64 3b 0a 73  rd PageRecord;.s
1ae0: 74 72 75 63 74 20 50 61 67 65 52 65 63 6f 72 64  truct PageRecord
1af0: 20 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20   {.  Pgno pgno; 
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
1b20: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72  number */.  char
1b30: 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 50 41   aData[SQLITE_PA
1b40: 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 4f 72  GE_SIZE];  /* Or
1b50: 69 67 69 6e 61 6c 20 64 61 74 61 20 66 6f 72 20  iginal data for 
1b60: 70 61 67 65 20 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a  page pgno */.};.
1b70: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
1b80: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
1b90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
1ba0: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
1bb0: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
1bc0: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
1bd0: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
1be0: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
1bf0: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
1c00: 2a 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  * There are two 
1c10: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 2e  journal formats.
1c20: 20 20 54 68 65 20 6f 6c 64 65 72 20 6a 6f 75 72    The older jour
1c30: 6e 61 6c 20 66 6f 72 6d 61 74 20 77 72 69 74 65  nal format write
1c40: 73 0a 2a 2a 20 33 32 2d 62 69 74 20 69 6e 74 65  s.** 32-bit inte
1c50: 67 65 72 73 20 69 6e 20 74 68 65 20 62 79 74 65  gers in the byte
1c60: 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 68 6f  -order of the ho
1c70: 73 74 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65  st machine.  The
1c80: 20 6e 65 77 0a 2a 2a 20 66 6f 72 6d 61 74 20 77   new.** format w
1c90: 72 69 74 65 73 20 69 6e 74 65 67 65 72 73 20 61  rites integers a
1ca0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 20 20 41  s big-endian.  A
1cb0: 6c 6c 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 73 20  ll new journals 
1cc0: 75 73 65 20 74 68 65 0a 2a 2a 20 6e 65 77 20 66  use the.** new f
1cd0: 6f 72 6d 61 74 2c 20 62 75 74 20 77 65 20 68 61  ormat, but we ha
1ce0: 76 65 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ve to be able to
1cf0: 20 72 65 61 64 20 61 6e 20 6f 6c 64 65 72 20 6a   read an older j
1d00: 6f 75 72 6e 61 6c 20 69 6e 20 6f 72 64 65 72 0a  ournal in order.
1d10: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ** to roll it ba
1d20: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ck..*/.static co
1d30: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1d40: 72 20 61 4f 6c 64 4a 6f 75 72 6e 61 6c 4d 61 67  r aOldJournalMag
1d50: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
1d60: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
1d70: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
1d80: 78 36 33 2c 20 30 78 64 34 2c 0a 7d 3b 0a 73 74  x63, 0xd4,.};.st
1d90: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
1da0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
1db0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
1dc0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
1dd0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
1de0: 31 2c 20 30 78 36 33 2c 20 30 78 64 35 2c 0a 7d  1, 0x63, 0xd5,.}
1df0: 3b 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  ;.#define SQLITE
1e00: 5f 4e 45 57 5f 4a 4f 55 52 4e 41 4c 5f 46 4f 52  _NEW_JOURNAL_FOR
1e10: 4d 41 54 20 31 0a 23 64 65 66 69 6e 65 20 53 51  MAT 1.#define SQ
1e20: 4c 49 54 45 5f 4f 4c 44 5f 4a 4f 55 52 4e 41 4c  LITE_OLD_JOURNAL
1e30: 5f 46 4f 52 4d 41 54 20 30 0a 0a 2f 2a 0a 2a 2a  _FORMAT 0../*.**
1e40: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
1e50: 6e 74 65 67 65 72 2c 20 69 66 20 73 65 74 2c 20  nteger, if set, 
1e60: 63 61 75 73 65 73 20 6a 6f 75 72 6e 61 6c 73 20  causes journals 
1e70: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
1e80: 20 74 68 65 0a 2a 2a 20 6f 6c 64 20 66 6f 72 6d   the.** old form
1e90: 61 74 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  at.  This is use
1ea0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  d for testing pu
1eb0: 72 70 6f 73 65 73 20 6f 6e 6c 79 20 2d 20 74 6f  rposes only - to
1ec0: 20 6d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68   make sure.** th
1ed0: 65 20 63 6f 64 65 20 69 73 20 61 62 6c 65 20 74  e code is able t
1ee0: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 6f 6c  o rollback an ol
1ef0: 64 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 23 69  d journal..*/.#i
1f00: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1f10: 0a 69 6e 74 20 70 61 67 65 72 5f 6f 6c 64 5f 66  .int pager_old_f
1f20: 6f 72 6d 61 74 20 3d 20 30 3b 0a 23 65 6c 73 65  ormat = 0;.#else
1f30: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 5f  .# define pager_
1f40: 6f 6c 64 5f 66 6f 72 6d 61 74 20 30 0a 23 65 6e  old_format 0.#en
1f50: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20  dif../*.** Hash 
1f60: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f  a page number.*/
1f70: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68  .#define pager_h
1f80: 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 25 4e  ash(PN)  ((PN)%N
1f90: 5f 50 47 5f 48 41 53 48 29 0a 0a 2f 2a 0a 2a 2a  _PG_HASH)../*.**
1fa0: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
1fb0: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
1fc0: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
1fd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1fe0: 6e 74 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  nt pager_refinfo
1ff0: 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73  _enable = 0;.  s
2000: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
2010: 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a  _refinfo(PgHdr *
2020: 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  p){.    static i
2030: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
2040: 69 66 28 20 21 70 61 67 65 72 5f 72 65 66 69 6e  if( !pager_refin
2050: 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75  fo_enable ) retu
2060: 72 6e 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 0a  rn;.    printf(.
2070: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
2080: 25 34 64 20 61 64 64 72 3d 30 78 25 30 38 78 20  %4d addr=0x%08x 
2090: 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  nRef=%d\n",.    
20a0: 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74     p->pgno, (int
20b0: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
20c0: 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29  ), p->nRef.    )
20d0: 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f  ;.    cnt++;   /
20e0: 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73  * Something to s
20f0: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
2100: 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69  on */.  }.# defi
2110: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70  ne REFINFO(X)  p
2120: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a  ager_refinfo(X).
2130: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52  #else.# define R
2140: 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66  EFINFO(X).#endif
2150: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
2160: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
2170: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
2180: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2f 0a  e descriptor.*/.
2190: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
21a0: 32 62 69 74 73 28 50 61 67 65 72 20 2a 70 50 61  2bits(Pager *pPa
21b0: 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 66 64 2c  ger, OsFile *fd,
21c0: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
21d0: 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72 63  32 res;.  int rc
21e0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  ;.  rc = sqliteO
21f0: 73 52 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20  sRead(fd, &res, 
2200: 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20  sizeof(res));.  
2210: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2220: 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
2230: 72 6e 61 6c 46 6f 72 6d 61 74 3d 3d 53 51 4c 49  rnalFormat==SQLI
2240: 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e 41 4c 5f 46  TE_NEW_JOURNAL_F
2250: 4f 52 4d 41 54 20 29 7b 0a 20 20 20 20 75 6e 73  ORMAT ){.    uns
2260: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
2270: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c  ;.    memcpy(ac,
2280: 20 26 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72   &res, 4);.    r
2290: 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29  es = (ac[0]<<24)
22a0: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
22b0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
22c0: 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  [3];.  }.  *pRes
22d0: 20 3d 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e   = res;.  return
22e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
22f0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
2300: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
2310: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
2320: 74 6f 72 2e 20 20 57 72 69 74 69 6e 67 0a 2a 2a  tor.  Writing.**
2330: 20 69 73 20 61 6c 77 61 79 73 20 64 6f 6e 65 20   is always done 
2340: 75 73 69 6e 67 20 74 68 65 20 6e 65 77 20 6a 6f  using the new jo
2350: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2f  urnal format..*/
2360: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
2370: 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a  e32bits(OsFile *
2380: 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  fd, u32 val){.  
2390: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
23a0: 5b 34 5d 3b 0a 20 20 69 66 28 20 70 61 67 65 72  [4];.  if( pager
23b0: 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 29 7b 0a 20  _old_format ){. 
23c0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
23d0: 4f 73 57 72 69 74 65 28 66 64 2c 20 26 76 61 6c  OsWrite(fd, &val
23e0: 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 61 63 5b 30  , 4);.  }.  ac[0
23f0: 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20  ] = (val>>24) & 
2400: 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20  0xff;.  ac[1] = 
2410: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
2420: 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c  ;.  ac[2] = (val
2430: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >>8) & 0xff;.  a
2440: 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66  c[3] = val & 0xf
2450: 66 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  f;.  return sqli
2460: 74 65 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  teOsWrite(fd, ac
2470: 2c 20 34 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 4);.}.../*.** 
2480: 43 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74 73  Convert the bits
2490: 20 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e   in the pPager->
24a0: 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20  errMask into an 
24b0: 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65  approprate.** re
24c0: 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  turn code..*/.st
24d0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
24e0: 72 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50  rrcode(Pager *pP
24f0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2500: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2510: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
2520: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c  sk & PAGER_ERR_L
2530: 4f 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51  OCK )    rc = SQ
2540: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20  LITE_PROTOCOL;. 
2550: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2560: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
2570: 5f 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20  _DISK )    rc = 
2580: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
2590: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
25a0: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
25b0: 46 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53  FULL )    rc = S
25c0: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66  QLITE_FULL;.  if
25d0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
25e0: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45  k & PAGER_ERR_ME
25f0: 4d 20 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c  M )     rc = SQL
2600: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28  ITE_NOMEM;.  if(
2610: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2620: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52   & PAGER_ERR_COR
2630: 52 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49  RUPT ) rc = SQLI
2640: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65  TE_CORRUPT;.  re
2650: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2660: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
2670: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2680: 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
2690: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a  umber.  Return.*
26a0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
26b0: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
26c0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
26d0: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
26e0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
26f0: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
2700: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
2710: 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  p = pPager->aHas
2720: 68 5b 70 67 6e 6f 20 25 20 4e 5f 50 47 5f 48 41  h[pgno % N_PG_HA
2730: 53 48 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  SH];.  while( p 
2740: 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f  && p->pgno!=pgno
2750: 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   ){.    p = p->p
2760: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20  NextHash;.  }.  
2770: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
2780: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
2790: 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72  tabase and clear
27a0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
27b0: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
27c0: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
27d0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
27e0: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
27f0: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
2800: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
2810: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
2820: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
2830: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
2840: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
2850: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
2860: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
2870: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
2880: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
2890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
28a0: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
28b0: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
28c0: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
28d0: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
28e0: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
28f0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
2900: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
2910: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  l;.    sqliteFre
2920: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50  e(pPg);.  }.  pP
2930: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
2940: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
2950: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
2960: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d  >pAll = 0;.  mem
2970: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
2980: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
2990: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
29a0: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
29b0: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
29c0: 3e 73 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57  >state>=SQLITE_W
29d0: 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RITELOCK ){.    
29e0: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
29f0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
2a00: 7d 0a 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f  }.  sqliteOsUnlo
2a10: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
2a20: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
2a30: 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b   = SQLITE_UNLOCK
2a40: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
2a50: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
2a60: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61  r->nRef = 0;.  a
2a70: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
2a80: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
2a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
2aa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2ab0: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
2ac0: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
2ad0: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
2ae0: 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  * a write lock o
2af0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2b00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2b10: 6c 65 61 73 65 73 20 74 68 65 20 64 61 74 61 62  leases the datab
2b20: 61 73 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  ase.** write loc
2b30: 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  k and acquires a
2b40: 20 72 65 61 64 20 6c 6f 63 6b 20 69 6e 20 69 74   read lock in it
2b50: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
2b60: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
2b70: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
2b80: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
2b90: 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65  nt pager_unwrite
2ba0: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
2bb0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
2bc0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
2bd0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2be0: 3c 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  <SQLITE_WRITELOC
2bf0: 4b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  K ) return SQLIT
2c00: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 70 61  E_OK;.  sqlitepa
2c10: 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28  ger_ckpt_commit(
2c20: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
2c30: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
2c40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 43  ){.    sqliteOsC
2c50: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 63 70  lose(&pPager->cp
2c60: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
2c70: 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >ckptOpen = 0;. 
2c80: 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f   }.  sqliteOsClo
2c90: 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
2ca0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
2cb0: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 73  nalOpen = 0;.  s
2cc0: 71 6c 69 74 65 4f 73 44 65 6c 65 74 65 28 70 50  qliteOsDelete(pP
2cd0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
2ce0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73  .  rc = sqliteOs
2cf0: 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  ReadLock(&pPager
2d00: 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 46  ->fd);.  sqliteF
2d10: 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
2d20: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61  Journal );.  pPa
2d30: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
2d40: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  = 0;.  for(pPg=p
2d50: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
2d60: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
2d70: 41 6c 6c 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69  All){.    pPg->i
2d80: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
2d90: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
2da0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2db0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dc0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2dd0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
2de0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2df0: 2a 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  * This can only 
2e00: 68 61 70 70 65 6e 20 69 66 20 61 20 70 72 6f 63  happen if a proc
2e10: 65 73 73 20 64 6f 65 73 20 61 20 42 45 47 49 4e  ess does a BEGIN
2e20: 2c 20 74 68 65 6e 20 66 6f 72 6b 73 20 61 6e 64  , then forks and
2e30: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c   the.    ** chil
2e40: 64 20 70 72 6f 63 65 73 73 20 64 6f 65 73 20 74  d process does t
2e50: 68 65 20 43 4f 4d 4d 49 54 2e 20 20 42 65 63 61  he COMMIT.  Beca
2e60: 75 73 65 20 6f 66 20 74 68 65 20 73 65 6d 61 6e  use of the seman
2e70: 74 69 63 73 20 6f 66 20 75 6e 69 78 0a 20 20 20  tics of unix.   
2e80: 20 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   ** file locking
2e90: 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 77 69 6c  , the unlock wil
2ea0: 6c 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2f 0a 20  l fail..    */. 
2eb0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
2ec0: 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b   = SQLITE_UNLOCK
2ed0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2ee0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
2ef0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
2f00: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
2f10: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
2f20: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
2f30: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
2f40: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
2f50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2f60: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
2f70: 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  _page(Pager *pPa
2f80: 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64  ger, OsFile *jfd
2f90: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
2fa0: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
2fb0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
2fc0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
2fd0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 61  he cache */.  Pa
2fe0: 67 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b 0a  geRecord pgRec;.
2ff0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
3000: 74 73 28 70 50 61 67 65 72 2c 20 6a 66 64 2c 20  ts(pPager, jfd, 
3010: 26 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20  &pgRec.pgno);.  
3020: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3030: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
3040: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
3050: 61 64 28 6a 66 64 2c 20 26 70 67 52 65 63 2e 61  ad(jfd, &pgRec.a
3060: 44 61 74 61 2c 20 73 69 7a 65 6f 66 28 70 67 52  Data, sizeof(pgR
3070: 65 63 2e 61 44 61 74 61 29 29 3b 0a 20 20 69 66  ec.aData));.  if
3080: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3090: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
30a0: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
30b0: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ng on the page *
30c0: 2f 0a 20 20 69 66 28 20 70 67 52 65 63 2e 70 67  /.  if( pgRec.pg
30d0: 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
30e0: 65 20 7c 7c 20 70 67 52 65 63 2e 70 67 6e 6f 3d  e || pgRec.pgno=
30f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
3100: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 2f  TE_CORRUPT;..  /
3110: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 70  * Playback the p
3120: 61 67 65 2e 20 20 55 70 64 61 74 65 20 74 68 65  age.  Update the
3130: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 70 79 20   in-memory copy 
3140: 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a  of the page.  **
3150: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
3160: 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  e, if there is o
3170: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  ne..  */.  pPg =
3180: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
3190: 61 67 65 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f  ager, pgRec.pgno
31a0: 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
31b0: 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
31c0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
31d0: 67 52 65 63 2e 61 44 61 74 61 2c 20 53 51 4c 49  gRec.aData, SQLI
31e0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
31f0: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
3200: 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30  TO_EXTRA(pPg), 0
3210: 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
3220: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
3230: 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67  liteOsSeek(&pPag
3240: 65 72 2d 3e 66 64 2c 20 28 70 67 52 65 63 2e 70  er->fd, (pgRec.p
3250: 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41  gno-1)*SQLITE_PA
3260: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20  GE_SIZE);.  if( 
3270: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3280: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
3290: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
32a0: 3e 66 64 2c 20 70 67 52 65 63 2e 61 44 61 74 61  >fd, pgRec.aData
32b0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
32c0: 5a 45 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ZE);.  }.  retur
32d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
32e0: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
32f0: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
3300: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
3310: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
3320: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
3330: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
3340: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
3350: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
3360: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
3370: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
3380: 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 69  :  There is an i
3390: 6e 69 74 69 61 6c 0a 2a 2a 20 66 69 6c 65 2d 74  nitial.** file-t
33a0: 79 70 65 20 73 74 72 69 6e 67 20 66 6f 72 20 73  ype string for s
33b0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 2e 20  anity checking. 
33c0: 20 54 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   Then there is a
33d0: 20 73 69 6e 67 6c 65 0a 2a 2a 20 50 67 6e 6f 20   single.** Pgno 
33e0: 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20  number which is 
33f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
3400: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
3410: 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 68  ase before.** ch
3420: 61 6e 67 65 73 20 77 65 72 65 20 6d 61 64 65 2e  anges were made.
3430: 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69    The database i
3440: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 74  s truncated to t
3450: 68 69 73 20 73 69 7a 65 2e 0a 2a 2a 20 4e 65 78  his size..** Nex
3460: 74 20 63 6f 6d 65 20 7a 65 72 6f 20 6f 72 20 6d  t come zero or m
3470: 6f 72 65 20 70 61 67 65 20 72 65 63 6f 72 64 73  ore page records
3480: 20 77 68 65 72 65 20 65 61 63 68 20 70 61 67 65   where each page
3490: 20 72 65 63 6f 72 64 0a 2a 2a 20 63 6f 6e 73 69   record.** consi
34a0: 73 74 73 20 6f 66 20 61 20 50 67 6e 6f 20 61 6e  sts of a Pgno an
34b0: 64 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  d SQLITE_PAGE_SI
34c0: 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ZE bytes of data
34d0: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 50 61  .  See.** the Pa
34e0: 67 65 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  geRecord structu
34f0: 72 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  re for details..
3500: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
3510: 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
3520: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
3530: 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
3540: 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
3550: 65 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64  e (as determined
3560: 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74   by looking at t
3570: 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 0a  he magic number.
3580: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
3590: 69 6e 67 29 20 74 68 65 6e 20 74 68 69 73 20 72  ing) then this r
35a0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
35b0: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2e 0a  QLITE_PROTOCOL..
35c0: 2a 2a 20 49 66 20 61 6e 79 20 6f 74 68 65 72 20  ** If any other 
35d0: 65 72 72 6f 72 73 20 6f 63 63 75 72 20 64 75 72  errors occur dur
35e0: 69 6e 67 20 70 6c 61 79 62 61 63 6b 2c 20 74 68  ing playback, th
35f0: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 0a  e database will.
3600: 2a 2a 20 6c 69 6b 65 6c 79 20 62 65 20 63 6f 72  ** likely be cor
3610: 72 75 70 74 65 64 2c 20 73 6f 20 74 68 65 20 50  rupted, so the P
3620: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
3630: 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 0a 2a   bit is set in.*
3640: 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
3650: 6b 20 61 6e 64 20 53 51 4c 49 54 45 5f 43 4f 52  k and SQLITE_COR
3660: 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
3670: 2e 20 20 49 66 20 69 74 20 61 6c 6c 0a 2a 2a 20  .  If it all.** 
3680: 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74 68 69 73  works, then this
3690: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
36a0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
36b0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
36c0: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
36d0: 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74  pPager){.  off_t
36e0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
36f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3700: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
3710: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
3720: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
3730: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
3740: 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
3750: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
3760: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
3770: 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
3780: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
3790: 61 67 69 63 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  agic[sizeof(aJou
37a0: 72 6e 61 6c 4d 61 67 69 63 29 5d 3b 0a 20 20 69  rnalMagic)];.  i
37b0: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 46 69 67  nt rc;..  /* Fig
37c0: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
37d0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
37e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
37f0: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
3800: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
3810: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
3820: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
3830: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
3840: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
3850: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
3860: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69   rc = sqliteOsFi
3870: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
3880: 6a 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20 20 69  jfd, &nRec);.  i
3890: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
38a0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
38b0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
38c0: 20 69 66 28 20 6e 52 65 63 20 3c 3d 20 73 69 7a   if( nRec <= siz
38d0: 65 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65  eof(aMagic)+size
38e0: 6f 66 28 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20  of(Pgno) ){.    
38f0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
3900: 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20  k;.  }.  nRec = 
3910: 28 6e 52 65 63 20 2d 20 28 73 69 7a 65 6f 66 28  (nRec - (sizeof(
3920: 61 4d 61 67 69 63 29 2b 73 69 7a 65 6f 66 28 50  aMagic)+sizeof(P
3930: 67 6e 6f 29 29 29 20 2f 20 73 69 7a 65 6f 66 28  gno))) / sizeof(
3940: 50 61 67 65 52 65 63 6f 72 64 29 3b 0a 0a 20 20  PageRecord);..  
3950: 2f 2a 20 52 65 61 64 20 74 68 65 20 62 65 67 69  /* Read the begi
3960: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  nning of the jou
3970: 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e 63 61 74  rnal and truncat
3980: 65 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  e the.  ** datab
3990: 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
39a0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
39b0: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
39c0: 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50  sqliteOsRead(&pP
39d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
39e0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
39f0: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
3a00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
3a10: 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  c = SQLITE_PROTO
3a20: 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  COL;.    goto en
3a30: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
3a40: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
3a50: 67 69 63 2c 20 61 4f 6c 64 4a 6f 75 72 6e 61 6c  gic, aOldJournal
3a60: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
3a70: 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20  agic))==0 ){.   
3a80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
3a90: 46 6f 72 6d 61 74 20 3d 20 53 51 4c 49 54 45 5f  Format = SQLITE_
3aa0: 4f 4c 44 5f 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  OLD_JOURNAL_FORM
3ab0: 41 54 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  AT;.  }else if( 
3ac0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
3ad0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
3ae0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d 30  zeof(aMagic))==0
3af0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
3b00: 6a 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20  journalFormat = 
3b10: 53 51 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e  SQLITE_NEW_JOURN
3b20: 41 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c  AL_FORMAT;.  }el
3b30: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
3b40: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
3b50: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
3b60: 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ack;.  }.  rc = 
3b70: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
3b80: 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  r, &pPager->jfd,
3b90: 20 26 6d 78 50 67 29 3b 0a 20 20 69 66 28 20 72   &mxPg);.  if( r
3ba0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3bb0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
3bc0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  yback;.  }.  rc 
3bd0: 3d 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61  = sqliteOsTrunca
3be0: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
3bf0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
3c00: 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a 20  *(off_t)mxPg);. 
3c10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3c20: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
3c30: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
3c40: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
3c50: 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20 2f  e = mxPg;.  .  /
3c60: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
3c70: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
3c80: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
3c90: 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
3ca0: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
3cb0: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
3cc0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
3cd0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
3ce0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
3cf0: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
3d00: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
3d10: 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
3d20: 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61 79 62  ;.  }..end_playb
3d30: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
3d40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3d50: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
3d60: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
3d70: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
3d80: 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  = PAGER_ERR_CORR
3d90: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
3da0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
3db0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
3dc0: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
3dd0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
3de0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3df0: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
3e00: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
3e10: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
3e20: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
3e30: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
3e40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
3e50: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
3e60: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
3e70: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
3e80: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
3e90: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
3ea0: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
3eb0: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
3ec0: 20 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70        the checkp
3ed0: 6f 69 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  oint is stored i
3ee0: 6e 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69  n pPager->ckptSi
3ef0: 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
3f00: 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
3f10: 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
3f20: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
3f30: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
3f40: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 63 68 65  ing back the che
3f50: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2c  ckpoint journal,
3f60: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
3f70: 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
3f80: 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
3f90: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
3fa0: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
3fb0: 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
3fc0: 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 2e  ager->ckptJSize.
3fd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
3fe0: 61 67 65 72 5f 63 6b 70 74 5f 70 6c 61 79 62 61  ager_ckpt_playba
3ff0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
4000: 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 52 65 63 3b  ){.  off_t nRec;
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4020: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
4030: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
4060: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
4070: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
4080: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
4090: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
40a0: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ize..  */.  rc =
40b0: 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74   sqliteOsTruncat
40c0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  e(&pPager->fd, S
40d0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
40e0: 28 6f 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 63  (off_t)pPager->c
40f0: 6b 70 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  kptSize);.  pPag
4100: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
4110: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 3b 0a 0a  ger->ckptSize;..
4120: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
4130: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
4140: 20 61 72 65 20 69 6e 20 74 68 65 20 63 68 65 63   are in the chec
4150: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  kpoint journal..
4160: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
4170: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
4180: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
4190: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c  nalOpen );.  sql
41a0: 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65  iteOsSeek(&pPage
41b0: 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a 20 20 72  r->cpfd, 0);.  r
41c0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  c = sqliteOsFile
41d0: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 63 70  Size(&pPager->cp
41e0: 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20 20 69 66  fd, &nRec);.  if
41f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4200: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
4210: 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  ckpt_playback;. 
4220: 20 7d 0a 20 20 6e 52 65 63 20 2f 3d 20 73 69 7a   }.  nRec /= siz
4230: 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b  eof(PageRecord);
4240: 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
4250: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
4260: 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
4270: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  nt journal and b
4280: 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ack into the.  *
4290: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
42a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
42b0: 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 29 7b 0a  r_old_format ){.
42c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
42d0: 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53 51 4c 49  nalFormat = SQLI
42e0: 54 45 5f 4f 4c 44 5f 4a 4f 55 52 4e 41 4c 5f 46  TE_OLD_JOURNAL_F
42f0: 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ORMAT;.  }else{.
4300: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
4310: 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53 51 4c 49  nalFormat = SQLI
4320: 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e 41 4c 5f 46  TE_NEW_JOURNAL_F
4330: 4f 52 4d 41 54 3b 0a 20 20 7d 0a 20 20 66 6f 72  ORMAT;.  }.  for
4340: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
4350: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
4360: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
4370: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
4380: 26 70 50 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a  &pPager->cpfd);.
4390: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
43a0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
43b0: 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _ckpt_playback;.
43c0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
43d0: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 70 61   out how many pa
43e0: 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
43f0: 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
4400: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
4410: 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  * journal..  */.
4420: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53    rc = sqliteOsS
4430: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
4440: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53  , pPager->ckptJS
4450: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
4460: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4470: 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70   goto end_ckpt_p
4480: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  layback;.  }.  r
4490: 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  c = sqliteOsFile
44a0: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
44b0: 64 2c 20 26 6e 52 65 63 29 3b 0a 20 20 69 66 28  d, &nRec);.  if(
44c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
44d0: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63  {.    goto end_c
44e0: 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  kpt_playback;.  
44f0: 7d 0a 20 20 6e 52 65 63 20 3d 20 28 6e 52 65 63  }.  nRec = (nRec
4500: 20 2d 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a   - pPager->ckptJ
4510: 53 69 7a 65 29 2f 73 69 7a 65 6f 66 28 50 61 67  Size)/sizeof(Pag
4520: 65 52 65 63 6f 72 64 29 3b 0a 20 20 66 6f 72 28  eRecord);.  for(
4530: 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20  i=nRec-1; i>=0; 
4540: 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  i--){.    rc = p
4550: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
4560: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
4570: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
4580: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4590: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 63  _OK ) goto end_c
45a0: 6b 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  kpt_playback;.  
45b0: 7d 0a 20 20 0a 0a 65 6e 64 5f 63 6b 70 74 5f 70  }.  ..end_ckpt_p
45c0: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
45d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
45e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
45f0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
4600: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
4610: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
4620: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
4630: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
4640: 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
4650: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
4660: 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
4670: 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a  re allowed..**.*
4680: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
4690: 6d 62 65 72 20 69 73 20 74 68 65 20 61 62 73 6f  mber is the abso
46a0: 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68  lute value of th
46b0: 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d 65 74  e mxPage paramet
46c0: 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61 67 65  er..** If mxPage
46d0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
46e0: 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73  e noSync flag is
46f0: 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f 53 79   also set.  noSy
4700: 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a 20 63  nc bypasses.** c
4710: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 4f 73  alls to sqliteOs
4720: 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70 61 67  Sync().  The pag
4730: 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66 61 73  er runs much fas
4740: 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e 63 20  ter with noSync 
4750: 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20 74 68  on,.** but if th
4760: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
4770: 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
4780: 65 72 65 20 69 73 20 61 6e 20 61 62 72 75 70 74  ere is an abrupt
4790: 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75   power .** failu
47a0: 72 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  re, the database
47b0: 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
47c0: 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
47d0: 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e  istent and.** un
47e0: 72 65 70 61 69 72 61 62 6c 65 20 73 74 61 74 65  repairable state
47f0: 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
4800: 74 65 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68  tepager_set_cach
4810: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
4820: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
4830: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 3d  {.  if( mxPage>=
4840: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
4850: 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
4860: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 7d 65  ->tempFile;.  }e
4870: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
4880: 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  >noSync = 1;.   
4890: 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50 61 67   mxPage = -mxPag
48a0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78 50  e;.  }.  if( mxP
48b0: 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50  age>10 ){.    pP
48c0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d  ager->mxPage = m
48d0: 78 50 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  xPage;.  }.}../*
48e0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
48f0: 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74  rary file.  Writ
4900: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
4910: 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d  e file into zNam
4920: 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74  e.** (zName must
4930: 20 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c   be at least SQL
4940: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
4950: 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20  E bytes long.)  
4960: 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c  Write.** the fil
4970: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
4980: 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
4990: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
49a0: 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
49b0: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
49c0: 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  if we fail..**.*
49d0: 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  * The OS will au
49e0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
49f0: 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
4a00: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
4a10: 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  .** closed..*/.s
4a20: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
4a30: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63  pager_opentemp(c
4a40: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69  har *zFile, OsFi
4a50: 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63  le *fd){.  int c
4a60: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
4a70: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d  ;.  do{.    cnt-
4a80: 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 54  -;.    sqliteOsT
4a90: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c  empFileName(zFil
4aa0: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
4ab0: 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  iteOsOpenExclusi
4ac0: 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29  ve(zFile, fd, 1)
4ad0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e  ;.  }while( cnt>
4ae0: 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 && rc!=SQLITE_
4af0: 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  OK );.  return r
4b00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
4b10: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
4b20: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
4b30: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
4b40: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
4b50: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
4b60: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
4b70: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
4b80: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
4b90: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
4ba0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
4bb0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65 74   sqlitepager_get
4bc0: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
4bd0: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
4be0: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
4bf0: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
4c00: 67 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e  g sqlitepager_un
4c10: 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
4c20: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
4c30: 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
4c40: 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
4c50: 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
4c60: 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
4c70: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
4c80: 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
4c90: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
4ca0: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
4cb0: 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
4cc0: 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
4cd0: 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20  itepager_open(. 
4ce0: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
4cf0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
4d00: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
4d10: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
4d20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
4d30: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
4d40: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
4d50: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
4d60: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c  */.  int mxPage,
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d80: 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69   Max number of i
4d90: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
4da0: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ages */.  int nE
4db0: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
4dc0: 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
4dd0: 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
4de0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
4df0: 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  */.){.  Pager *p
4e00: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 6e 61 6d  Pager;.  int nam
4e10: 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66  eLen;.  OsFile f
4e20: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  d;.  int rc;.  i
4e30: 6e 74 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69  nt tempFile;.  i
4e40: 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
4e50: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
4e60: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
4e70: 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72  ZE];..  *ppPager
4e80: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
4e90: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
4ea0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4eb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
4ec0: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
4ed0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
4ee0: 69 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  iteOsOpenReadWri
4ef0: 74 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66  te(zFilename, &f
4f00: 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20  d, &readOnly);. 
4f10: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b     tempFile = 0;
4f20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
4f30: 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f   = sqlitepager_o
4f40: 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26  pentemp(zTemp, &
4f50: 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  fd);.    zFilena
4f60: 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  me = zTemp;.    
4f70: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
4f80: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
4f90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
4fa0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
4fb0: 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c  PEN;.  }.  nameL
4fc0: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c  en = strlen(zFil
4fd0: 65 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72  ename);.  pPager
4fe0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
4ff0: 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
5000: 20 2b 20 6e 61 6d 65 4c 65 6e 2a 32 20 2b 20 33   + nameLen*2 + 3
5010: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
5020: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
5030: 74 65 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  teOsClose(&fd);.
5040: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5050: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
5060: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
5070: 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
5080: 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
5090: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
50a0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61  er->zFilename[na
50b0: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
50c0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
50d0: 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  name, zFilename)
50e0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
50f0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 69  r->zJournal, zFi
5100: 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  lename);.  strcp
5110: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
5120: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
5130: 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61  journal");.  pPa
5140: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
5150: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5160: 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  pen = 0;.  pPage
5170: 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 30 3b  r->ckptOpen = 0;
5180: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  .  pPager->ckptI
5190: 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  nUse = 0;.  pPag
51a0: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
51b0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
51c0: 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63   -1;.  pPager->c
51d0: 6b 70 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  kptSize = 0;.  p
51e0: 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65  Pager->ckptJSize
51f0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
5200: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61  nPage = 0;.  pPa
5210: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78  ger->mxPage = mx
5220: 50 61 67 65 3e 35 20 3f 20 6d 78 50 61 67 65 20  Page>5 ? mxPage 
5230: 3a 20 31 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  : 10;.  pPager->
5240: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55  state = SQLITE_U
5250: 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d  NLOCK;.  pPager-
5260: 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  >errMask = 0;.  
5270: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
5280: 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70   = tempFile;.  p
5290: 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
52a0: 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50  = readOnly;.  pP
52b0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
52c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   0;.  pPager->no
52d0: 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
52e0: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
52f0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
5300: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
5310: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   0;.  pPager->nE
5320: 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20  xtra = nExtra;. 
5330: 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
5340: 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
5350: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
5360: 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ;.  *ppPager = p
5370: 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
5380: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5390: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
53a0: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
53b0: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
53c0: 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
53d0: 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
53e0: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
53f0: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
5400: 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
5410: 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
5420: 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
5430: 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
5440: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
5450: 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
5460: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
5470: 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
5480: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
5490: 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
54a0: 72 65 73 75 6c 74 20 73 71 6c 69 74 65 70 61 67  result sqlitepag
54b0: 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a  er_close().  .**
54c0: 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65   Destructors are
54d0: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
54e0: 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65  sqlitepager_unre
54f0: 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f()..*/.void sql
5500: 69 74 65 70 61 67 65 72 5f 73 65 74 5f 64 65 73  itepager_set_des
5510: 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70  tructor(Pager *p
5520: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44  Pager, void (*xD
5530: 65 73 63 29 28 76 6f 69 64 2a 29 29 7b 0a 20 20  esc)(void*)){.  
5540: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
5550: 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a  tor = xDesc;.}..
5560: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5570: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
5580: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
5590: 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
55a0: 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
55b0: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
55c0: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
55d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
55e0: 20 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73    off_t n;.  ass
55f0: 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
5600: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
5610: 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20  dbSize>=0 ){.   
5620: 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
5630: 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  dbSize;.  }.  if
5640: 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69  ( sqliteOsFileSi
5650: 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ze(&pPager->fd, 
5660: 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  &n)!=SQLITE_OK )
5670: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
5680: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
5690: 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74  RR_DISK;.    ret
56a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f  urn 0;.  }.  n /
56b0: 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  = SQLITE_PAGE_SI
56c0: 5a 45 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ZE;.  if( pPager
56d0: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
56e0: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50  UNLOCK ){.    pP
56f0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
5700: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
5710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
5720: 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
5730: 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
5740: 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
5750: 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
5760: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
5770: 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
5780: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
5790: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
57a0: 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
57b0: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
57c0: 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
57d0: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
57e0: 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
57f0: 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
5800: 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
5810: 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
5820: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
5830: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
5840: 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
5850: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
5860: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
5870: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
5880: 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dump..*/.int sql
5890: 69 74 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 50  itepager_close(P
58a0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
58b0: 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
58c0: 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  ext;.  switch( p
58d0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a  Pager->state ){.
58e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
58f0: 57 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20 20 20  WRITELOCK: {.   
5900: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72     sqlitepager_r
5910: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
5920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 55  .      sqliteOsU
5930: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
5940: 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
5950: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
5960: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
5970: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5980: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
5990: 45 41 44 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20  EADLOCK: {.     
59a0: 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28   sqliteOsUnlock(
59b0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
59c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
59d0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
59e0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
59f0: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ing */.      bre
5a00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
5a10: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
5a20: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
5a30: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
5a40: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
5a50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
5a60: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (pPg);.  }.  sql
5a70: 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  iteOsClose(&pPag
5a80: 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65 72  er->fd);.  asser
5a90: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
5aa0: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f  alOpen==0 );.  /
5ab0: 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
5ac0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
5ad0: 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
5ae0: 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
5af0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
5b00: 2a 2a 20 20 20 73 71 6c 69 74 65 4f 73 44 65 6c  **   sqliteOsDel
5b10: 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
5b20: 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
5b30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65   */.  sqliteFree
5b40: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
5b50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5b60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5b70: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
5b80: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
5b90: 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73   data..*/.Pgno s
5ba0: 71 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 6e  qlitepager_pagen
5bb0: 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74  umber(void *pDat
5bc0: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  a){.  PgHdr *p =
5bd0: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
5be0: 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
5bf0: 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pgno;.}../*.*
5c00: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
5c10: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
5c20: 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66 20  for a page.  If 
5c30: 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 63  the page is.** c
5c40: 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
5c50: 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
5c60: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
5c70: 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
5c80: 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
5c90: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73  e freelist..*/.s
5ca0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
5cb0: 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
5cc0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
5cd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
5ce0: 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
5cf0: 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
5d00: 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e  ist.  Remove it.
5d10: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d   */.    if( pPg-
5d20: 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
5d30: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
5d40: 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
5d50: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
5d60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5d70: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
5d80: 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
5d90: 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tFree;.    }.   
5da0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
5db0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
5dc0: 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
5dd0: 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
5de0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  revFree;.    }el
5df0: 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
5e00: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
5e10: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
5e20: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
5e30: 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
5e40: 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
5e50: 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
5e60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  .}../*.** Increm
5e70: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
5e80: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
5e90: 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70  ge.  The input p
5ea0: 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72  ointer is.** a r
5eb0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
5ec0: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e  page data..*/.in
5ed0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 65  t sqlitepager_re
5ee0: 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  f(void *pData){.
5ef0: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
5f00: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
5f10: 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  ta);.  page_ref(
5f20: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
5f30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5f40: 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
5f50: 6e 61 6c 20 61 6e 64 20 74 68 65 6e 20 77 72 69  nal and then wri
5f60: 74 65 20 61 6c 6c 20 66 72 65 65 20 64 69 72 74  te all free dirt
5f70: 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
5f80: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e  atabase.** file.
5f90: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 69 6e 67 20 61  .**.** Writing a
5fa0: 6c 6c 20 66 72 65 65 20 64 69 72 74 79 20 70 61  ll free dirty pa
5fb0: 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
5fc0: 61 73 65 20 61 66 74 65 72 20 74 68 65 20 73 79  ase after the sy
5fd0: 6e 63 20 69 73 20 61 0a 2a 2a 20 6e 6f 6e 2d 6f  nc is a.** non-o
5fe0: 62 76 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  bvious optimizat
5ff0: 69 6f 6e 2e 20 20 66 73 79 6e 63 28 29 20 69 73  ion.  fsync() is
6000: 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70   an expensive op
6010: 65 72 61 74 69 6f 6e 20 73 6f 20 77 65 0a 2a 2a  eration so we.**
6020: 20 77 61 6e 74 20 74 6f 20 6d 69 6e 69 6d 69 7a   want to minimiz
6030: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 74 20  e the number ot 
6040: 74 69 6d 65 73 20 69 74 20 69 73 20 63 61 6c 6c  times it is call
6050: 65 64 2e 20 41 66 74 65 72 20 61 6e 20 66 73 79  ed. After an fsy
6060: 6e 63 28 29 20 63 61 6c 6c 2c 0a 2a 2a 20 77 65  nc() call,.** we
6070: 20 61 72 65 20 66 72 65 65 20 74 6f 20 77 72 69   are free to wri
6080: 74 65 20 64 69 72 74 79 20 70 61 67 65 73 20 62  te dirty pages b
6090: 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
60a0: 61 73 65 2e 20 20 49 74 20 69 73 20 62 65 73 74  ase.  It is best
60b0: 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
60c0: 61 6e 64 20 77 72 69 74 65 20 61 73 20 6d 61 6e  and write as man
60d0: 79 20 64 69 72 74 79 20 70 61 67 65 73 20 61 73  y dirty pages as
60e0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 69 6e   possible to min
60f0: 69 6d 69 7a 65 20 0a 2a 2a 20 74 68 65 20 72 69  imize .** the ri
6100: 73 6b 20 6f 66 20 68 61 76 69 6e 67 20 74 6f 20  sk of having to 
6110: 64 6f 20 61 6e 6f 74 68 65 72 20 66 73 79 6e 63  do another fsync
6120: 28 29 20 6c 61 74 65 72 20 6f 6e 2e 20 20 57 72  () later on.  Wr
6130: 69 74 69 6e 67 20 64 69 72 74 79 0a 2a 2a 20 66  iting dirty.** f
6140: 72 65 65 20 70 61 67 65 73 20 69 6e 20 74 68 69  ree pages in thi
6150: 73 20 77 61 79 20 77 61 73 20 6f 62 73 65 72 76  s way was observ
6160: 65 64 20 74 6f 20 6d 61 6b 65 20 64 61 74 61 62  ed to make datab
6170: 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 67  ase operations g
6180: 6f 0a 2a 2a 20 75 70 20 74 6f 20 31 30 20 74 69  o.** up to 10 ti
6190: 6d 65 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  mes faster..**.*
61a0: 2a 20 49 66 20 77 65 20 61 72 65 20 77 72 69 74  * If we are writ
61b0: 69 6e 67 20 74 6f 20 74 65 6d 70 6f 72 61 72 79  ing to temporary
61c0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 72 65   database, there
61d0: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 70   is no need to p
61e0: 72 65 73 65 72 76 65 0a 2a 2a 20 74 68 65 20 69  reserve.** the i
61f0: 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20  ntegrity of the 
6200: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f  journal file, so
6210: 20 77 65 20 63 61 6e 20 73 61 76 65 20 74 69 6d   we can save tim
6220: 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 0a 2a  e and skip the.*
6230: 2a 20 66 73 79 6e 63 28 29 2e 0a 2a 2f 0a 73 74  * fsync()..*/.st
6240: 61 74 69 63 20 69 6e 74 20 73 79 6e 63 41 6c 6c  atic int syncAll
6250: 50 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61  Pages(Pager *pPa
6260: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
6270: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
6280: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
6290: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
62a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
62b0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
62c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
62d0: 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72  teOsSync(&pPager
62e0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
62f0: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
6300: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
6310: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
6320: 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70  = 0;.  }.  for(p
6330: 50 67 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  Pg=pPager->pFirs
6340: 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  t; pPg; pPg=pPg-
6350: 3e 70 4e 65 78 74 46 72 65 65 29 7b 0a 20 20 20  >pNextFree){.   
6360: 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
6370: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f  ){.      sqliteO
6380: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
6390: 64 2c 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  d, (pPg->pgno-1)
63a0: 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  *SQLITE_PAGE_SIZ
63b0: 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  E);.      rc = s
63c0: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
63d0: 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
63e0: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51  TO_DATA(pPg), SQ
63f0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
6400: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
6410: 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
6420: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
6430: 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ty = 0;.    }.  
6440: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6450: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
6460: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
6470: 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
6480: 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
6490: 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
64a0: 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
64b0: 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
64c0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
64d0: 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
64e0: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
64f0: 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67  ased..**.** A _g
6500: 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  et works for any
6510: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
6520: 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
6530: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
6540: 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
6550: 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
6560: 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
6570: 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
6580: 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
6590: 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
65a0: 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
65b0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
65c0: 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
65d0: 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
65e0: 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
65f0: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
6600: 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
6610: 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
6620: 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
6630: 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
6640: 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
6650: 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
6660: 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
6670: 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
6680: 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
6690: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
66a0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
66b0: 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
66c0: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
66d0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 70  See also sqlitep
66e0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20  ager_lookup().  
66f0: 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
6700: 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20  e and _lookup() 
6710: 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
6720: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
6730: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
6740: 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
6750: 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
6760: 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
6770: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
6780: 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
6790: 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
67a0: 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  s _lookup().** j
67b0: 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
67c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
67d0: 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
67e0: 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
67f0: 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
6800: 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
6810: 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
6820: 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
6830: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6840: 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28  * Since _lookup(
6850: 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
6860: 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
6870: 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
6880: 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
6890: 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
68a0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 67 65  t sqlitepager_ge
68b0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
68c0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
68d0: 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67   **ppPage){.  Pg
68e0: 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
68f0: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
6900: 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
6910: 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
6920: 20 2a 2f 20 0a 20 20 69 66 28 20 70 50 61 67 65   */ .  if( pPage
6930: 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  r==0 || pgno==0 
6940: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6950: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
6960: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
6970: 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f  rMask & ~(PAGER_
6980: 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20  ERR_FULL) ){.   
6990: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
69a0: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
69b0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
69c0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
69d0: 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
69e0: 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63  n get a read loc
69f0: 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61  k.  ** on the da
6a00: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
6a10: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
6a20: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nRef==0 ){.    i
6a30: 66 28 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c  f( sqliteOsReadL
6a40: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
6a50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6a60: 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
6a70: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
6a80: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
6a90: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
6aa0: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41  ate = SQLITE_REA
6ab0: 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20 2f 2a 20 49  DLOCK;..    /* I
6ac0: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
6ad0: 20 65 78 69 73 74 73 2c 20 74 72 79 20 74 6f 20   exists, try to 
6ae0: 70 6c 61 79 20 69 74 20 62 61 63 6b 2e 0a 20 20  play it back..  
6af0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
6b00: 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73 28  iteOsFileExists(
6b10: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
6b20: 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20  ) ){.       int 
6b30: 72 63 2c 20 64 75 6d 6d 79 3b 0a 0a 20 20 20 20  rc, dummy;..    
6b40: 20 20 20 2f 2a 20 47 65 74 20 61 20 77 72 69 74     /* Get a writ
6b50: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
6b60: 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 2a 2f  tabase.       */
6b70: 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .       rc = sql
6b80: 69 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b 28 26  iteOsWriteLock(&
6b90: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
6ba0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6bb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6bc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 55    rc = sqliteOsU
6bd0: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
6be0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73  d);.         ass
6bf0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
6c00: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 2a  OK );.         *
6c10: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
6c20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6c30: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
6c40: 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
6c50: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
6c60: 57 52 49 54 45 4c 4f 43 4b 3b 0a 0a 20 20 20 20  WRITELOCK;..    
6c70: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
6c80: 6f 75 72 6e 61 6c 20 66 6f 72 20 65 78 63 6c 75  ournal for exclu
6c90: 73 69 76 65 20 61 63 63 65 73 73 2e 20 20 52 65  sive access.  Re
6ca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
6cb0: 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65   if.       ** we
6cc0: 20 63 61 6e 6e 6f 74 20 67 65 74 20 65 78 63 6c   cannot get excl
6cd0: 75 73 69 76 65 20 61 63 63 65 73 73 20 74 6f 20  usive access to 
6ce0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6cf0: 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  . .       **.   
6d00: 20 20 20 20 2a 2a 20 45 76 65 6e 20 74 68 6f 75      ** Even thou
6d10: 67 68 20 77 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  gh we will only 
6d20: 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
6d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74  the journal, not
6d40: 20 77 72 69 74 69 6e 67 2c 0a 20 20 20 20 20 20   writing,.      
6d50: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 6f   ** we have to o
6d60: 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
6d70: 66 6f 72 20 77 72 69 74 69 6e 67 20 69 6e 20 6f  for writing in o
6d80: 72 64 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 61  rder to obtain a
6d90: 6e 0a 20 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  n.       ** excl
6da0: 75 73 69 76 65 20 61 63 63 65 73 73 20 6c 6f 63  usive access loc
6db0: 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  k..       */.   
6dc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
6dd0: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 70  sOpenReadWrite(p
6de0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
6df0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26   &pPager->jfd, &
6e00: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 69  dummy);.       i
6e10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 63 20   ){.         rc 
6e30: 3d 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b  = sqliteOsUnlock
6e40: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
6e50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6e60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
6e70: 0a 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  .         *ppPag
6e80: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
6e90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
6ea0: 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  SY;.       }.   
6eb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
6ec0: 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20  nalOpen = 1;..  
6ed0: 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
6ee0: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
6ef0: 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
6f00: 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
6f10: 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  e.       ** lock
6f20: 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
6f30: 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
6f40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
6f50: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
6f60: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
6f70: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6f80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6f90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
6fa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
6fb0: 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
6fc0: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
6fd0: 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65  or page in cache
6fe0: 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
6ff0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
7000: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
7010: 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
7020: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
7030: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
7040: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
7050: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a  . */.    int h;.
7060: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73      pPager->nMis
7070: 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  s++;.    if( pPa
7080: 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
7090: 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61  r->mxPage || pPa
70a0: 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 29  ger->pFirst==0 )
70b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  {.      /* Creat
70c0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a  e a new page */.
70d0: 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
70e0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
70f0: 28 2a 70 50 67 29 20 2b 20 53 51 4c 49 54 45 5f  (*pPg) + SQLITE_
7100: 50 41 47 45 5f 53 49 5a 45 20 2b 20 70 50 61 67  PAGE_SIZE + pPag
7110: 65 72 2d 3e 6e 45 78 74 72 61 20 29 3b 0a 20 20  er->nExtra );.  
7120: 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
7130: 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  {.        *ppPag
7140: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  e = 0;.        p
7150: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
7160: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
7170: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
7180: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d  k |= PAGER_ERR_M
7190: 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  EM;.        retu
71a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
71b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
71c0: 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
71d0: 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ger;.      pPg->
71e0: 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65  pNextAll = pPage
71f0: 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 69  r->pAll;.      i
7200: 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  f( pPager->pAll 
7210: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
7220: 72 2d 3e 70 41 6c 6c 2d 3e 70 50 72 65 76 41 6c  r->pAll->pPrevAl
7230: 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 7d  l = pPg;.      }
7240: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
7250: 76 41 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  vAll = 0;.      
7260: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70  pPager->pAll = p
7270: 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  Pg;.      pPager
7280: 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d  ->nPage++;.    }
7290: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52  else{.      /* R
72a0: 65 63 79 63 6c 65 20 61 6e 20 6f 6c 64 65 72 20  ecycle an older 
72b0: 70 61 67 65 2e 20 20 46 69 72 73 74 20 6c 6f 63  page.  First loc
72c0: 61 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ate the page to 
72d0: 62 65 20 72 65 63 79 63 6c 65 64 2e 0a 20 20 20  be recycled..   
72e0: 20 20 20 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e     ** Try to fin
72f0: 64 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f  d one that is no
7300: 74 20 64 69 72 74 79 20 61 6e 64 20 69 73 20 6e  t dirty and is n
7310: 65 61 72 20 74 68 65 20 68 65 61 64 20 6f 66 0a  ear the head of.
7320: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
7330: 66 72 65 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20  free list */.   
7340: 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
7350: 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 77  >pFirst;.      w
7360: 68 69 6c 65 28 20 70 50 67 20 26 26 20 70 50 67  hile( pPg && pPg
7370: 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
7380: 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e     pPg = pPg->pN
7390: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  extFree;.      }
73a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65  ..      /* If we
73b0: 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
73c0: 61 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  a page that has 
73d0: 6e 6f 74 20 62 65 65 6e 20 75 73 65 64 20 72 65  not been used re
73e0: 63 65 6e 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  cently.      ** 
73f0: 61 6e 64 20 77 68 69 63 68 20 69 73 20 6e 6f 74  and which is not
7400: 20 64 69 72 74 79 2c 20 74 68 65 6e 20 73 79 6e   dirty, then syn
7410: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  c the journal an
7420: 64 20 77 72 69 74 65 20 61 6c 6c 0a 20 20 20 20  d write all.    
7430: 20 20 2a 2a 20 64 69 72 74 79 20 66 72 65 65 20    ** dirty free 
7440: 70 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20 64  pages into the d
7450: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
7460: 75 73 20 6d 61 6b 69 6e 67 20 74 68 65 6d 0a 20  us making them. 
7470: 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 70 61       ** clean pa
7480: 67 65 73 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  ges and availabl
7490: 65 20 66 6f 72 20 72 65 63 79 63 6c 69 6e 67 2e  e for recycling.
74a0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
74b0: 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 73 79  ** We have to sy
74c0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
74d0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 20  efore writing a 
74e0: 70 61 67 65 20 74 6f 20 74 68 65 20 6d 61 69 6e  page to the main
74f0: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
7500: 73 65 2e 20 20 42 75 74 20 73 79 6e 63 69 6e 67  se.  But syncing
7510: 20 69 73 20 61 20 76 65 72 79 20 73 6c 6f 77 20   is a very slow 
7520: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 61  operation.  So a
7530: 66 74 65 72 20 61 0a 20 20 20 20 20 20 2a 2a 20  fter a.      ** 
7540: 73 79 6e 63 2c 20 69 74 20 69 73 20 62 65 73 74  sync, it is best
7550: 20 74 6f 20 77 72 69 74 65 20 65 76 65 72 79 74   to write everyt
7560: 68 69 6e 67 20 77 65 20 63 61 6e 20 62 61 63 6b  hing we can back
7570: 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   to the main.   
7580: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
7590: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 72  o minimize the r
75a0: 69 73 6b 20 6f 66 20 68 61 76 69 6e 67 20 74 6f  isk of having to
75b0: 20 73 79 6e 63 20 61 67 61 69 6e 20 69 6e 20 74   sync again in t
75c0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 61 72  he.      ** near
75d0: 20 66 75 74 75 72 65 2e 20 20 54 68 61 74 20 69   future.  That i
75e0: 73 20 77 68 79 20 77 65 20 77 72 69 74 65 20 61  s why we write a
75f0: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 61  ll dirty pages a
7600: 66 74 65 72 20 61 0a 20 20 20 20 20 20 2a 2a 20  fter a.      ** 
7610: 73 79 6e 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  sync..      */. 
7620: 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
7630: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
7640: 63 20 3d 20 73 79 6e 63 41 6c 6c 50 61 67 65 73  c = syncAllPages
7650: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
7660: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
7670: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 70           sqlitep
7680: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
7690: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
76a0: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
76b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
76c0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
76d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
76e0: 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
76f0: 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rst;.      }.   
7700: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
7710: 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20  nRef==0 );.     
7720: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
7730: 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rty==0 );..     
7740: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
7750: 77 65 20 61 72 65 20 72 65 63 79 63 6c 79 69 6e  we are recyclyin
7760: 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
7770: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
7780: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  hen.      ** set
7790: 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
77a0: 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
77b0: 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
77c0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  the.      ** sql
77d0: 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ite_dont_rollbac
77e0: 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
77f0: 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
7800: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
7810: 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  n..      ** It i
7820: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
7830: 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
7840: 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
7850: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
7860: 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
7870: 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61  reloaded at a la
7880: 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20  ter time but at 
7890: 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f  that point we wo
78a0: 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20  n't remember.   
78b0: 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61     ** that is wa
78c0: 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
78d0: 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
78e0: 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
78f0: 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ges must.      *
7900: 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
7910: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
7920: 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
7930: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
7940: 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
7950: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
7960: 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
7970: 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
7980: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
7990: 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
79a0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
79b0: 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
79c0: 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ash table.      
79d0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
79e0: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
79f0: 20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65         pPg->pPre
7a00: 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
7a10: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
7a20: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
7a30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7a40: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
7a50: 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70  pPg );.        p
7a60: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
7a70: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
7a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7a90: 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
7aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
7ab0: 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
7ac0: 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
7ad0: 65 76 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 65  evFree;.      }e
7ae0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7af0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61  ert( pPager->pLa
7b00: 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  st==pPg );.     
7b10: 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
7b20: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
7b30: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
7b40: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
7b50: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
7b60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
7b70: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
7b80: 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  {.        pPg->p
7b90: 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
7ba0: 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
7bb0: 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Hash;.      }.  
7bc0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
7bd0: 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  evHash ){.      
7be0: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
7bf0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
7c00: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
7c10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7c20: 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73     h = pager_has
7c30: 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  h(pPg->pgno);.  
7c40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
7c50: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d  ager->aHash[h]==
7c60: 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70  pPg );.        p
7c70: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
7c80: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
7c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7ca0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
7cb0: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
7cc0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
7cd0: 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  r->nOvfl++;.    
7ce0: 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  }.    pPg->pgno 
7cf0: 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  = pgno;.    if( 
7d00: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
7d10: 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
7d20: 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
7d30: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ize ){.      pPg
7d40: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
7d50: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
7d60: 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
7d70: 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
7d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7d90: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
7da0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
7db0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70  ( pPager->aInCkp
7dc0: 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
7dd0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
7de0: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   ){.      pPg->i
7df0: 6e 43 6b 70 74 20 3d 20 28 70 50 61 67 65 72 2d  nCkpt = (pPager-
7e00: 3e 61 49 6e 43 6b 70 74 5b 70 67 6e 6f 2f 38 5d  >aInCkpt[pgno/8]
7e10: 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
7e20: 29 21 3d 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  )!=0;.    }else{
7e30: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b  .      pPg->inCk
7e40: 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  pt = 0;.    }.  
7e50: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
7e60: 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20  ;.    pPg->nRef 
7e70: 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f  = 1;.    REFINFO
7e80: 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65  (pPg);.    pPage
7e90: 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68  r->nRef++;.    h
7ea0: 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67   = pager_hash(pg
7eb0: 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  no);.    pPg->pN
7ec0: 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
7ed0: 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
7ee0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
7ef0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
7f00: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
7f10: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7f20: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
7f30: 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
7f40: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
7f50: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
7f60: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
7f70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
7f80: 69 7a 65 3c 30 20 29 20 73 71 6c 69 74 65 70 61  ize<0 ) sqlitepa
7f90: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
7fa0: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
7fb0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
7fc0: 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  nt)pgno ){.     
7fd0: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
7fe0: 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53  _DATA(pPg), 0, S
7ff0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
8000: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8010: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
8020: 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70   sqliteOsSeek(&p
8030: 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
8040: 2d 31 29 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  -1)*SQLITE_PAGE_
8050: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63 20  SIZE);.      rc 
8060: 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26  = sqliteOsRead(&
8070: 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
8080: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
8090: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
80a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
80b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
80c0: 20 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c 65        off_t file
80d0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
80e0: 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69  ( sqliteOsFileSi
80f0: 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26  ze(&pPager->fd,&
8100: 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54  fileSize)!=SQLIT
8110: 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
8120: 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e      || fileSize>
8130: 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47  =pgno*SQLITE_PAG
8140: 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
8150: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8160: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8170: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
8180: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
8190: 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  ), 0, SQLITE_PAG
81a0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
81b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
81c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
81d0: 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20  >nExtra>0 ){.   
81e0: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
81f0: 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30  TO_EXTRA(pPg), 0
8200: 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
8210: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
8220: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
8230: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69  uested page is i
8240: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
8250: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
8260: 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67  >nHit++;.    pag
8270: 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
8280: 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44    *ppPage = PGHD
8290: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
82a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
82b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
82c0: 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
82d0: 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
82e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
82f0: 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
8300: 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
8310: 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
8320: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
8330: 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
8340: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
8350: 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
8360: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
8370: 74 65 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20  tepager_get().  
8380: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
8390: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
83a0: 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
83b0: 65 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20  epager_get() is 
83c0: 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
83d0: 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
83e0: 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
83f0: 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
8400: 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
8410: 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
8420: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
8430: 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
8440: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
8450: 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
8460: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
8470: 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
8480: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
8490: 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  litepager_lookup
84a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
84b0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
84c0: 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
84d0: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
84e0: 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
84f0: 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
8500: 20 2a 2f 20 0a 20 20 69 66 28 20 70 50 61 67 65   */ .  if( pPage
8510: 72 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  r==0 || pgno==0 
8520: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
8530: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
8540: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50  r->errMask & ~(P
8550: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29  AGER_ERR_FULL) )
8560: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8570: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
8580: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
8590: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
85a0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
85b0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
85c0: 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
85d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61  ) return 0;.  pa
85e0: 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
85f0: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
8600: 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
8610: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
8620: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
8630: 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
8640: 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
8650: 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
8660: 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
8670: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
8680: 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
8690: 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
86a0: 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
86b0: 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
86c0: 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
86d0: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
86e0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
86f0: 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
8700: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 75 6e  t sqlitepager_un
8710: 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
8720: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
8730: 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
8740: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
8750: 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
8760: 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44  e.  */.  pPg = D
8770: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
8780: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ta);.  assert( p
8790: 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
87a0: 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52  pPg->nRef--;.  R
87b0: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
87c0: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
87d0: 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
87e0: 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
87f0: 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
8800: 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
8810: 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
8820: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
8830: 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
8840: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
8850: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
8860: 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
8870: 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
8880: 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20  pNextFree = 0;. 
8890: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
88a0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  e = pPager->pLas
88b0: 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
88c0: 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Last = pPg;.    
88d0: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
88e0: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
88f0: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
8900: 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20  tFree = pPg;.   
8910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
8920: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
8930: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
8940: 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72  ( pPager->xDestr
8950: 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70  uctor ){.      p
8960: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
8970: 6f 72 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  or(pData);.    }
8980: 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  .  .    /* When 
8990: 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20  all pages reach 
89a0: 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72  the freelist, dr
89b0: 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  op the read lock
89c0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
89d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
89e0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
89f0: 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61  r->nRef--;.    a
8a00: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
8a10: 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Ref>=0 );.    if
8a20: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
8a30: 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  0 ){.      pager
8a40: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
8a50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8a60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8a70: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
8a80: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
8a90: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
8aa0: 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
8ab0: 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
8ac0: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
8ad0: 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
8ae0: 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65     *  sqlitepage
8af0: 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61  r_commit() is ca
8b00: 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
8b10: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
8b20: 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
8b30: 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61  **   *  sqlitepa
8b40: 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63  ger_close() is c
8b50: 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
8b60: 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
8b70: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
8b80: 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e  on every outstan
8b90: 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  ding page..**.**
8ba0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 74   The parameter t
8bb0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
8bc0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
8bd0: 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20  ny open page of 
8be0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
8bf0: 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63  file.  Nothing c
8c00: 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65  hanges about the
8c10: 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73   page - it is us
8c20: 65 64 20 6d 65 72 65 6c 79 0a 2a 2a 20 74 6f 20  ed merely.** to 
8c30: 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65  acquire a pointe
8c40: 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
8c50: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20  tructure and as 
8c60: 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65  proof that there
8c70: 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 61  .** is already a
8c80: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
8c90: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
8ca0: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
8cb0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 77 72 69  e is already wri
8cc0: 74 65 2d 6c 6f 63 6b 65 64 2c 20 74 68 69 73 20  te-locked, this 
8cd0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
8ce0: 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
8cf0: 65 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69  epager_begin(voi
8d00: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
8d10: 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
8d20: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
8d30: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
8d40: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
8d50: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8d60: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
8d70: 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
8d80: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
8d90: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e  state!=SQLITE_UN
8da0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
8db0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c  ager->state==SQL
8dc0: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 29 7b 0a  ITE_READLOCK ){.
8dd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8de0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
8df0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
8e00: 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b 28  liteOsWriteLock(
8e10: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
8e20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8e30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
8e40: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
8e50: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
8e60: 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  rnal = sqliteMal
8e70: 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
8e80: 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20  ize/8 + 1 );.   
8e90: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
8ea0: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
8eb0: 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64      sqliteOsRead
8ec0: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
8ed0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8ee0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8ef0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
8f00: 69 74 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  iteOsOpenExclusi
8f10: 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ve(pPager->zJour
8f20: 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
8f30: 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  d,pPager->tempFi
8f40: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  le);.    if( rc!
8f50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8f60: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
8f70: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
8f80: 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  l);.      pPager
8f90: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
8fa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73  ;.      sqliteOs
8fb0: 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  ReadLock(&pPager
8fc0: 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 72 65 74  ->fd);.      ret
8fd0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
8fe0: 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  PEN;.    }.    p
8ff0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
9000: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
9010: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
9020: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
9030: 72 74 79 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20  rtyFile = 0;.   
9040: 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
9050: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
9060: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
9070: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
9080: 4b 3b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67  K;.    sqlitepag
9090: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
90a0: 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
90b0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
90c0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
90d0: 20 20 20 69 66 28 20 70 61 67 65 72 5f 6f 6c 64     if( pager_old
90e0: 5f 66 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 20  _format ){.     
90f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
9100: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
9110: 2c 20 61 4f 6c 64 4a 6f 75 72 6e 61 6c 4d 61 67  , aOldJournalMag
9120: 69 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ic,.            
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
9140: 65 6f 66 28 61 4f 6c 64 4a 6f 75 72 6e 61 6c 4d  eof(aOldJournalM
9150: 61 67 69 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  agic));.    }els
9160: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
9170: 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61  liteOsWrite(&pPa
9180: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
9190: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
91a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
91b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
91c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
91d0: 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
91e0: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
91f0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  jfd, pPager->dbS
9200: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
9210: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9220: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
9230: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
9240: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
9250: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9260: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
9270: 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
9280: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9290: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
92a0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
92b0: 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
92c0: 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
92d0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
92e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
92f0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
9300: 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
9310: 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
9320: 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
9330: 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
9340: 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
9350: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
9360: 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
9370: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
9380: 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
9390: 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
93a0: 64 20 61 63 71 75 69 72 65 73 20 61 20 77 72 69  d acquires a wri
93b0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
93c0: 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65  atabase.  If the
93d0: 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 63   write.** lock c
93e0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
93f0: 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
9400: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
9410: 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
9420: 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
9430: 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
9440: 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
9450: 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
9460: 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
9470: 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
9480: 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
9490: 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
94a0: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
94b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
94c0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
94d0: 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
94e0: 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
94f0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
9500: 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
9510: 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
9520: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
9530: 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
9540: 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
9550: 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
9560: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
9570: 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
9580: 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
9590: 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  tepager_commit()
95a0: 20 6f 72 20 73 71 6c 69 74 65 70 61 67 65 72 5f   or sqlitepager_
95b0: 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a  rollback() to.**
95c0: 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73   reset..*/.int s
95d0: 71 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74 65  qlitepager_write
95e0: 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
95f0: 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
9600: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
9610: 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
9620: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
9630: 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
9640: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
9650: 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
9660: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
9670: 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20  r->errMask ){ . 
9680: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
9690: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
96a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
96b0: 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
96c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
96d0: 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _PERM;.  }..  /*
96e0: 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
96f0: 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
9700: 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
9710: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
9720: 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
9730: 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
9740: 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
9750: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69  ..  */.  pPg->di
9760: 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  rty = 1;.  if( p
9770: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
9780: 20 28 70 50 67 2d 3e 69 6e 43 6b 70 74 20 7c 7c   (pPg->inCkpt ||
9790: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
97a0: 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
97b0: 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20  ager->dirtyFile 
97c0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
97d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
97e0: 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
97f0: 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
9800: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
9810: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a  needs to be.  **
9820: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
9830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
9840: 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
9850: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
9860: 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a  ** or both..  **
9870: 0a 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63  .  ** First chec
9880: 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
9890: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
98a0: 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
98b0: 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20  .  ** create it 
98c0: 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
98d0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
98e0: 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51  Pager->state!=SQ
98f0: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  LITE_UNLOCK );. 
9900: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
9910: 72 5f 62 65 67 69 6e 28 70 44 61 74 61 29 3b 0a  r_begin(pData);.
9920: 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46    pPager->dirtyF
9930: 69 6c 65 20 3d 20 31 3b 0a 20 20 69 66 28 20 72  ile = 1;.  if( r
9940: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
9950: 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65  eturn rc;.  asse
9960: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
9970: 65 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e==SQLITE_WRITEL
9980: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9990: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
99a0: 4f 70 65 6e 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  Open );..  /* Th
99b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
99c0: 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
99d0: 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 77   and we have a w
99e0: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
99f0: 0a 20 20 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62  .  ** main datab
9a00: 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
9a10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
9a20: 65 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  e to the transac
9a30: 74 69 6f 6e 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  tion .  ** journ
9a40: 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
9a50: 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
9a60: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e   */.  if( !pPg->
9a70: 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
9a80: 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
9a90: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
9aa0: 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72  e ){.    rc = wr
9ab0: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
9ac0: 72 2d 3e 6a 66 64 2c 20 70 50 67 2d 3e 70 67 6e  r->jfd, pPg->pgn
9ad0: 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  o);.    if( rc==
9ae0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9af0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
9b00: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
9b10: 66 64 2c 20 70 44 61 74 61 2c 20 53 51 4c 49 54  fd, pData, SQLIT
9b20: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
9b30: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
9b40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9b50: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72     sqlitepager_r
9b60: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
9b70: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
9b80: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
9b90: 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
9ba0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
9bb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
9bc0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
9bd0: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
9be0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
9bf0: 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
9c00: 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
9c10: 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
9c20: 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
9c30: 6f 53 79 6e 63 3b 0a 20 20 20 20 70 50 67 2d 3e  oSync;.    pPg->
9c40: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
9c50: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63     if( pPager->c
9c60: 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  kptInUse ){.    
9c70: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70    pPager->aInCkp
9c80: 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
9c90: 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
9ca0: 37 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  7);.      pPg->i
9cb0: 6e 43 6b 70 74 20 3d 20 31 3b 0a 20 20 20 20 7d  nCkpt = 1;.    }
9cc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
9cd0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
9ce0: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
9cf0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
9d00: 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65   in it,.  ** the
9d10: 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
9d20: 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
9d30: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
9d40: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  al..  */.  if( p
9d50: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
9d60: 20 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74   && !pPg->inCkpt
9d70: 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
9d80: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74  no<=pPager->ckpt
9d90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
9da0: 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
9db0: 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
9dc0: 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
9dd0: 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 72  gDbSize );.    r
9de0: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
9df0: 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 70  &pPager->cpfd, p
9e00: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
9e10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9e20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
9e30: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
9e40: 61 67 65 72 2d 3e 63 70 66 64 2c 20 70 44 61 74  ager->cpfd, pDat
9e50: 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  a, SQLITE_PAGE_S
9e60: 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IZE);.    }.    
9e70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9e80: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
9e90: 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  epager_rollback(
9ea0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
9eb0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
9ec0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
9ed0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
9ee0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
9ef0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
9f00: 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Ckpt!=0 );.    p
9f10: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70  Pager->aInCkpt[p
9f20: 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
9f30: 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
9f40: 0a 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74  .    pPg->inCkpt
9f50: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
9f60: 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
9f70: 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
9f80: 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
9f90: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
9fa0: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
9fb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
9fc0: 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
9fd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9fe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9ff0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
a000: 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
a010: 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
a020: 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
a030: 2a 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72  * to sqlitepager
a040: 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  _write().  In ot
a050: 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
a060: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
a070: 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
a080: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
a090: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20  he page..*/.int 
a0a0: 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77 72  sqlitepager_iswr
a0b0: 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44  iteable(void *pD
a0c0: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
a0d0: 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
a0e0: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  DR(pData);.  ret
a0f0: 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a  urn pPg->dirty;.
a100: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
a110: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
a120: 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
a130: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
a140: 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
a150: 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
a160: 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67  tion on page "pg
a170: 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20  no" back to the 
a180: 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
a190: 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
a1a0: 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
a1b0: 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
a1c0: 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
a1d0: 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
a1e0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
a1f0: 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
a200: 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
a210: 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
a220: 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
a230: 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
a240: 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
a250: 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
a260: 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
a270: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
a280: 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
a290: 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
a2a0: 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
a2b0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e   sqlitepager_don
a2c0: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  t_rollback() bel
a2d0: 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
a2e0: 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
a2f0: 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
a300: 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
a310: 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
a320: 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
a330: 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
a340: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
a350: 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
a360: 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
a370: 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
a380: 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
a390: 6c 73 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65  ls to sqlitepage
a3a0: 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
a3b0: 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
a3c0: 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
a3d0: 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
a3e0: 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
a3f0: 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
a400: 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
a410: 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
a420: 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
a430: 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
a440: 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
a450: 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
a460: 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
a470: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
a480: 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
a490: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
a4a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
a4b0: 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
a4c0: 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
a4d0: 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
a4e0: 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
a4f0: 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
a500: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a510: 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
a520: 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72  d,.** the dont_r
a530: 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
a540: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
a550: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  t because the pa
a560: 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63  ge contains.** c
a570: 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
a580: 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
a590: 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72  e sure it gets r
a5a0: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
a5b0: 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f  ite.** of the do
a5c0: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61  nt_rollback() ca
a5d0: 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ll..*/.void sqli
a5e0: 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69  tepager_dont_wri
a5f0: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
a600: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
a610: 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70  PgHdr *pPg;..  p
a620: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
a630: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
a640: 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  .  pPg->alwaysRo
a650: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66  llback = 1;.  if
a660: 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69  ( pPg && pPg->di
a670: 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  rty ){.    if( p
a680: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
a690: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26  int)pPg->pgno &&
a6a0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
a6b0: 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
a6c0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
a6d0: 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
a6e0: 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
a6f0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
a700: 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
a710: 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
a720: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
a730: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
a740: 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
a750: 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
a760: 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
a770: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
a780: 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
a790: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
a7a0: 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
a7b0: 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
a7c0: 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
a7d0: 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
a7e0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
a7f0: 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
a800: 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
a810: 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
a820: 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
a830: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
a840: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
a850: 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
a860: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
a870: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
a880: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
a890: 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
a8a0: 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
a8b0: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
a8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a8d0: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
a8e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a8f0: 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
a900: 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
a910: 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
a920: 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
a930: 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
a940: 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
a950: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
a960: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
a970: 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
a980: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
a990: 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
a9a0: 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
a9b0: 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
a9c0: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
a9d0: 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nal..*/.void sql
a9e0: 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  itepager_dont_ro
a9f0: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61  llback(void *pDa
aa00: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
aa10: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
aa20: 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
aa30: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
aa40: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20  >pPager;..  if( 
aa50: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53  pPager->state!=S
aa60: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
aa70: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
aa80: 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75  alOpen==0 ) retu
aa90: 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61  rn;.  if( pPg->a
aaa0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
aab0: 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
aac0: 6f 6c 6c 62 61 63 6b 20 29 20 72 65 74 75 72 6e  ollback ) return
aad0: 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  ;.  if( !pPg->in
aae0: 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
aaf0: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
ab00: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
ab10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ab20: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
ab30: 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l!=0 );.    pPag
ab40: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
ab50: 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
ab60: 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
ab70: 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
ab80: 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  nal = 1;.    if(
ab90: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55   pPager->ckptInU
aba0: 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  se ){.      pPag
abb0: 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d  er->aInCkpt[pPg-
abc0: 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
abd0: 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
abe0: 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20      pPg->inCkpt 
abf0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
ac00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70   if( pPager->ckp
ac10: 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e  tInUse && !pPg->
ac20: 69 6e 43 6b 70 74 20 26 26 20 28 69 6e 74 29 70  inCkpt && (int)p
ac30: 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
ac40: 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b 0a 20 20  ->ckptSize ){.  
ac50: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
ac60: 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
ac70: 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
ac80: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
ac90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
aca0: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 21 3d 30 20  ger->aInCkpt!=0 
acb0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
acc0: 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f  InCkpt[pPg->pgno
acd0: 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
ace0: 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67  pgno&7);.    pPg
acf0: 2d 3e 69 6e 43 6b 70 74 20 3d 20 31 3b 0a 20 20  ->inCkpt = 1;.  
ad00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  }.}../*.** Commi
ad10: 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
ad20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
ad30: 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
ad40: 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
ad50: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
ad60: 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
ad70: 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
ad80: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
ad90: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
ada0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
adb0: 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
adc0: 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
add0: 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
ade0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
adf0: 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65  ager_commit(Page
ae00: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
ae10: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
ae20: 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
ae30: 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45  r->errMask==PAGE
ae40: 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
ae50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67    rc = sqlitepag
ae60: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
ae70: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
ae80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ae90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
aea0: 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  FULL;.    }.    
aeb0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
aec0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
aed0: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
aee0: 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
aef0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
af00: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
af10: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
af20: 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e!=SQLITE_WRITEL
af30: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
af40: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
af50: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
af60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
af70: 6e 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  n );.  if( pPage
af80: 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d 3d 30 20  r->dirtyFile==0 
af90: 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65  ){.    /* Exit e
afa0: 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f  arly (without do
afb0: 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e  ing the time-con
afc0: 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 4f 73 53  suming sqliteOsS
afd0: 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20  ync() calls).   
afe0: 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76   ** if there hav
aff0: 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
b000: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
b010: 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72  e file. */.    r
b020: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
b030: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
b040: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
b050: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75  e = -1;.    retu
b060: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
b070: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
b080: 63 20 26 26 20 73 71 6c 69 74 65 4f 73 53 79 6e  c && sqliteOsSyn
b090: 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 21  c(&pPager->jfd)!
b0a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b0b0: 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
b0c0: 6f 72 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70  ort;.  }.  for(p
b0d0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
b0e0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
b0f0: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
b100: 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
b110: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
b120: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 65 65  rc = sqliteOsSee
b130: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
b140: 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 53 51 4c  pPg->pgno-1)*SQL
b150: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
b160: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b170: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
b180: 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 20 20 72  mit_abort;.    r
b190: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
b1a0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  e(&pPager->fd, P
b1b0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
b1c0: 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ), SQLITE_PAGE_S
b1d0: 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63  IZE);.    if( rc
b1e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
b1f0: 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
b200: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
b210: 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71  er->noSync && sq
b220: 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67  liteOsSync(&pPag
b230: 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f  er->fd)!=SQLITE_
b240: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
b250: 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d  ommit_abort;.  }
b260: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e  .  rc = pager_un
b270: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
b280: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
b290: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
b2a0: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  rn rc;..  /* Jum
b2b0: 70 20 68 65 72 65 20 69 66 20 61 6e 79 74 68 69  p here if anythi
b2c0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75  ng goes wrong du
b2d0: 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
b2e0: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f  process..  */.co
b2f0: 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63  mmit_abort:.  rc
b300: 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72   = sqlitepager_r
b310: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
b320: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b330: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
b340: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
b350: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b360: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
b370: 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
b380: 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
b390: 73 20 62 61 63 6b 20 74 6f 20 72 65 61 64 2d 6f  s back to read-o
b3a0: 6e 6c 79 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  nly mode..** All
b3b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
b3c0: 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
b3d0: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
b3e0: 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
b3f0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
b400: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
b410: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
b420: 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
b430: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
b440: 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
b450: 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
b460: 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
b470: 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54  col (SQLITE_PROT
b480: 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20  OCOL) or unless 
b490: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
b4a0: 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
b4b0: 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
b4c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
b4d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
b4e0: 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
b4f0: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
b500: 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
b510: 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
b520: 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
b530: 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
b540: 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
b550: 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
b560: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
b570: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
b580: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f  t sqlitepager_ro
b590: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
b5a0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
b5b0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
b5c0: 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61  rrMask!=0 && pPa
b5d0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41  ger->errMask!=PA
b5e0: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
b5f0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b600: 73 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52  state>=SQLITE_WR
b610: 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ITELOCK ){.     
b620: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
b630: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
b640: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
b650: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
b660: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
b670: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
b680: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20  _WRITELOCK ){.  
b690: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b6a0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  OK;.  }.  rc = p
b6b0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
b6c0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
b6d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b6e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
b6f0: 52 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65  RRUPT;.    pPage
b700: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
b710: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b  GER_ERR_CORRUPT;
b720: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
b730: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65  bSize = -1;.  re
b740: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b750: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
b760: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b770: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
b780: 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
b790: 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
b7a0: 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
b7b0: 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
b7c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
b7d0: 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
b7e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b7f0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
b800: 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
b810: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b820: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
b830: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
b840: 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
b850: 73 71 6c 69 74 65 70 61 67 65 72 5f 73 74 61 74  sqlitepager_stat
b860: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
b870: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
b880: 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50  [9];.  a[0] = pP
b890: 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b  ager->nRef;.  a[
b8a0: 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61  1] = pPager->nPa
b8b0: 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61  ge;.  a[2] = pPa
b8c0: 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61  ger->mxPage;.  a
b8d0: 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
b8e0: 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
b8f0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
b900: 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
b910: 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d  rrMask;.  a[6] =
b920: 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
b930: 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
b940: 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
b950: 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20  pPager->nOvfl;. 
b960: 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a   return a;.}../*
b970: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 68 65 63  .** Set the chec
b980: 6b 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  kpoint..**.** Th
b990: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
b9a0: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
b9b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
b9c0: 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
b9d0: 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
b9e0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
b9f0: 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
ba00: 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
ba10: 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
ba20: 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
ba30: 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
ba40: 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
ba50: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
ba60: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63  nt sqlitepager_c
ba70: 6b 70 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20  kpt_begin(Pager 
ba80: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
ba90: 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  rc;.  char zTemp
baa0: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
bab0: 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74  _SIZE];.  assert
bac0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
bad0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73 65 72  lOpen );.  asser
bae0: 74 28 20 21 70 50 61 67 65 72 2d 3e 63 6b 70 74  t( !pPager->ckpt
baf0: 49 6e 55 73 65 20 29 3b 0a 20 20 70 50 61 67 65  InUse );.  pPage
bb00: 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 73 71 6c  r->aInCkpt = sql
bb10: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
bb20: 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
bb30: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
bb40: 3e 61 49 6e 43 6b 70 74 3d 3d 30 20 29 7b 0a 20  >aInCkpt==0 ){. 
bb50: 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c     sqliteOsReadL
bb60: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
bb70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
bb80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
bb90: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69   rc = sqliteOsFi
bba0: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
bbb0: 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  jfd, &pPager->ck
bbc0: 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ptJSize);.  if( 
bbd0: 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62  rc ) goto ckpt_b
bbe0: 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 70  egin_failed;.  p
bbf0: 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20  Pager->ckptSize 
bc00: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
bc10: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
bc20: 3e 63 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >ckptOpen ){.   
bc30: 20 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65   rc = sqlitepage
bc40: 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70  r_opentemp(zTemp
bc50: 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66 64 29  , &pPager->cpfd)
bc60: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
bc70: 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e 5f 66  oto ckpt_begin_f
bc80: 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65  ailed;.    pPage
bc90: 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 31 3b  r->ckptOpen = 1;
bca0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63  .  }.  pPager->c
bcb0: 6b 70 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  kptInUse = 1;.  
bcc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bcd0: 3b 0a 20 0a 63 6b 70 74 5f 62 65 67 69 6e 5f 66  ;. .ckpt_begin_f
bce0: 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61  ailed:.  if( pPa
bcf0: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 7b 0a  ger->aInCkpt ){.
bd00: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
bd10: 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 29 3b  Pager->aInCkpt);
bd20: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
bd30: 43 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Ckpt = 0;.  }.  
bd40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bd50: 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 63 68 65  .** Commit a che
bd60: 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  ckpoint..*/.int 
bd70: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
bd80: 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  _commit(Pager *p
bd90: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
bda0: 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
bdb0: 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
bdc0: 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 53  g;.    sqliteOsS
bdd0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 63 70 66  eek(&pPager->cpf
bde0: 64 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  d, 0);.    sqlit
bdf0: 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  eOsTruncate(&pPa
be00: 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a 20  ger->cpfd, 0);. 
be10: 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49     pPager->ckptI
be20: 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  nUse = 0;.    sq
be30: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
be40: 2d 3e 61 49 6e 43 6b 70 74 20 29 3b 0a 20 20 20  ->aInCkpt );.   
be50: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
be60: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
be70: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
be80: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
be90: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
bea0: 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a  Pg->inCkpt = 0;.
beb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
bec0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
bed0: 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
bee0: 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f  a checkpoint..*/
bef0: 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72  .int sqlitepager
bf00: 5f 63 6b 70 74 5f 72 6f 6c 6c 62 61 63 6b 28 50  _ckpt_rollback(P
bf10: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bf20: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
bf30: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
bf40: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
bf50: 65 72 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b  er_ckpt_playback
bf60: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
bf70: 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63  litepager_ckpt_c
bf80: 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
bf90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
bfa0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
bfb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
bfc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
bfd0: 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  ST./*.** Print a
bfe0: 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20   listing of all 
bff0: 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  referenced pages
c000: 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63   and their ref c
c010: 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
c020: 6c 69 74 65 70 61 67 65 72 5f 72 65 66 64 75 6d  litepager_refdum
c030: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  p(Pager *pPager)
c040: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
c050: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
c060: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
c070: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
c080: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
c090: 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ef<=0 ) continue
c0a0: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 41  ;.    printf("PA
c0b0: 47 45 20 25 33 64 20 61 64 64 72 3d 30 78 25 30  GE %3d addr=0x%0
c0c0: 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a  8x nRef=%d\n", .
c0d0: 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
c0e0: 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f  , (int)PGHDR_TO_
c0f0: 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
c100: 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
c110: 64 69 66 0a                                      dif.