/ Hex Artifact Content
Login

Artifact 58ae9f569b3c664ea9205c6f6da432e3ae180f56:


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 34 37  : pager.c,v 1.47
0350: 20 32 30 30 32 2f 30 36 2f 32 35 20 31 34 3a 34   2002/06/25 14:4
0360: 33 3a 35 38 20 64 72 68 20 45 78 70 20 24 0a 2a  3:58 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0380: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
0390: 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e 63  e "pager.h".#inc
03a0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63  lude "os.h".#inc
03b0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
03c0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
03d0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  .h>../*.** The p
03e0: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
03f0: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0400: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0410: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0420: 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  :.**.**   SQLITE
0430: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 54 68  _UNLOCK       Th
0440: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0450: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
0460: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0490: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
04a0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
04d0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
04e0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0500: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0510: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 52 45 41  .**   SQLITE_REA
0520: 44 4c 4f 43 4b 20 20 20 20 20 54 68 65 20 70 61  DLOCK     The pa
0530: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0540: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0550: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0560: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0570: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0580: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0590: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
05b0: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
05c0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
05d0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0600: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0610: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0620: 4b 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61  K    The page ca
0630: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0640: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0670: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0680: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0690: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
06a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
06b0: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
06c0: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
06d0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0700: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
0710: 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20 75  ge cache comes u
0720: 70 20 69 6e 20 53 51 4c 49 54 45 5f 55 4e 4c 4f  p in SQLITE_UNLO
0730: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0740: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 5f  ime a.** sqlite_
0750: 70 61 67 65 5f 67 65 74 28 29 20 6f 63 63 75 72  page_get() occur
0760: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0770: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53 51 4c 49  nsitions to SQLI
0780: 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2a 20  TE_READLOCK..** 
0790: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
07a0: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
07b0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
07c0: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
07d0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
07e0: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 53  itions back to S
07f0: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54  QLITE_UNLOCK.  T
0800: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0810: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0820: 65 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c  e_write() is cal
0830: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0840: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0850: 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43   SQLITE_WRITELOC
0860: 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  K.  (Note that s
0870: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0880: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0890: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
08a0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
08b0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
08c0: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
08d0: 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49 54 45 5f  ** be in SQLITE_
08e0: 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f 72 65 20  READLOCK before 
08f0: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0900: 6f 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  o SQLITE_WRITELO
0910: 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73 71 6c 69  CK.).** The sqli
0920: 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62 61 63 6b  te_page_rollback
0930: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 5f 70 61  () and sqlite_pa
0940: 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66 75 6e 63  ge_commit() func
0950: 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61 6e 73 69  tions .** transi
0960: 74 69 6f 6e 20 74 68 65 20 73 74 61 74 65 20 66  tion the state f
0970: 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52 49 54 45  rom SQLITE_WRITE
0980: 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20 53 51 4c  LOCK back to SQL
0990: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2f  ITE_READLOCK..*/
09a0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
09b0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64  UNLOCK      0.#d
09c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 45 41  efine SQLITE_REA
09d0: 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64 65 66 69  DLOCK    1.#defi
09e0: 6e 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  ne SQLITE_WRITEL
09f0: 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a 2a 2a 20  OCK   2.../*.** 
0a00: 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  Each in-memory i
0a10: 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62  mage of a page b
0a20: 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66  egins with the f
0a30: 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e  ollowing header.
0a40: 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20  .** This header 
0a50: 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20  is only visible 
0a60: 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f  to this pager mo
0a70: 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e  dule.  The clien
0a80: 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63  t.** code that c
0a90: 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20  alls pager sees 
0aa0: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68  only the data th
0ab0: 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68  at follows the h
0ac0: 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  eader..*/.typede
0ad0: 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50  f struct PgHdr P
0ae0: 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48  gHdr;.struct PgH
0af0: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
0b00: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
0b10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
0b20: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
0b30: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
0b40: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b60: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
0b70: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
0b80: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
0b90: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
0ba0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
0bb0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
0bc0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
0bd0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
0c00: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
0c10: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
0c20: 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46  extFree, *pPrevF
0c30: 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73  ree;  /* Freelis
0c40: 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65  t of pages where
0c50: 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67   nRef==0 */.  Pg
0c60: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 2c 20 2a  Hdr *pNextAll, *
0c70: 70 50 72 65 76 41 6c 6c 3b 20 20 20 20 2f 2a 20  pPrevAll;    /* 
0c80: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
0c90: 67 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 69 6e  ges */.  char in
0ca0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0cb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
0cc0: 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  if has been writ
0cd0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
0ce0: 2f 0a 20 20 63 68 61 72 20 69 6e 43 6b 70 74 3b  /.  char 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 63 68 61 72 20 64 69 72 74 79 3b  */.  char 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 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45    /* SQLITE_PAGE
0d90: 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20 70  _SIZE bytes of p
0da0: 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  age data follow 
0db0: 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20  this header */. 
0dc0: 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61   /* Pager.nExtra
0dd0: 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20   bytes of local 
0de0: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20  data follow the 
0df0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a  page data */.};.
0e00: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
0e10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67   pointer to a Pg
0e20: 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  Hdr into a point
0e30: 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a  er to its data.*
0e40: 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e  * and back again
0e50: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48  ..*/.#define PGH
0e60: 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28  DR_TO_DATA(P)  (
0e70: 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29  (void*)(&(P)[1])
0e80: 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54  ).#define DATA_T
0e90: 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28  O_PGHDR(D)  (&((
0ea0: 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29  PgHdr*)(D))[-1])
0eb0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
0ec0: 4f 5f 45 58 54 52 41 28 50 29 20 28 28 76 6f 69  O_EXTRA(P) ((voi
0ed0: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  d*)&((char*)(&(P
0ee0: 29 5b 31 5d 29 29 5b 53 51 4c 49 54 45 5f 50 41  )[1]))[SQLITE_PA
0ef0: 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f 2a 0a 2a 2a  GE_SIZE])../*.**
0f00: 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65   How big to make
0f10: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
0f20: 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e  used for locatin
0f30: 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  g in-memory page
0f40: 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d  s.** by page num
0f50: 62 65 72 2e 20 20 4b 6e 75 74 68 20 73 61 79 73  ber.  Knuth says
0f60: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   this should be 
0f70: 61 20 70 72 69 6d 65 20 6e 75 6d 62 65 72 2e 0a  a prime number..
0f80: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f  */.#define N_PG_
0f90: 48 41 53 48 20 32 30 30 33 0a 0a 2f 2a 0a 2a 2a  HASH 2003../*.**
0fa0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
0fb0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
0fc0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0fd0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
0fe0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
0ff0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1000: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1010: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1020: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1030: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
1040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1050: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
1060: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46  al file */.  OsF
1070: 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20 20 20  ile fd, jfd;    
1080: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1090: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
10a0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
10b0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c  urnal */.  OsFil
10c0: 65 20 63 70 66 64 3b 20 20 20 20 20 20 20 20 20  e cpfd;         
10d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
10e0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
10f0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
1100: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rnal */.  int db
1110: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1120: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1130: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1140: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
1150: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
1160: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
1170: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
1180: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
1190: 6e 74 20 63 6b 70 74 53 69 7a 65 2c 20 63 6b 70  nt ckptSize, ckp
11a0: 74 4a 53 69 7a 65 3b 20 20 20 20 2f 2a 20 53 69  tJSize;    /* Si
11b0: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 61  ze of database a
11c0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 61 74 20 63 6b  nd journal at ck
11d0: 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  pt_begin() */.  
11e0: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1200: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
1210: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
1220: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76  mory page */.  v
1230: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
1240: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61  r)(void*); /* Ca
1250: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
1260: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
1270: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  es */.  int nPag
1280: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1290: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
12a0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
12b0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
12c0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
12d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12e0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
12f0: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
1300: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
1310: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
1320: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
1330: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
1340: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
1350: 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69  che */.  int nHi
1360: 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b  t, nMiss, nOvfl;
1370: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
1380: 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64  ts, missing, and
1390: 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a   LRU overflows *
13a0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
13b0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
13c0: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
13d0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
13e0: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
13f0: 20 20 75 38 20 63 6b 70 74 4f 70 65 6e 3b 20 20    u8 ckptOpen;  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1410: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 68 65   True if the che
1420: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
1430: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
1440: 63 6b 70 74 49 6e 55 73 65 3b 20 20 20 20 20 20  ckptInUse;      
1450: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1460: 20 77 65 20 61 72 65 20 69 6e 20 61 20 63 68 65   we are in a che
1470: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20  ckpoint */.  u8 
1480: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
1490: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
14a0: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
14b0: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
14c0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e0: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f  SQLITE_UNLOCK, _
14f0: 52 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52 49  READLOCK or _WRI
1500: 54 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 38 20 65  TELOCK */.  u8 e
1510: 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rrMask;         
1520: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1530: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
1540: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75  of errors */.  u
1550: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
1560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
1570: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
1580: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
1590: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15b0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
15c0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
15d0: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15f0: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79  * True if an fsy
1600: 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f  nc() is needed o
1610: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1620: 0a 20 20 75 38 20 64 69 72 74 79 46 69 6c 65 3b  .  u8 dirtyFile;
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1640: 2a 20 54 72 75 65 20 69 66 20 64 61 74 61 62 61  * True if databa
1650: 73 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  se file has chan
1660: 67 65 64 20 69 6e 20 61 6e 79 20 77 61 79 20 2a  ged in any way *
1670: 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e  /.  u8 *aInJourn
1680: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1690: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
16a0: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
16b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
16c0: 0a 20 20 75 38 20 2a 61 49 6e 43 6b 70 74 3b 20  .  u8 *aInCkpt; 
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16e0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
16f0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
1700: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 48  atabase */.  PgH
1710: 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61  dr *pFirst, *pLa
1720: 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
1730: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a   of free pages *
1740: 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b  /.  PgHdr *pAll;
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70  /* List of all p
1770: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
1780: 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48  *aHash[N_PG_HASH
1790: 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61  ];    /* Hash ta
17a0: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
17b0: 6e 75 6d 62 65 72 20 6f 66 20 50 67 48 64 72 20  number of PgHdr 
17c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
17d0: 73 65 20 61 72 65 20 62 69 74 73 20 74 68 61 74  se are bits that
17e0: 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50   can be set in P
17f0: 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f  ager.errMask..*/
1800: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1810: 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31  RR_FULL     0x01
1820: 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66    /* a write() f
1830: 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ailed */.#define
1840: 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20   PAGER_ERR_MEM  
1850: 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c      0x02  /* mal
1860: 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  loc() failed */.
1870: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
1880: 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20  R_LOCK     0x04 
1890: 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65   /* error in the
18a0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
18b0: 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  l */.#define PAG
18c0: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20  ER_ERR_CORRUPT  
18d0: 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73  0x08  /* databas
18e0: 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  e or journal cor
18f0: 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69  ruption */.#defi
1900: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53  ne PAGER_ERR_DIS
1910: 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67  K     0x10  /* g
1920: 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20  eneral disk I/O 
1930: 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64  error - bad hard
1940: 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a   drive? */../*.*
1950: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1960: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 70 61 67 65  le contains page
1970: 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
1980: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72  following.** for
1990: 6d 61 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  mat..*/.typedef 
19a0: 73 74 72 75 63 74 20 50 61 67 65 52 65 63 6f 72  struct PageRecor
19b0: 64 20 50 61 67 65 52 65 63 6f 72 64 3b 0a 73 74  d PageRecord;.st
19c0: 72 75 63 74 20 50 61 67 65 52 65 63 6f 72 64 20  ruct PageRecord 
19d0: 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  {.  Pgno pgno;  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
1a00: 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  umber */.  char 
1a10: 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 50 41 47  aData[SQLITE_PAG
1a20: 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 4f 72 69  E_SIZE];  /* Ori
1a30: 67 69 6e 61 6c 20 64 61 74 61 20 66 6f 72 20 70  ginal data for p
1a40: 61 67 65 20 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a  age pgno */.};..
1a50: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
1a60: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
1a70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
1a80: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
1a90: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
1aa0: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
1ab0: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
1ac0: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
1ad0: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2f 0a 73 74  ity check..*/.st
1ae0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
1af0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
1b00: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
1b10: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
1b20: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
1b30: 31 2c 20 30 78 36 33 2c 20 30 78 64 34 2c 0a 7d  1, 0x63, 0xd4,.}
1b40: 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20  ;../*.** Hash a 
1b50: 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23  page number.*/.#
1b60: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61 73  define pager_has
1b70: 68 28 50 4e 29 20 20 28 28 50 4e 29 25 4e 5f 50  h(PN)  ((PN)%N_P
1b80: 47 5f 48 41 53 48 29 0a 0a 2f 2a 0a 2a 2a 20 45  G_HASH)../*.** E
1b90: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
1ba0: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 68  count tracking h
1bb0: 65 72 65 3a 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ere:.*/.#if SQLI
1bc0: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61  TE_TEST.  int pa
1bd0: 67 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  ger_refinfo_enab
1be0: 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  le = 0;.  static
1bf0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69   void pager_refi
1c00: 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20  nfo(PgHdr *p){. 
1c10: 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e     static int cn
1c20: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  t = 0;.    if( !
1c30: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e  pager_refinfo_en
1c40: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
1c50: 20 20 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20     printf(.     
1c60: 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61    "REFCNT: %4d a
1c70: 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d  ddr=0x%08x nRef=
1c80: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
1c90: 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44  >pgno, (int)PGHD
1ca0: 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d  R_TO_DATA(p), p-
1cb0: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
1cc0: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
1cd0: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
1ce0: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
1cf0: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
1d00: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
1d10: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
1d20: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
1d30: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  O(X).#endif../*.
1d40: 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 62  ** Convert the b
1d50: 69 74 73 20 69 6e 20 74 68 65 20 70 50 61 67 65  its in the pPage
1d60: 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20  r->errMask into 
1d70: 61 6e 20 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a  an approprate.**
1d80: 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f   return code..*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1da0: 72 5f 65 72 72 63 6f 64 65 28 50 61 67 65 72 20  r_errcode(Pager 
1db0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1dc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1dd0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1de0: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
1df0: 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63 20 3d  R_LOCK )    rc =
1e00: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
1e10: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1e20: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
1e30: 45 52 52 5f 44 49 53 4b 20 29 20 20 20 20 72 63  ERR_DISK )    rc
1e40: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
1e50: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1e60: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
1e70: 52 52 5f 46 55 4c 4c 20 29 20 20 20 20 72 63 20  RR_FULL )    rc 
1e80: 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
1e90: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1ea0: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
1eb0: 5f 4d 45 4d 20 29 20 20 20 20 20 72 63 20 3d 20  _MEM )     rc = 
1ec0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1ed0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
1ee0: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
1ef0: 43 4f 52 52 55 50 54 20 29 20 72 63 20 3d 20 53  CORRUPT ) rc = S
1f00: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
1f10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f20: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
1f30: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
1f40: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
1f50: 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  e number.  Retur
1f60: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
1f70: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
1f80: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
1fa0: 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
1fb0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1fc0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
1fd0: 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  r *p = pPager->a
1fe0: 48 61 73 68 5b 70 67 6e 6f 20 25 20 4e 5f 50 47  Hash[pgno % N_PG
1ff0: 5f 48 41 53 48 5d 3b 0a 20 20 77 68 69 6c 65 28  _HASH];.  while(
2000: 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70   p && p->pgno!=p
2010: 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  gno ){.    p = p
2020: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
2030: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2040: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
2050: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
2060: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
2070: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
2080: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
2090: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
20a0: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
20b0: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
20c0: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
20d0: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
20e0: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
20f0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
2100: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
2110: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
2120: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
2130: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
2140: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
2150: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2160: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
2170: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
2180: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
2190: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
21a0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
21b0: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  Pg=pNext){.    p
21c0: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
21d0: 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
21e0: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
21f0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
2200: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
2210: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Last = 0;.  pPag
2220: 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20  er->pAll = 0;.  
2230: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
2240: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
2250: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
2260: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
2270: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
2280: 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49 54  er->state>=SQLIT
2290: 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20  E_WRITELOCK ){. 
22a0: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72     sqlitepager_r
22b0: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
22c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 55  .  }.  sqliteOsU
22d0: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
22e0: 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  d);.  pPager->st
22f0: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c  ate = SQLITE_UNL
2300: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  OCK;.  pPager->d
2310: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50  bSize = -1;.  pP
2320: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
2330: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2340: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
2350: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65   );.}../*.** Whe
2360: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2370: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
2380: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
2390: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
23a0: 64 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63  d.** a write loc
23b0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
23c0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
23d0: 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 64 61   releases the da
23e0: 74 61 62 61 73 65 0a 2a 2a 20 77 72 69 74 65 20  tabase.** write 
23f0: 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65  lock and acquire
2400: 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 6e  s a read lock in
2410: 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65   its place.  The
2420: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2430: 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20   is deleted and 
2440: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
2450: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
2460: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
2470: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2480: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
2490: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
24a0: 61 74 65 3c 53 51 4c 49 54 45 5f 57 52 49 54 45  ate<SQLITE_WRITE
24b0: 4c 4f 43 4b 20 29 20 72 65 74 75 72 6e 20 53 51  LOCK ) return SQ
24c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
24d0: 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d  epager_ckpt_comm
24e0: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
24f0: 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70  ( pPager->ckptOp
2500: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
2510: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
2520: 3e 63 70 66 64 29 3b 0a 20 20 20 20 70 50 61 67  >cpfd);.    pPag
2530: 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 30  er->ckptOpen = 0
2540: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73  ;.  }.  sqliteOs
2550: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
2560: 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  fd);.  pPager->j
2570: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
2580: 20 20 73 71 6c 69 74 65 4f 73 44 65 6c 65 74 65    sqliteOsDelete
2590: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
25a0: 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
25b0: 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61  eOsReadLock(&pPa
25c0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65  ger->fd);.  asse
25d0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
25e0: 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  K );.  sqliteFre
25f0: 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  e( pPager->aInJo
2600: 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65  urnal );.  pPage
2610: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
2620: 30 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  0;.  for(pPg=pPa
2630: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
2640: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
2650: 6c 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a  l){.    pPg->inJ
2660: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
2670: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
2680: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
2690: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41  ate = SQLITE_REA
26a0: 44 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  DLOCK;.  return 
26b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
26c0: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
26d0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
26e0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
26f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
2700: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
2710: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
2720: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2730: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
2740: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
2750: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
2760: 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
2770: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
2780: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
2790: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
27a0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
27b0: 61 67 65 52 65 63 6f 72 64 20 70 67 52 65 63 3b  ageRecord pgRec;
27c0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  ..  rc = sqliteO
27d0: 73 52 65 61 64 28 6a 66 64 2c 20 26 70 67 52 65  sRead(jfd, &pgRe
27e0: 63 2c 20 73 69 7a 65 6f 66 28 70 67 52 65 63 29  c, sizeof(pgRec)
27f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2800: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2810: 72 63 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  rc;..  /* Sanity
2820: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
2830: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
2840: 67 52 65 63 2e 70 67 6e 6f 3e 70 50 61 67 65 72  gRec.pgno>pPager
2850: 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 70 67 52 65  ->dbSize || pgRe
2860: 63 2e 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75  c.pgno==0 ) retu
2870: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2880: 54 3b 0a 0a 20 20 2f 2a 20 50 6c 61 79 62 61 63  T;..  /* Playbac
2890: 6b 20 74 68 65 20 70 61 67 65 2e 20 20 55 70 64  k the page.  Upd
28a0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
28b0: 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 61  y copy of the pa
28c0: 67 65 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 73  ge.  ** at the s
28d0: 61 6d 65 20 74 69 6d 65 2c 20 69 66 20 74 68 65  ame time, if the
28e0: 72 65 20 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  re is one..  */.
28f0: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
2900: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 52  okup(pPager, pgR
2910: 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  ec.pgno);.  if( 
2920: 70 50 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  pPg ){.    memcp
2930: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
2940: 70 50 67 29 2c 20 70 67 52 65 63 2e 61 44 61 74  pPg), pgRec.aDat
2950: 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  a, SQLITE_PAGE_S
2960: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  IZE);.    memset
2970: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
2980: 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
2990: 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 0a 20 20  >nExtra);.  }.  
29a0: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 65 65  rc = sqliteOsSee
29b0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
29c0: 70 67 52 65 63 2e 70 67 6e 6f 2d 31 29 2a 53 51  pgRec.pgno-1)*SQ
29d0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
29e0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
29f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
2a00: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
2a10: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 67 52 65  pPager->fd, pgRe
2a20: 63 2e 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  c.aData, SQLITE_
2a30: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a  PAGE_SIZE);.  }.
2a40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a50: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
2a60: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
2a70: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
2a80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2a90: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
2aa0: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
2ab0: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
2ac0: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
2ad0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2ae0: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
2af0: 66 6f 6c 6c 6f 77 73 3a 20 20 54 68 65 72 65 20  follows:  There 
2b00: 69 73 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a  is an initial.**
2b10: 20 66 69 6c 65 2d 74 79 70 65 20 73 74 72 69 6e   file-type strin
2b20: 67 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  g for sanity che
2b30: 63 6b 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 65  cking.  Then the
2b40: 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 0a 2a  re is a single.*
2b50: 2a 20 50 67 6e 6f 20 6e 75 6d 62 65 72 20 77 68  * Pgno number wh
2b60: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
2b70: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2b80: 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
2b90: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 20 77 65 72  e.** changes wer
2ba0: 65 20 6d 61 64 65 2e 20 20 54 68 65 20 64 61 74  e made.  The dat
2bb0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
2bc0: 65 64 20 74 6f 20 74 68 69 73 20 73 69 7a 65 2e  ed to this size.
2bd0: 0a 2a 2a 20 4e 65 78 74 20 63 6f 6d 65 20 7a 65  .** Next come ze
2be0: 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 20  ro or more page 
2bf0: 72 65 63 6f 72 64 73 20 77 68 65 72 65 20 65 61  records where ea
2c00: 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 0a 2a  ch page record.*
2c10: 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
2c20: 50 67 6e 6f 20 61 6e 64 20 53 51 4c 49 54 45 5f  Pgno and SQLITE_
2c30: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
2c40: 6f 66 20 64 61 74 61 2e 20 20 53 65 65 0a 2a 2a  of data.  See.**
2c50: 20 74 68 65 20 50 61 67 65 52 65 63 6f 72 64 20   the PageRecord 
2c60: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 64 65  structure for de
2c70: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tails..**.** If 
2c80: 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
2c90: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
2ca0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
2cb0: 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
2cc0: 6e 61 6c 20 66 69 6c 65 20 28 61 73 20 64 65 74  nal file (as det
2cd0: 65 72 6d 69 6e 65 64 20 62 79 20 6c 6f 6f 6b 69  ermined by looki
2ce0: 6e 67 20 61 74 20 74 68 65 20 6d 61 67 69 63 20  ng at the magic 
2cf0: 6e 75 6d 62 65 72 0a 2a 2a 20 61 74 20 74 68 65  number.** at the
2d00: 20 62 65 67 69 6e 6e 69 6e 67 29 20 74 68 65 6e   beginning) then
2d10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2d20: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 50 52 4f  turns SQLITE_PRO
2d30: 54 4f 43 4f 4c 2e 0a 2a 2a 20 49 66 20 61 6e 79  TOCOL..** If any
2d40: 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 6f 63   other errors oc
2d50: 63 75 72 20 64 75 72 69 6e 67 20 70 6c 61 79 62  cur during playb
2d60: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
2d70: 65 20 77 69 6c 6c 0a 2a 2a 20 6c 69 6b 65 6c 79  e will.** likely
2d80: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 73   be corrupted, s
2d90: 6f 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f  o the PAGER_ERR_
2da0: 43 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73  CORRUPT bit is s
2db0: 65 74 20 69 6e 0a 2a 2a 20 70 50 61 67 65 72 2d  et in.** pPager-
2dc0: 3e 65 72 72 4d 61 73 6b 20 61 6e 64 20 53 51 4c  >errMask and SQL
2dd0: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
2de0: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20  eturned.  If it 
2df0: 61 6c 6c 0a 2a 2a 20 77 6f 72 6b 73 2c 20 74 68  all.** works, th
2e00: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2e10: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2e20: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
2e30: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2e40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e50: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
2e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2e70: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
2e80: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ea0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2eb0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
2ec0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
2ed0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
2ee0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
2ef0: 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
2f00: 63 68 61 72 20 61 4d 61 67 69 63 5b 73 69 7a 65  char aMagic[size
2f10: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
2f20: 29 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  )];.  int rc;.. 
2f30: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2f40: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
2f50: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
2f60: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
2f70: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
2f80: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
2f90: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2fa0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
2fb0: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53  n );.  sqliteOsS
2fc0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
2fd0: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
2fe0: 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  iteOsFileSize(&p
2ff0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65  Pager->jfd, &nRe
3000: 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  c);.  if( rc!=SQ
3010: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
3020: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
3030: 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28  ;.  }.  nRec = (
3040: 6e 52 65 63 20 2d 20 28 73 69 7a 65 6f 66 28 61  nRec - (sizeof(a
3050: 4d 61 67 69 63 29 2b 73 69 7a 65 6f 66 28 50 67  Magic)+sizeof(Pg
3060: 6e 6f 29 29 29 20 2f 20 73 69 7a 65 6f 66 28 50  no))) / sizeof(P
3070: 61 67 65 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  ageRecord);.  if
3080: 28 20 6e 52 65 63 3c 3d 30 20 29 7b 0a 20 20 20  ( nRec<=0 ){.   
3090: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
30b0: 61 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ad the beginning
30c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
30d0: 61 6e 64 20 74 72 75 6e 63 61 74 65 20 74 68 65  and truncate the
30e0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
30f0: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
3100: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
3110: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
3120: 65 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d  eOsRead(&pPager-
3130: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
3140: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
3150: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3160: 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61  OK || memcmp(aMa
3170: 67 69 63 2c 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  gic,aJournalMagi
3180: 63 2c 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  c,sizeof(aMagic)
3190: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )!=0 ){.    rc =
31a0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
31b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
31c0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  layback;.  }.  r
31d0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64  c = sqliteOsRead
31e0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
31f0: 6d 78 50 67 2c 20 73 69 7a 65 6f 66 28 6d 78 50  mxPg, sizeof(mxP
3200: 67 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  g));.  if( rc!=S
3210: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3220: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
3230: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  k;.  }.  rc = sq
3240: 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28 26  liteOsTruncate(&
3250: 70 50 61 67 65 72 2d 3e 66 64 2c 20 6d 78 50 67  pPager->fd, mxPg
3260: 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  *SQLITE_PAGE_SIZ
3270: 45 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  E);.  if( rc!=SQ
3280: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
3290: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
32a0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
32b0: 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
32c0: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
32d0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
32e0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
32f0: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
3300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
3310: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
3320: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
3330: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
3340: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
3350: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
3360: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 69 66 28 20  ->jfd);.    if( 
3370: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
3380: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  break;.  }..end_
3390: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
33a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33b0: 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69  .    pager_unwri
33c0: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
33d0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
33e0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
33f0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
3400: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
3410: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
3420: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
3430: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
3440: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
3450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
3460: 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ck the checkpoin
3470: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
3480: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
3490: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
34a0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34b0: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74   journal but wit
34c0: 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61  h.** a few extra
34d0: 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20   twists..**.**  
34e0: 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65    (1)  The numbe
34f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
3500: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3510: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
3520: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 63  **         the c
3530: 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 73 74 6f  heckpoint is sto
3540: 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 63  red in pPager->c
3550: 6b 70 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  kptSize, not in 
3560: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
3570: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
3580: 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
3590: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
35a0: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
35b0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
35c0: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
35d0: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
35e0: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
35f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
3600: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
3610: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
3620: 65 74 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  et pPager->ckptJ
3630: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
3640: 69 6e 74 20 70 61 67 65 72 5f 63 6b 70 74 5f 70  int pager_ckpt_p
3650: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
3660: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e 52  Pager){.  int nR
3670: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
3680: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3690: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  Records */.  int
36a0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
36b0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
36c0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
36d0: 63 3b 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  c;..  /* Truncat
36e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
36f0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
3700: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
3710: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54 72   rc = sqliteOsTr
3720: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
3730: 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  fd, pPager->ckpt
3740: 53 69 7a 65 2a 53 51 4c 49 54 45 5f 50 41 47 45  Size*SQLITE_PAGE
3750: 5f 53 49 5a 45 29 3b 0a 20 20 70 50 61 67 65 72  _SIZE);.  pPager
3760: 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
3770: 72 2d 3e 63 6b 70 74 53 69 7a 65 3b 0a 0a 20 20  r->ckptSize;..  
3780: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
3790: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
37a0: 72 65 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70  re in the checkp
37b0: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  oint journal..  
37c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
37d0: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26  ger->ckptInUse &
37e0: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
37f0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
3800: 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  eOsSeek(&pPager-
3810: 3e 63 70 66 64 2c 20 30 29 3b 0a 20 20 72 63 20  >cpfd, 0);.  rc 
3820: 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69  = sqliteOsFileSi
3830: 7a 65 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64  ze(&pPager->cpfd
3840: 2c 20 26 6e 52 65 63 29 3b 0a 20 20 69 66 28 20  , &nRec);.  if( 
3850: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3860: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b  .    goto end_ck
3870: 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  pt_playback;.  }
3880: 0a 20 20 6e 52 65 63 20 2f 3d 20 73 69 7a 65 6f  .  nRec /= sizeo
3890: 66 28 50 61 67 65 52 65 63 6f 72 64 29 3b 0a 20  f(PageRecord);. 
38a0: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
38b0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
38c0: 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  f the checkpoint
38d0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
38e0: 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  k into the.  ** 
38f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
3900: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
3910: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
3920: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
3930: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
3940: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
3950: 2d 3e 63 70 66 64 29 3b 0a 20 20 20 20 69 66 28  ->cpfd);.    if(
3960: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3970: 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70   goto end_ckpt_p
3980: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
3990: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
39a0: 77 20 6d 61 6e 79 20 70 61 67 65 73 20 6e 65 65  w many pages nee
39b0: 64 20 74 6f 20 62 65 20 63 6f 70 69 65 64 20 6f  d to be copied o
39c0: 75 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  ut of the transa
39d0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ction.  ** journ
39e0: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  al..  */.  rc = 
39f0: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
3a00: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
3a10: 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20  r->ckptJSize);. 
3a20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3a30: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
3a40: 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b  nd_ckpt_playback
3a50: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
3a60: 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  iteOsFileSize(&p
3a70: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 52 65  Pager->jfd, &nRe
3a80: 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  c);.  if( rc!=SQ
3a90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
3aa0: 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61  oto end_ckpt_pla
3ab0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65  yback;.  }.  nRe
3ac0: 63 20 3d 20 28 6e 52 65 63 20 2d 20 70 50 61 67  c = (nRec - pPag
3ad0: 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 2f 73  er->ckptJSize)/s
3ae0: 69 7a 65 6f 66 28 50 61 67 65 52 65 63 6f 72 64  izeof(PageRecord
3af0: 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  );.  for(i=nRec-
3b00: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
3b10: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
3b20: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
3b30: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
3b40: 3e 6a 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  >jfd);.    if( r
3b50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
3b60: 6f 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61  oto end_ckpt_pla
3b70: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 0a 0a 65  yback;.  }.  ..e
3b80: 6e 64 5f 63 6b 70 74 5f 70 6c 61 79 62 61 63 6b  nd_ckpt_playback
3b90: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
3ba0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
3bb0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
3bc0: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
3bd0: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
3be0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  TE_CORRUPT;.  }.
3bf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3c00: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3c10: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3c20: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
3c30: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
3c40: 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  wed..**.** The m
3c50: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73  aximum number is
3c60: 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   the absolute va
3c70: 6c 75 65 20 6f 66 20 74 68 65 20 6d 78 50 61 67  lue of the mxPag
3c80: 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20  e parameter..** 
3c90: 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
3ca0: 61 74 69 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e  ative, the noSyn
3cb0: 63 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 73  c flag is also s
3cc0: 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79 70 61  et.  noSync bypa
3cd0: 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  sses.** calls to
3ce0: 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 29 2e   sqliteOsSync().
3cf0: 20 20 54 68 65 20 70 61 67 65 72 20 72 75 6e 73    The pager runs
3d00: 20 6d 75 63 68 20 66 61 73 74 65 72 20 77 69 74   much faster wit
3d10: 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20  h noSync on,.** 
3d20: 62 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  but if the opera
3d30: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
3d40: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 20  hes or there is 
3d50: 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
3d60: 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65  .** failure, the
3d70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
3d80: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
3d90: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3da0: 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61  and.** unrepaira
3db0: 62 6c 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a  ble state.  .*/.
3dc0: 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72  void sqlitepager
3dd0: 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50  _set_cachesize(P
3de0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
3df0: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
3e00: 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20   mxPage>=0 ){.  
3e10: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
3e20: 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
3e30: 69 6c 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ile;.  }else{.  
3e40: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
3e50: 20 3d 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65   = 1;.    mxPage
3e60: 20 3d 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a   = -mxPage;.  }.
3e70: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
3e80: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
3e90: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
3ea0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
3eb0: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
3ec0: 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  le.  Write the n
3ed0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
3ee0: 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a  into zName.** (z
3ef0: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20  Name must be at 
3f00: 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d  least SQLITE_TEM
3f10: 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73  PNAME_SIZE bytes
3f20: 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a   long.)  Write.*
3f30: 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
3f40: 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
3f50: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
3f60: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
3f70: 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
3f80: 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
3f90: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ail..**.** The O
3fa0: 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
3fb0: 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
3fc0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
3fd0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f  hen it is.** clo
3fe0: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
3ff0: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f  nt sqlitepager_o
4000: 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46  pentemp(char *zF
4010: 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29  ile, OsFile *fd)
4020: 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b  {.  int cnt = 8;
4030: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
4040: 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20  .    cnt--;.    
4050: 73 71 6c 69 74 65 4f 73 54 65 6d 70 46 69 6c 65  sqliteOsTempFile
4060: 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  Name(zFile);.   
4070: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70   rc = sqliteOsOp
4080: 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c  enExclusive(zFil
4090: 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68  e, fd, 1);.  }wh
40a0: 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63  ile( cnt>0 && rc
40b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
40c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
40d0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
40e0: 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  w page cache and
40f0: 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
4100: 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
4110: 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a   in *ppPager..**
4120: 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   The file to be 
4130: 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20  cached need not 
4140: 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65  exist.  The file
4150: 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75   is not locked u
4160: 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73  ntil.** the firs
4170: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
4180: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
4190: 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
41a0: 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
41b0: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
41c0: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
41d0: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  epager_unref()..
41e0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
41f0: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
4200: 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
4210: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
4220: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
4230: 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
4240: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
4250: 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
4260: 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
4270: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
4280: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
4290: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
42a0: 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20  r_open(.  Pager 
42b0: 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
42c0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
42d0: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
42e0: 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
42f0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
4300: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
4310: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4320: 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
4330: 74 20 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20  t mxPage,       
4340: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75         /* Max nu
4350: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
4360: 79 20 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f  y cache pages */
4370: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
4380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
4390: 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
43a0: 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
43b0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  ory page */.){. 
43c0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
43d0: 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20    int nameLen;. 
43e0: 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e   OsFile fd;.  in
43f0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 74 65 6d 70  t rc;.  int temp
4400: 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 65 61 64  File;.  int read
4410: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  Only = 0;.  char
4420: 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
4430: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20  MPNAME_SIZE];.. 
4440: 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20   *ppPager = 0;. 
4450: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
4460: 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  oc_failed ){.   
4470: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
4480: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
4490: 7a 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20  zFilename ){.   
44a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70   rc = sqliteOsOp
44b0: 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 69 6c  enReadWrite(zFil
44c0: 65 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61  ename, &fd, &rea
44d0: 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 74 65 6d 70  dOnly);.    temp
44e0: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  File = 0;.  }els
44f0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
4500: 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  tepager_opentemp
4510: 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20  (zTemp, &fd);.  
4520: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54    zFilename = zT
4530: 65 6d 70 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c  emp;.    tempFil
4540: 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 1;.  }.  if(
4550: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4560: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4570: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
4580: 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74  }.  nameLen = st
4590: 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  rlen(zFilename);
45a0: 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
45b0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
45c0: 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65  (*pPager) + name
45d0: 4c 65 6e 2a 32 20 2b 20 33 30 20 29 3b 0a 20 20  Len*2 + 30 );.  
45e0: 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b  if( pPager==0 ){
45f0: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f  .    sqliteOsClo
4600: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 72 65 74  se(&fd);.    ret
4610: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
4620: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
4630: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
4640: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
4650: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
4660: 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  l = &pPager->zFi
4670: 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31  lename[nameLen+1
4680: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  ];.  strcpy(pPag
4690: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
46a0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Filename);.  str
46b0: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
46c0: 72 6e 61 6c 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  rnal, zFilename)
46d0: 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67  ;.  strcpy(&pPag
46e0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d  er->zJournal[nam
46f0: 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  eLen], "-journal
4700: 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ");.  pPager->fd
4710: 20 3d 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d   = fd;.  pPager-
4720: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
4730: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  ;.  pPager->ckpt
4740: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
4750: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20  er->ckptInUse = 
4760: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
4770: 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
4780: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
4790: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
47a0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
47b0: 63 6b 70 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20  ckptJSize = 0;. 
47c0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
47d0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   0;.  pPager->mx
47e0: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e 35 20  Page = mxPage>5 
47f0: 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a 20  ? mxPage : 10;. 
4800: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
4810: 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a   SQLITE_UNLOCK;.
4820: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
4830: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
4840: 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
4850: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
4860: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
4870: 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nly;.  pPager->n
4880: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
4890: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
48a0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
48b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
48c0: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
48d0: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  ->pLast = 0;.  p
48e0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
48f0: 6e 45 78 74 72 61 3b 0a 20 20 6d 65 6d 73 65 74  nExtra;.  memset
4900: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
4910: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
4920: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70  ->aHash));.  *pp
4930: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
4940: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4950: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
4960: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
4970: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
4980: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
4990: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
49a0: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
49b0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
49c0: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
49d0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
49e0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
49f0: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
4a00: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
4a10: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
4a20: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
4a30: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
4a40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
4a50: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
4a60: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
4a70: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f 73  sqlitepager_clos
4a80: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
4a90: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
4aa0: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 70  alled by sqlitep
4ab0: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f  ager_unref()..*/
4ac0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65  .void sqlitepage
4ad0: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
4ae0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
4af0: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
4b00: 69 64 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  id*)){.  pPager-
4b10: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
4b20: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Desc;.}../*.** R
4b30: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
4b40: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
4b50: 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
4b60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4b70: 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69  .** pPager..*/.i
4b80: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70  nt sqlitepager_p
4b90: 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
4ba0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e  pPager){.  int n
4bb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
4bc0: 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
4bd0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
4be0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
4bf0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
4c00: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 4f   }.  if( sqliteO
4c10: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
4c20: 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49  r->fd, &n)!=SQLI
4c30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
4c40: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
4c50: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a  PAGER_ERR_DISK;.
4c60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4c70: 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f  }.  n /= SQLITE_
4c80: 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28  PAGE_SIZE;.  if(
4c90: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
4ca0: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 7b  SQLITE_UNLOCK ){
4cb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
4cc0: 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  ize = n;.  }.  r
4cd0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
4ce0: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
4cf0: 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
4d00: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
4d10: 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
4d20: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
4d30: 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
4d40: 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
4d50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4d60: 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
4d70: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
4d80: 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
4d90: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
4da0: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
4db0: 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
4dc0: 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
4dd0: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
4de0: 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
4df0: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
4e00: 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
4e10: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
4e20: 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
4e30: 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
4e40: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
4e50: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
4e60: 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  close(Pager *pPa
4e70: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
4e80: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77  Pg, *pNext;.  sw
4e90: 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74  itch( pPager->st
4ea0: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
4eb0: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
4ec0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4ed0: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
4ee0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
4ef0: 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  liteOsUnlock(&pP
4f00: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
4f10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
4f20: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
4f30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4f40: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4f50: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a 20  QLITE_READLOCK: 
4f60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73  {.      sqliteOs
4f70: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
4f80: 66 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  fd);.      break
4f90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
4fa0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
4fb0: 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
4fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4fd0: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70  .  }.  for(pPg=p
4fe0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
4ff0: 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
5000: 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
5010: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c  NextAll;.    sql
5020: 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
5030: 7d 0a 20 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73  }.  sqliteOsClos
5040: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  e(&pPager->fd);.
5050: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
5060: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
5070: 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69   );.  /* Temp fi
5080: 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
5090: 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
50a0: 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
50b0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
50c0: 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
50d0: 74 65 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  teOsDelete(pPage
50e0: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
50f0: 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 73 71 6c   ** }.  */.  sql
5100: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b  iteFree(pPager);
5110: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5120: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
5130: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
5140: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76  mber for the giv
5150: 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  en page data..*/
5160: 0a 50 67 6e 6f 20 73 71 6c 69 74 65 70 61 67 65  .Pgno sqlitepage
5170: 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69  r_pagenumber(voi
5180: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
5190: 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f  dr *p = DATA_TO_
51a0: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
51b0: 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
51c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  }../*.** Increme
51d0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
51e0: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
51f0: 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
5200: 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
5210: 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
5220: 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
5230: 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
5240: 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
5250: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
5260: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5270: 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72  d page_ref(PgHdr
5280: 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
5290: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
52a0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
52b0: 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
52c0: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
52d0: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
52e0: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
52f0: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
5300: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
5310: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
5320: 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tFree;.    }else
5330: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
5340: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
5350: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
5360: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
5370: 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
5380: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
5390: 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
53a0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
53b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
53c0: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c   pPg->pPager->pL
53d0: 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
53e0: 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
53f0: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
5400: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
5410: 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46  nRef++;.  REFINF
5420: 4f 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  O(pPg);.}../*.**
5430: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
5440: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
5450: 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  or a page.  The 
5460: 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73  input pointer is
5470: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
5480: 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61  to the page data
5490: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
54a0: 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70  ager_ref(void *p
54b0: 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
54c0: 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
54d0: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61  HDR(pData);.  pa
54e0: 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
54f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
5510: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
5520: 68 65 6e 20 77 72 69 74 65 20 61 6c 6c 20 66 72  hen write all fr
5530: 65 65 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ee dirty pages t
5540: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
5550: 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72  * file..**.** Wr
5560: 69 74 69 6e 67 20 61 6c 6c 20 66 72 65 65 20 64  iting all free d
5570: 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
5580: 65 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  e database after
5590: 20 74 68 65 20 73 79 6e 63 20 69 73 20 61 0a 2a   the sync is a.*
55a0: 2a 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73 20 6f 70  * non-obvious op
55b0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 66 73 79  timization.  fsy
55c0: 6e 63 28 29 20 69 73 20 61 6e 20 65 78 70 65 6e  nc() is an expen
55d0: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 20 73  sive operation s
55e0: 6f 20 77 65 0a 2a 2a 20 77 61 6e 74 20 74 6f 20  o we.** want to 
55f0: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  minimize the num
5600: 62 65 72 20 6f 74 20 74 69 6d 65 73 20 69 74 20  ber ot times it 
5610: 69 73 20 63 61 6c 6c 65 64 2e 20 41 66 74 65 72  is called. After
5620: 20 61 6e 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   an fsync() call
5630: 2c 0a 2a 2a 20 77 65 20 61 72 65 20 66 72 65 65  ,.** we are free
5640: 20 74 6f 20 77 72 69 74 65 20 64 69 72 74 79 20   to write dirty 
5650: 70 61 67 65 73 20 62 61 63 6b 20 74 6f 20 74 68  pages back to th
5660: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 74 20  e database.  It 
5670: 69 73 20 62 65 73 74 0a 2a 2a 20 74 6f 20 67 6f  is best.** to go
5680: 20 61 68 65 61 64 20 61 6e 64 20 77 72 69 74 65   ahead and write
5690: 20 61 73 20 6d 61 6e 79 20 64 69 72 74 79 20 70   as many dirty p
56a0: 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ages as possible
56b0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 0a 2a 2a   to minimize .**
56c0: 20 74 68 65 20 72 69 73 6b 20 6f 66 20 68 61 76   the risk of hav
56d0: 69 6e 67 20 74 6f 20 64 6f 20 61 6e 6f 74 68 65  ing to do anothe
56e0: 72 20 66 73 79 6e 63 28 29 20 6c 61 74 65 72 20  r fsync() later 
56f0: 6f 6e 2e 20 20 57 72 69 74 69 6e 67 20 64 69 72  on.  Writing dir
5700: 74 79 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73  ty.** free pages
5710: 20 69 6e 20 74 68 69 73 20 77 61 79 20 77 61 73   in this way was
5720: 20 6f 62 73 65 72 76 65 64 20 74 6f 20 6d 61 6b   observed to mak
5730: 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 72 61  e database opera
5740: 74 69 6f 6e 73 20 67 6f 0a 2a 2a 20 75 70 20 74  tions go.** up t
5750: 6f 20 31 30 20 74 69 6d 65 73 20 66 61 73 74 65  o 10 times faste
5760: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 61  r..**.** If we a
5770: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 65  re writing to te
5780: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
5790: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
57a0: 65 64 20 74 6f 20 70 72 65 73 65 72 76 65 0a 2a  ed to preserve.*
57b0: 2a 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  * the integrity 
57c0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
57d0: 69 6c 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  ile, so we can s
57e0: 61 76 65 20 74 69 6d 65 20 61 6e 64 20 73 6b 69  ave time and ski
57f0: 70 20 74 68 65 0a 2a 2a 20 66 73 79 6e 63 28 29  p the.** fsync()
5800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5810: 73 79 6e 63 41 6c 6c 50 61 67 65 73 28 50 61 67  syncAllPages(Pag
5820: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
5830: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
5840: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5850: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
5860: 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
5870: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
5880: 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
5890: 20 3d 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28   = sqliteOsSync(
58a0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
58b0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
58c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
58d0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
58e0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a  edSync = 0;.  }.
58f0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
5900: 2d 3e 70 46 69 72 73 74 3b 20 70 50 67 3b 20 70  ->pFirst; pPg; p
5910: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  Pg=pPg->pNextFre
5920: 65 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  e){.    if( pPg-
5930: 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
5940: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
5950: 61 67 65 72 2d 3e 66 64 2c 20 28 70 50 67 2d 3e  ager->fd, (pPg->
5960: 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45 5f 50  pgno-1)*SQLITE_P
5970: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
5980: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72   rc = sqliteOsWr
5990: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
59a0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
59b0: 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  Pg), SQLITE_PAGE
59c0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66  _SIZE);.      if
59d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
59e0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
59f0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
5a00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5a10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
5a20: 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
5a30: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
5a40: 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
5a50: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
5a60: 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
5a70: 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
5a80: 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
5a90: 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
5aa0: 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
5ab0: 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
5ac0: 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20  ** A _get works 
5ad0: 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
5ae0: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
5af0: 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
5b00: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
5b10: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
5b20: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
5b30: 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
5b40: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
5b50: 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
5b60: 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
5b70: 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
5b80: 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
5b90: 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
5ba0: 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
5bb0: 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
5bc0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
5bd0: 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
5be0: 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
5bf0: 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
5c00: 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
5c10: 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
5c20: 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
5c30: 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
5c40: 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
5c50: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
5c60: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
5c70: 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
5c80: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
5c90: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
5ca0: 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b  sqlitepager_look
5cb0: 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
5cc0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
5cd0: 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
5ce0: 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
5cf0: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
5d00: 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
5d10: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
5d20: 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
5d30: 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
5d40: 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
5d50: 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
5d60: 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
5d70: 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
5d80: 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
5d90: 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
5da0: 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
5db0: 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
5dc0: 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
5dd0: 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
5de0: 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
5df0: 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
5e00: 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
5e10: 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
5e20: 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
5e30: 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
5e40: 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
5e50: 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
5e60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
5e70: 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a  ager_get(Pager *
5e80: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
5e90: 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65  o, void **ppPage
5ea0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
5eb0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
5ec0: 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
5ed0: 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
5ee0: 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  rors..  */ .  if
5ef0: 28 20 70 50 61 67 65 72 3d 3d 30 20 7c 7c 20 70  ( pPager==0 || p
5f00: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
5f10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
5f20: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  R;.  }.  if( pPa
5f30: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
5f40: 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
5f50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
5f60: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
5f70: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
5f80: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
5f90: 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
5fa0: 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 72  ed, then get a r
5fb0: 65 61 64 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ead lock.  ** on
5fc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5fd0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
5fe0: 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
5ff0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
6000: 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67  OsReadLock(&pPag
6010: 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f  er->fd)!=SQLITE_
6020: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50  OK ){.      *ppP
6030: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
6040: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
6050: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  Y;.    }.    pPa
6060: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
6070: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20  ITE_READLOCK;.. 
6080: 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
6090: 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
60a0: 74 72 79 20 74 6f 20 70 6c 61 79 20 69 74 20 62  try to play it b
60b0: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
60c0: 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  if( sqliteOsFile
60d0: 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a  Exists(pPager->z
60e0: 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20  Journal) ){.    
60f0: 20 20 20 69 6e 74 20 72 63 2c 20 64 75 6d 6d 79     int rc, dummy
6100: 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ;..       /* Get
6110: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
6120: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
6130: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
6140: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
6150: 65 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  eLock(&pPager->f
6160: 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  d);.       if( r
6170: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6180: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
6190: 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  liteOsUnlock(&pP
61a0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
61b0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
61c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
61d0: 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
61e0: 30 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  0;.         retu
61f0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
6200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6210: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
6220: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
6230: 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;..       /* Ope
6240: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
6250: 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
6260: 73 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ss.  Return SQLI
6270: 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20  TE_BUSY if.     
6280: 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 67    ** we cannot g
6290: 65 74 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  et exclusive acc
62a0: 65 73 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ess to the journ
62b0: 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  al file. .      
62c0: 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 45 76   **.       ** Ev
62d0: 65 6e 20 74 68 6f 75 67 68 20 77 65 20 77 69 6c  en though we wil
62e0: 6c 20 6f 6e 6c 79 20 62 65 20 72 65 61 64 69 6e  l only be readin
62f0: 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
6300: 61 6c 2c 20 6e 6f 74 20 77 72 69 74 69 6e 67 2c  al, not writing,
6310: 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 68 61  .       ** we ha
6320: 76 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  ve to open the j
6330: 6f 75 72 6e 61 6c 20 66 6f 72 20 77 72 69 74 69  ournal for writi
6340: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6f  ng in order to o
6350: 62 74 61 69 6e 20 61 6e 0a 20 20 20 20 20 20 20  btain an.       
6360: 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  ** exclusive acc
6370: 65 73 73 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ess lock..      
6380: 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
6390: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64  sqliteOsOpenRead
63a0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  Write(pPager->zJ
63b0: 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
63c0: 3e 6a 66 64 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  >jfd, &dummy);. 
63d0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
63e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
63f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
6400: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
6410: 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 61  >fd);.         a
6420: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
6430: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
6440: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
6450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
6460: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
6470: 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
6480: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
6490: 20 31 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50   1;..       /* P
64a0: 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
64b0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
64c0: 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
64d0: 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20  se write.       
64e0: 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
64f0: 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
6500: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ock..       */. 
6510: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
6520: 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
6530: 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
6540: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6550: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
6560: 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  c;.       }.    
6570: 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  }.    pPg = 0;. 
6580: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
6590: 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69  earch for page i
65a0: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70  n cache */.    p
65b0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
65c0: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
65d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
65e0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
65f0: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
6600: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67  s not in the pag
6610: 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
6620: 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65  int h;.    pPage
6630: 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20  r->nMiss++;.    
6640: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
6650: 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
6660: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72   || pPager->pFir
6670: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  st==0 ){.      /
6680: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
6690: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  age */.      pPg
66a0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
66b0: 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
66c0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
66d0: 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
66e0: 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  a );.      if( p
66f0: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
6700: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
6710: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72        pager_unwr
6720: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
6730: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
6740: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
6750: 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20  R_ERR_MEM;.     
6760: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6770: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
6780: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
6790: 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
67a0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20    pPg->pNextAll 
67b0: 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a  = pPager->pAll;.
67c0: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
67d0: 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
67e0: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 2d 3e    pPager->pAll->
67f0: 70 50 72 65 76 41 6c 6c 20 3d 20 70 50 67 3b 0a  pPrevAll = pPg;.
6800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
6810: 67 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 30 3b  g->pPrevAll = 0;
6820: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
6830: 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  All = pPg;.     
6840: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b   pPager->nPage++
6850: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6860: 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e     /* Recycle an
6870: 20 6f 6c 64 65 72 20 70 61 67 65 2e 20 20 46 69   older page.  Fi
6880: 72 73 74 20 6c 6f 63 61 74 65 20 74 68 65 20 70  rst locate the p
6890: 61 67 65 20 74 6f 20 62 65 20 72 65 63 79 63 6c  age to be recycl
68a0: 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 72 79  ed..      ** Try
68b0: 20 74 6f 20 66 69 6e 64 20 6f 6e 65 20 74 68 61   to find one tha
68c0: 74 20 69 73 20 6e 6f 74 20 64 69 72 74 79 20 61  t is not dirty a
68d0: 6e 64 20 69 73 20 6e 65 61 72 20 74 68 65 20 68  nd is near the h
68e0: 65 61 64 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ead of.      ** 
68f0: 6f 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  of the free list
6900: 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20   */.      pPg = 
6910: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
6920: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 67        while( pPg
6930: 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29   && pPg->dirty )
6940: 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  {.        pPg = 
6950: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
6960: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
6970: 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f  * If we could no
6980: 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68  t find a page th
6990: 61 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  at has not been 
69a0: 75 73 65 64 20 72 65 63 65 6e 74 6c 79 0a 20 20  used recently.  
69b0: 20 20 20 20 2a 2a 20 61 6e 64 20 77 68 69 63 68      ** and which
69c0: 20 69 73 20 6e 6f 74 20 64 69 72 74 79 2c 20 74   is not dirty, t
69d0: 68 65 6e 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  hen sync the jou
69e0: 72 6e 61 6c 20 61 6e 64 20 77 72 69 74 65 20 61  rnal and write a
69f0: 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 74  ll.      ** dirt
6a00: 79 20 66 72 65 65 20 70 61 67 65 73 20 69 6e 74  y free pages int
6a10: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
6a20: 69 6c 65 2c 20 74 68 75 73 20 6d 61 6b 69 6e 67  ile, thus making
6a30: 20 74 68 65 6d 0a 20 20 20 20 20 20 2a 2a 20 63   them.      ** c
6a40: 6c 65 61 6e 20 70 61 67 65 73 20 61 6e 64 20 61  lean pages and a
6a50: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 63  vailable for rec
6a60: 79 63 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a  ycling..      **
6a70: 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61 76  .      ** We hav
6a80: 65 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f  e to sync the jo
6a90: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69  urnal before wri
6aa0: 74 69 6e 67 20 61 20 70 61 67 65 20 74 6f 20 74  ting a page to t
6ab0: 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 2a 2a  he main.      **
6ac0: 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20   database.  But 
6ad0: 73 79 6e 63 69 6e 67 20 69 73 20 61 20 76 65 72  syncing is a ver
6ae0: 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
6af0: 2e 20 20 53 6f 20 61 66 74 65 72 20 61 0a 20 20  .  So after a.  
6b00: 20 20 20 20 2a 2a 20 73 79 6e 63 2c 20 69 74 20      ** sync, it 
6b10: 69 73 20 62 65 73 74 20 74 6f 20 77 72 69 74 65  is best to write
6b20: 20 65 76 65 72 79 74 68 69 6e 67 20 77 65 20 63   everything we c
6b30: 61 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6d  an back to the m
6b40: 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  ain.      ** dat
6b50: 61 62 61 73 65 20 74 6f 20 6d 69 6e 69 6d 69 7a  abase to minimiz
6b60: 65 20 74 68 65 20 72 69 73 6b 20 6f 66 20 68 61  e the risk of ha
6b70: 76 69 6e 67 20 74 6f 20 73 79 6e 63 20 61 67 61  ving to sync aga
6b80: 69 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  in in the.      
6b90: 2a 2a 20 6e 65 61 72 20 66 75 74 75 72 65 2e 20  ** near future. 
6ba0: 20 54 68 61 74 20 69 73 20 77 61 79 20 77 65 20   That is way we 
6bb0: 77 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  write all dirty 
6bc0: 70 61 67 65 73 20 61 66 74 65 72 20 61 0a 20 20  pages after a.  
6bd0: 20 20 20 20 2a 2a 20 73 79 6e 63 2e 0a 20 20 20      ** sync..   
6be0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
6bf0: 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
6c00: 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 41    int rc = syncA
6c10: 6c 6c 50 61 67 65 73 28 70 50 61 67 65 72 29 3b  llPages(pPager);
6c20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
6c30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6c40: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
6c50: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
6c60: 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
6c70: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
6c80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
6c90: 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RR;.        }.  
6ca0: 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67        pPg = pPag
6cb0: 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20  er->pFirst;.    
6cc0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
6cd0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
6ce0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6cf0: 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
6d00: 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e  ..      /* Unlin
6d10: 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66  k the old page f
6d20: 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
6d30: 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74  t and the hash t
6d40: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  able.      */.  
6d50: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
6d60: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
6d70: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
6d80: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
6d90: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
6da0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6db0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
6dc0: 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29  r->pFirst==pPg )
6dd0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
6de0: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
6df0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
6e00: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
6e10: 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
6e20: 20 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78         pPg->pNex
6e30: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
6e40: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
6e50: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
6e60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6e70: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70  pPager->pLast==p
6e80: 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  Pg );.        pP
6e90: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
6ea0: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
6eb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
6ec0: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
6ed0: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
6ee0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
6ef0: 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
6f00: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
6f10: 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
6f20: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
6f30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6f40: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
6f50: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  h ){.        pPg
6f60: 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
6f70: 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
6f80: 65 78 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d  extHash;.      }
6f90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 68 20  else{.        h 
6fa0: 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67  = pager_hash(pPg
6fb0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
6fc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
6fd0: 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29  >aHash[h]==pPg )
6fe0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
6ff0: 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
7000: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 20  ->pNextHash;.   
7010: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
7020: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
7030: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
7040: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f        pPager->nO
7050: 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  vfl++;.    }.   
7060: 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
7070: 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  o;.    if( pPage
7080: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->aInJournal &&
7090: 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
70a0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
70b0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
70c0: 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
70d0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
70e0: 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
70f0: 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 7d 65  &7)))!=0;.    }e
7100: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
7110: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
7120: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
7130: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 26 26 20  ger->aInCkpt && 
7140: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
7150: 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b 0a 20  r->ckptSize ){. 
7160: 20 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74       pPg->inCkpt
7170: 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 43   = (pPager->aInC
7180: 6b 70 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  kpt[pgno/8] & (1
7190: 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
71a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
71b0: 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20    pPg->inCkpt = 
71c0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  0;.    }.    pPg
71d0: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
71e0: 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
71f0: 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
7200: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
7210: 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61  ef++;.    h = pa
7220: 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a  ger_hash(pgno);.
7230: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
7240: 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
7250: 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
7260: 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
7270: 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
7280: 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
7290: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
72a0: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
72b0: 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
72c0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
72d0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
72e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
72f0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
7300: 20 29 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70   ) sqlitepager_p
7310: 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
7320: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
7330: 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67  ->dbSize<(int)pg
7340: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  no ){.      mems
7350: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
7360: 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45  (pPg), 0, SQLITE
7370: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
7380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
7390: 74 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  t rc;.      sqli
73a0: 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  teOsSeek(&pPager
73b0: 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 53  ->fd, (pgno-1)*S
73c0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
73d0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
73e0: 69 74 65 4f 73 52 65 61 64 28 26 70 50 61 67 65  iteOsRead(&pPage
73f0: 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
7400: 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54  DATA(pPg), SQLIT
7410: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
7420: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7430: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
7440: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7450: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7460: 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
7470: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
7480: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
7490: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
74a0: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
74b0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
74c0: 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
74d0: 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
74e0: 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
74f0: 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b    pPager->nHit++
7500: 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  ;.    page_ref(p
7510: 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  Pg);.  }.  *ppPa
7520: 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ge = PGHDR_TO_DA
7530: 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  TA(pPg);.  retur
7540: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7550: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
7560: 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
7570: 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
7580: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
7590: 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
75a0: 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
75b0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
75c0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
75d0: 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
75e0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
75f0: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
7600: 61 6c 73 6f 20 73 71 6c 69 74 65 70 61 67 65 72  also sqlitepager
7610: 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  _get().  The dif
7620: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
7630: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
7640: 61 6e 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f  and sqlitepager_
7650: 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  get() is that _g
7660: 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
7670: 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
7680: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
7690: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
76a0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
76b0: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
76c0: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
76d0: 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
76e0: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
76f0: 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
7700: 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
7710: 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
7720: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 70 61 67  .void *sqlitepag
7730: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
7740: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
7750: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
7760: 67 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  g;..  /* Make su
7770: 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68  re we have not h
7780: 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20  it any critical 
7790: 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20  errors..  */ .  
77a0: 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20 7c 7c  if( pPager==0 ||
77b0: 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
77c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
77d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
77e0: 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52  ask & ~(PAGER_ER
77f0: 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72  R_FULL) ){.    r
7800: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
7810: 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
7820: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7830: 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
7840: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
7850: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
7860: 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
7870: 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
7880: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50  pPg);.  return P
7890: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
78a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
78b0: 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
78c0: 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
78d0: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
78e0: 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
78f0: 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
7900: 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
7910: 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
7920: 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
7930: 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
7940: 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
7950: 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
7960: 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
7970: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
7980: 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
7990: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
79a0: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69  epager_unref(voi
79b0: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
79c0: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44  dr *pPg;..  /* D
79d0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
79e0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
79f0: 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
7a00: 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f    pPg = DATA_TO_
7a10: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
7a20: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
7a30: 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
7a40: 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
7a50: 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
7a60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
7a70: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
7a80: 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
7a90: 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
7aa0: 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
7ab0: 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
7ac0: 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
7ad0: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
7ae0: 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
7af0: 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
7b00: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
7b10: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
7b20: 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
7b30: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
7b40: 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
7b50: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
7b60: 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
7b70: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
7b80: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
7b90: 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
7ba0: 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
7bb0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
7bc0: 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
7bd0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
7be0: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
7bf0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
7c00: 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
7c10: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  a);.    }.  .   
7c20: 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67   /* When all pag
7c30: 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65  es reach the fre
7c40: 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20  elist, drop the 
7c50: 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20  read lock from. 
7c60: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
7c70: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
7c80: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
7c90: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
7ca0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20  pPager->nRef>=0 
7cb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
7cc0: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
7cd0: 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
7ce0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
7cf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7d00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7d10: 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
7d20: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
7d30: 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
7d40: 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
7d50: 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
7d60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
7d70: 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
7d80: 71 6c 69 74 65 70 61 67 65 72 5f 63 6f 6d 6d 69  qlitepager_commi
7d90: 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  t() is called..*
7da0: 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61 67  *   *  sqlitepag
7db0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73  er_rollback() is
7dc0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
7dd0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f   sqlitepager_clo
7de0: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
7df0: 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 70 61  **   *  sqlitepa
7e00: 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63  ger_unref() is c
7e10: 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72  alled to on ever
7e20: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
7e30: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
7e40: 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
7e50: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69  routine is a poi
7e60: 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e  nter to any open
7e70: 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20   page of the.** 
7e80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
7e90: 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20  Nothing changes 
7ea0: 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d  about the page -
7eb0: 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65   it is used mere
7ec0: 6c 79 0a 2a 2a 20 74 6f 20 61 63 71 75 69 72 65  ly.** to acquire
7ed0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7ee0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
7ef0: 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74  e and as proof t
7f00: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hat there.** is 
7f10: 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
7f20: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
7f30: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
7f40: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
7f50: 72 65 61 64 79 20 77 72 69 74 65 2d 6c 6f 63 6b  ready write-lock
7f60: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
7f70: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
7f80: 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f  int sqlitepager_
7f90: 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
7fa0: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
7fb0: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
7fc0: 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
7fd0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
7fe0: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
7ff0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8000: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
8010: 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
8020: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
8030: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b  SQLITE_UNLOCK );
8040: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
8050: 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 52 45 41  tate==SQLITE_REA
8060: 44 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  DLOCK ){.    ass
8070: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
8080: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
8090: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
80a0: 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72  riteLock(&pPager
80b0: 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  ->fd);.    if( r
80c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
80d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
80e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
80f0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
8100: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
8110: 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
8120: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50   1 );.    if( pP
8130: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
8140: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8150: 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70  iteOsReadLock(&p
8160: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
8170: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8180: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
8190: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70   rc = sqliteOsOp
81a0: 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
81b0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
81c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
81d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
81e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
81f0: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
8200: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
8210: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
8220: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
8230: 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c     sqliteOsReadL
8240: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
8250: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
8260: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
8270: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
8280: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
8290: 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  1;.    pPager->n
82a0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
82b0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69   pPager->dirtyFi
82c0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  le = 0;.    pPag
82d0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
82e0: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20 20  TE_WRITELOCK;.  
82f0: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 70 61    sqlitepager_pa
8300: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
8310: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69  .    pPager->ori
8320: 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
8330: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 63  ->dbSize;.    rc
8340: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
8350: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
8360: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
8370: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
8380: 69 63 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ic));.    if( rc
8390: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
83a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
83b0: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
83c0: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 64  >jfd, &pPager->d
83d0: 62 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 50 67  bSize, sizeof(Pg
83e0: 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
83f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8400: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
8410: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
8420: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
8430: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8440: 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  OK ) rc = SQLITE
8450: 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
8460: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8470: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
8480: 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
8490: 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
84a0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
84b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
84c0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
84d0: 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
84e0: 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
84f0: 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
8500: 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
8510: 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
8520: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
8530: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
8540: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
8550: 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
8560: 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
8570: 20 61 63 71 75 69 72 65 73 20 61 20 77 72 69 74   acquires a writ
8580: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
8590: 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
85a0: 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  write.** lock co
85b0: 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69  uld not be acqui
85c0: 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
85d0: 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
85e0: 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63  _BUSY.  The.** c
85f0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d  alling routine m
8600: 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68  ust check for th
8610: 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  at return value 
8620: 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
8630: 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20  ot to.** change 
8640: 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
8650: 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  til this routine
8660: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
8670: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
8680: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
8690: 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74  uld not be writt
86a0: 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64  en because the d
86b0: 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20  isk is full,.** 
86c0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
86d0: 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
86e0: 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61  _FULL and does a
86f0: 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c  n immediate roll
8700: 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62  back..** All sub
8710: 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74  sequent write at
8720: 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75  tempts also retu
8730: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75  rn SQLITE_FULL u
8740: 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ntil there.** is
8750: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
8760: 65 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20  epager_commit() 
8770: 6f 72 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72  or sqlitepager_r
8780: 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20  ollback() to.** 
8790: 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  reset..*/.int sq
87a0: 6c 69 74 65 70 61 67 65 72 5f 77 72 69 74 65 28  litepager_write(
87b0: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
87c0: 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
87d0: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
87e0: 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
87f0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
8800: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
8810: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68  ITE_OK;..  /* Ch
8820: 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20  eck for errors. 
8830: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
8840: 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20  ->errMask ){ .  
8850: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
8860: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
8870: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
8880: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
8890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
88a0: 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  PERM;.  }..  /* 
88b0: 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
88c0: 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
88d0: 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
88e0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
88f0: 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
8900: 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
8910: 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
8920: 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72  .  */.  pPg->dir
8930: 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ty = 1;.  if( pP
8940: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
8950: 28 70 50 67 2d 3e 69 6e 43 6b 70 74 20 7c 7c 20  (pPg->inCkpt || 
8960: 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73  pPager->ckptInUs
8970: 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
8980: 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d  ger->dirtyFile =
8990: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
89a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
89b0: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
89c0: 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
89d0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
89e0: 65 65 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20  eeds to be.  ** 
89f0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
8a00: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
8a10: 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
8a20: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  oint journal.  *
8a30: 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  * or both..  **.
8a40: 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b    ** First check
8a50: 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65   to see that the
8a60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
8a70: 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a  rnal exists and.
8a80: 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69    ** create it i
8a90: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  f it does not.. 
8aa0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
8ab0: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c  ager->state!=SQL
8ac0: 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  ITE_UNLOCK );.  
8ad0: 72 63 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72  rc = sqlitepager
8ae0: 5f 62 65 67 69 6e 28 70 44 61 74 61 29 3b 0a 20  _begin(pData);. 
8af0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69   pPager->dirtyFi
8b00: 6c 65 20 3d 20 31 3b 0a 20 20 69 66 28 20 72 63  le = 1;.  if( rc
8b10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8b20: 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
8b30: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
8b40: 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  ==SQLITE_WRITELO
8b50: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
8b60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8b70: 70 65 6e 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  pen );..  /* The
8b80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
8b90: 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
8ba0: 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 77 72  and we have a wr
8bb0: 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite lock on the.
8bc0: 20 20 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62 61    ** main databa
8bd0: 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
8be0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
8bf0: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
8c00: 69 6f 6e 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ion .  ** journa
8c10: 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
8c20: 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
8c30: 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  */.  if( !pPg->i
8c40: 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
8c50: 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
8c60: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
8c70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8c80: 69 74 65 4f 73 57 72 69 74 65 28 26 70 50 61 67  iteOsWrite(&pPag
8c90: 65 72 2d 3e 6a 66 64 2c 20 26 70 50 67 2d 3e 70  er->jfd, &pPg->p
8ca0: 67 6e 6f 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f  gno, sizeof(Pgno
8cb0: 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ));.    if( rc==
8cc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8cd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
8ce0: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
8cf0: 66 64 2c 20 70 44 61 74 61 2c 20 53 51 4c 49 54  fd, pData, SQLIT
8d00: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
8d10: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
8d20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8d30: 20 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72     sqlitepager_r
8d40: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
8d50: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
8d60: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
8d70: 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
8d80: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
8d90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
8da0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
8db0: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
8dc0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
8dd0: 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
8de0: 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
8df0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
8e00: 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
8e10: 6f 53 79 6e 63 3b 0a 20 20 20 20 70 50 67 2d 3e  oSync;.    pPg->
8e20: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
8e30: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63     if( pPager->c
8e40: 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  kptInUse ){.    
8e50: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70    pPager->aInCkp
8e60: 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
8e70: 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
8e80: 37 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  7);.      pPg->i
8e90: 6e 43 6b 70 74 20 3d 20 31 3b 0a 20 20 20 20 7d  nCkpt = 1;.    }
8ea0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
8eb0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
8ec0: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
8ed0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
8ee0: 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65   in it,.  ** the
8ef0: 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
8f00: 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
8f10: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
8f20: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  al..  */.  if( p
8f30: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
8f40: 20 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74   && !pPg->inCkpt
8f50: 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
8f60: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74  no<=pPager->ckpt
8f70: 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
8f80: 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
8f90: 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
8fa0: 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
8fb0: 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 72  gDbSize );.    r
8fc0: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
8fd0: 65 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c  e(&pPager->cpfd,
8fe0: 20 26 70 50 67 2d 3e 70 67 6e 6f 2c 20 73 69 7a   &pPg->pgno, siz
8ff0: 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
9000: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9010: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
9020: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
9030: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 70 44 61  Pager->cpfd, pDa
9040: 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ta, SQLITE_PAGE_
9050: 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  SIZE);.    }.   
9060: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9070: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
9080: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
9090: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
90a0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
90b0: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
90c0: 4c 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  L;.      return 
90d0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
90e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
90f0: 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20 20  nCkpt!=0 );.    
9100: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b  pPager->aInCkpt[
9110: 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
9120: 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
9130: 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70  ;.    pPg->inCkp
9140: 74 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 1;.  }..  /*
9150: 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
9160: 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
9170: 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
9180: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
9190: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
91a0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
91b0: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
91c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
91d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
91e0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
91f0: 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
9200: 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
9210: 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
9220: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65  ** to sqlitepage
9230: 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  r_write().  In o
9240: 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
9250: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
9260: 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
9270: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
9280: 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74  the page..*/.int
9290: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 69 73 77   sqlitepager_isw
92a0: 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70  riteable(void *p
92b0: 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
92c0: 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
92d0: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
92e0: 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b  turn pPg->dirty;
92f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
9300: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
9310: 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
9320: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
9330: 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
9340: 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
9350: 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70  ation on page "p
9360: 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65  gno" back to the
9370: 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
9380: 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
9390: 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
93a0: 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
93b0: 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
93c0: 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
93d0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
93e0: 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
93f0: 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
9400: 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
9410: 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
9420: 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
9430: 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
9440: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
9450: 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
9460: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
9470: 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
9480: 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
9490: 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
94a0: 2a 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f  * sqlitepager_do
94b0: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65  nt_rollback() be
94c0: 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64  low, more than d
94d0: 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a  ouble the speed.
94e0: 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45  ** of large INSE
94f0: 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e  RT operations an
9500: 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  d quadruple the 
9510: 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44  speed of large D
9520: 45 4c 45 54 45 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ELETEs..*/.void 
9530: 73 71 6c 69 74 65 70 61 67 65 72 5f 64 6f 6e 74  sqlitepager_dont
9540: 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  _write(Pager *pP
9550: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
9560: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
9570: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
9580: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
9590: 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26  o);.  if( pPg &&
95a0: 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20   pPg->dirty ){. 
95b0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
95c0: 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d  bSize==(int)pPg-
95d0: 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d  >pgno && pPager-
95e0: 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67  >origDbSize<pPag
95f0: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
9600: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
9610: 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74  ages is the last
9620: 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
9630: 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
9640: 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a  as grown.      *
9650: 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  * during the cur
9660: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
9670: 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61  , then do NOT ma
9680: 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
9690: 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57  lean..      ** W
96a0: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
96b0: 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20   file grows, we 
96c0: 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
96d0: 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
96e0: 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20  e.      ** gets 
96f0: 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74  written at least
9700: 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68   once so that th
9710: 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c  e disk file will
9720: 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a   be the correct.
9730: 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49        ** size. I
9740: 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69  f you do not wri
9750: 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64  te this page and
9760: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
9770: 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f   file.      ** o
9780: 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20  n the disk ends 
9790: 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61  up being too sma
97a0: 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61  ll, that can lea
97b0: 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20  d to database.  
97c0: 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f      ** corruptio
97d0: 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78  n during the nex
97e0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
97f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
9800: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  e{.      pPg->di
9810: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rty = 0;.    }. 
9820: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61   }.}../*.** A ca
9830: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
9840: 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
9850: 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c  er that if a rol
9860: 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a  lback occurs,.**
9870: 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
9880: 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20  sary to restore 
9890: 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20  the data on the 
98a0: 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69  given page.  Thi
98b0: 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  s.** means that 
98c0: 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
98d0: 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72  ot have to recor
98e0: 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  d the given page
98f0: 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62   in the.** rollb
9900: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ack journal..*/.
9910: 76 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72  void sqlitepager
9920: 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76  _dont_rollback(v
9930: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
9940: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
9950: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
9960: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
9970: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
9980: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
9990: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52  state!=SQLITE_WR
99a0: 49 54 45 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  ITELOCK || pPage
99b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
99c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
99d0: 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
99e0: 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
99f0: 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
9a00: 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
9a10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9a20: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
9a30: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
9a40: 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
9a50: 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
9a60: 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
9a70: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
9a80: 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  1;.    if( pPage
9a90: 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a  r->ckptInUse ){.
9aa0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
9ab0: 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nCkpt[pPg->pgno/
9ac0: 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
9ad0: 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 50  gno&7);.      pP
9ae0: 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 31 3b 0a 20  g->inCkpt = 1;. 
9af0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
9b00: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
9b10: 20 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74   && !pPg->inCkpt
9b20: 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
9b30: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74  no<=pPager->ckpt
9b40: 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
9b50: 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
9b60: 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
9b70: 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
9b80: 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
9b90: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
9ba0: 49 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20  InCkpt!=0 );.   
9bb0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
9bc0: 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
9bd0: 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
9be0: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b  );.    pPg->inCk
9bf0: 70 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pt = 1;.  }.}../
9c00: 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20  *.** Commit all 
9c10: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
9c20: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65  atabase and rele
9c30: 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
9c40: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
9c50: 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f   commit fails fo
9c60: 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20  r any reason, a 
9c70: 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74  rollback attempt
9c80: 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20   is made.** and 
9c90: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
9ca0: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74   returned.  If t
9cb0: 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64  he commit worked
9cc0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  , SQLITE_OK.** i
9cd0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
9ce0: 6e 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63  nt sqlitepager_c
9cf0: 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
9d00: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
9d10: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
9d20: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
9d30: 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f  Mask==PAGER_ERR_
9d40: 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
9d50: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c   sqlitepager_rol
9d60: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
9d70: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9d80: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49  E_OK ) rc = SQLI
9d90: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 72 65 74  TE_FULL;.    ret
9da0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
9db0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
9dc0: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
9dd0: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
9de0: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
9df0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
9e00: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
9e10: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
9e20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9e30: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
9e40: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9e50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
9e60: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9e70: 64 69 72 74 79 46 69 6c 65 3d 3d 30 20 29 7b 0a  dirtyFile==0 ){.
9e80: 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c      /* Exit earl
9e90: 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  y (without doing
9ea0: 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d   the time-consum
9eb0: 69 6e 67 20 73 71 6c 69 74 65 4f 73 53 79 6e 63  ing sqliteOsSync
9ec0: 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a  () calls).    **
9ed0: 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62   if there have b
9ee0: 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
9ef0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
9f00: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ile. */.    rc =
9f10: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
9f20: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
9f30: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
9f40: 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
9f50: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
9f60: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 26  ager->needSync &
9f70: 26 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26  & sqliteOsSync(&
9f80: 70 50 61 67 65 72 2d 3e 6a 66 64 29 21 3d 53 51  pPager->jfd)!=SQ
9f90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
9fa0: 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74  oto commit_abort
9fb0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d  ;.  }.  for(pPg=
9fc0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
9fd0: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
9fe0: 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
9ff0: 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 20 63  Pg->dirty==0 ) c
a000: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20  ontinue;.    rc 
a010: 3d 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26  = sqliteOsSeek(&
a020: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 50 67  pPager->fd, (pPg
a030: 2d 3e 70 67 6e 6f 2d 31 29 2a 53 51 4c 49 54 45  ->pgno-1)*SQLITE
a040: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
a050: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a060: 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
a070: 5f 61 62 6f 72 74 3b 0a 20 20 20 20 72 63 20 3d  _abort;.    rc =
a080: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
a090: 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
a0a0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
a0b0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
a0c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
a0d0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
a0e0: 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
a0f0: 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
a100: 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71 6c 69 74  >noSync && sqlit
a110: 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  eOsSync(&pPager-
a120: 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  >fd)!=SQLITE_OK 
a130: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  ){.    goto comm
a140: 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  it_abort;.  }.  
a150: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
a160: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
a170: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
a180: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
a190: 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  rc;..  /* Jump h
a1a0: 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ere if anything 
a1b0: 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e  goes wrong durin
a1c0: 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
a1d0: 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69  cess..  */.commi
a1e0: 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20  t_abort:.  rc = 
a1f0: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
a200: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
a210: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a220: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  K ){.    rc = SQ
a230: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
a240: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a250: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
a260: 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20  l changes.  The 
a270: 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
a280: 61 63 6b 20 74 6f 20 72 65 61 64 2d 6f 6e 6c 79  ack to read-only
a290: 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
a2a0: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
a2b0: 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
a2c0: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
a2d0: 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
a2e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
a2f0: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
a300: 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
a310: 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
a320: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
a330: 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
a340: 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
a350: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
a360: 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   (SQLITE_PROTOCO
a370: 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  L) or unless som
a380: 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
a390: 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
a3a0: 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
a3b0: 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
a3c0: 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
a3d0: 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
a3e0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
a3f0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
a400: 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
a410: 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
a420: 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
a430: 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
a440: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
a450: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
a460: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
a470: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
a480: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
a490: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
a4a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
a4b0: 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72  ask!=0 && pPager
a4c0: 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52  ->errMask!=PAGER
a4d0: 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  _ERR_FULL ){.   
a4e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
a4f0: 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49 54 45  te>=SQLITE_WRITE
a500: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  LOCK ){.      pa
a510: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
a520: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
a530: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
a540: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
a550: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
a560: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52  state!=SQLITE_WR
a570: 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ITELOCK ){.    r
a580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a590: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65  .  }.  rc = page
a5a0: 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
a5b0: 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
a5c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
a5d0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
a5e0: 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  PT;.    pPager->
a5f0: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
a600: 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20  _ERR_CORRUPT;.  
a610: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
a620: 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ze = -1;.  retur
a630: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
a640: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
a650: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
a660: 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
a670: 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
a680: 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
a690: 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
a6a0: 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
a6b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
a6c0: 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  r_isreadonly(Pag
a6d0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
a6e0: 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
a6f0: 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
a700: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a710: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
a720: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
a730: 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
a740: 69 74 65 70 61 67 65 72 5f 73 74 61 74 73 28 50  itepager_stats(P
a750: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
a760: 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d   static int a[9]
a770: 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65  ;.  a[0] = pPage
a780: 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20  r->nRef;.  a[1] 
a790: 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b  = pPager->nPage;
a7a0: 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72  .  a[2] = pPager
a7b0: 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d  ->mxPage;.  a[3]
a7c0: 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
a7d0: 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
a7e0: 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
a7f0: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  ] = pPager->errM
a800: 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ask;.  a[6] = pP
a810: 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
a820: 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
a830: 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61  ss;.  a[8] = pPa
a840: 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65  ger->nOvfl;.  re
a850: 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn a;.}../*.**
a860: 20 53 65 74 20 74 68 65 20 63 68 65 63 6b 70 6f   Set the checkpo
a870: 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
a880: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
a890: 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
a8a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
a8b0: 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
a8c0: 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 63 68   open.  A new ch
a8d0: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
a8e0: 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
a8f0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
a900: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
a910: 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
a920: 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
a930: 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
a940: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
a950: 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74  sqlitepager_ckpt
a960: 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  _begin(Pager *pP
a970: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
a980: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
a990: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
a9a0: 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ZE];.  assert( p
a9b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
a9c0: 65 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  en );.  assert( 
a9d0: 21 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55  !pPager->ckptInU
a9e0: 73 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  se );.  pPager->
a9f0: 61 49 6e 43 6b 70 74 20 3d 20 73 71 6c 69 74 65  aInCkpt = sqlite
aa00: 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
aa10: 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
aa20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
aa30: 6e 43 6b 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nCkpt==0 ){.    
aa40: 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b  sqliteOsReadLock
aa50: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
aa60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
aa70: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63  _NOMEM;.  }.  rc
aa80: 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53   = sqliteOsFileS
aa90: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
aaa0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  , &pPager->ckptJ
aab0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
aac0: 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69  ) goto ckpt_begi
aad0: 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 70 50 61 67  n_failed;.  pPag
aae0: 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d 20 70  er->ckptSize = p
aaf0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
ab00: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 6b   if( !pPager->ck
ab10: 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  ptOpen ){.    rc
ab20: 20 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 6f   = sqlitepager_o
ab30: 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26  pentemp(zTemp, &
ab40: 70 50 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20  pPager->cpfd);. 
ab50: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
ab60: 20 63 6b 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c   ckpt_begin_fail
ab70: 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ed;.    pPager->
ab80: 63 6b 70 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  ckptOpen = 1;.  
ab90: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  }.  pPager->ckpt
aba0: 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
abb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
abc0: 0a 63 6b 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .ckpt_begin_fail
abd0: 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
abe0: 2d 3e 61 49 6e 43 6b 70 74 20 29 7b 0a 20 20 20  ->aInCkpt ){.   
abf0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
ac00: 65 72 2d 3e 61 49 6e 43 6b 70 74 29 3b 0a 20 20  er->aInCkpt);.  
ac10: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70    pPager->aInCkp
ac20: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
ac30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ac40: 20 43 6f 6d 6d 69 74 20 61 20 63 68 65 63 6b 70   Commit a checkp
ac50: 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oint..*/.int sql
ac60: 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 63 6f  itepager_ckpt_co
ac70: 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
ac80: 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
ac90: 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a  r->ckptInUse ){.
aca0: 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
acb0: 20 20 20 20 73 71 6c 69 74 65 4f 73 54 72 75 6e      sqliteOsTrun
acc0: 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 63 70  cate(&pPager->cp
acd0: 66 64 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67  fd, 0);.    pPag
ace0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20  er->ckptInUse = 
acf0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  0;.    sqliteFre
ad00: 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  e( pPager->aInCk
ad10: 70 74 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  pt );.    pPager
ad20: 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 30 3b 0a 20  ->aInCkpt = 0;. 
ad30: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
ad40: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
ad50: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
ad60: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 43  {.      pPg->inC
ad70: 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  kpt = 0;.    }. 
ad80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
ad90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ada0: 52 6f 6c 6c 62 61 63 6b 20 61 20 63 68 65 63 6b  Rollback a check
adb0: 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  point..*/.int sq
adc0: 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 72  litepager_ckpt_r
add0: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
ade0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
adf0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
ae00: 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  ckptInUse ){.   
ae10: 20 72 63 20 3d 20 70 61 67 65 72 5f 63 6b 70 74   rc = pager_ckpt
ae20: 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
ae30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67  );.    sqlitepag
ae40: 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 70  er_ckpt_commit(p
ae50: 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
ae60: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
ae70: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
ae80: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  n rc;.}..#if SQL
ae90: 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50  ITE_TEST./*.** P
aea0: 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
aeb0: 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
aec0: 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
aed0: 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
aee0: 6f 69 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f  oid sqlitepager_
aef0: 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70  refdump(Pager *p
af00: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
af10: 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d  *pPg;.  for(pPg=
af20: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
af30: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
af40: 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
af50: 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f  Pg->nRef<=0 ) co
af60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72 69 6e  ntinue;.    prin
af70: 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
af80: 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64  r=0x%08x nRef=%d
af90: 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
afa0: 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48  ->pgno, (int)PGH
afb0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
afc0: 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d   pPg->nRef);.  }
afd0: 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.