/ Hex Artifact Content
Login

Artifact 6ff6b906427d4824099140776cb8768f922f3dc5:


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 31 30  : pager.c,v 1.10
0350: 38 20 32 30 30 34 2f 30 35 2f 31 34 20 30 31 3a  8 2004/05/14 01:
0360: 35 38 3a 31 33 20 64 72 68 20 45 78 70 20 24 0a  58:13 drh Exp $.
0370: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e  */.#include "os.
0380: 68 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75  h"         /* Mu
0390: 73 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65  st be first to e
03a0: 6e 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65  nable large file
03b0: 20 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63   support */.#inc
03c0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
03d0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67  h".#include "pag
03e0: 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  er.h".#include <
03f0: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
0400: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f  de <string.h>../
0410: 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20  *.** Macros for 
0420: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e  troubleshooting.
0430: 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65    Normally turne
0440: 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73  d off.*/.#if 0.s
0450: 74 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69  tatic Pager *mai
0460: 6e 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66  nPager = 0;.#def
0470: 69 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29  ine SET_PAGER(X)
0480: 20 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d    if( mainPager=
0490: 3d 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d  =0 ) mainPager =
04a0: 20 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52   (X).#define CLR
04b0: 5f 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d  _PAGER(X)  if( m
04c0: 61 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20  ainPager==(X) ) 
04d0: 6d 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64  mainPager = 0.#d
04e0: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
04f0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d      if( pPager==
0500: 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69  mainPager ) fpri
0510: 6e 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64  ntf(stderr,X).#d
0520: 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59  efine TRACE2(X,Y
0530: 29 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d  )   if( pPager==
0540: 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69  mainPager ) fpri
0550: 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a  ntf(stderr,X,Y).
0560: 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58  #define TRACE3(X
0570: 2c 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72  ,Y,Z) if( pPager
0580: 3d 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70  ==mainPager ) fp
0590: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59  rintf(stderr,X,Y
05a0: 2c 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ,Z).#else.#defin
05b0: 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23  e SET_PAGER(X).#
05c0: 64 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52  define CLR_PAGER
05d0: 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (X).#define TRAC
05e0: 45 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52  E1(X).#define TR
05f0: 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e  ACE2(X,Y).#defin
0600: 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a  e TRACE3(X,Y,Z).
0610: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51  ates:.**.**   SQ
0670: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20  LITE_UNLOCK     
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
0760: 5f 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68  _READLOCK     Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54  **   SQLITE_WRIT
0860: 45 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67  ELOCK    The pag
0870: 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69  e cache is writi
0880: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
0890: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08a0: 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73            Access
08b0: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
08c0: 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  No other process
08d0: 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  es or.**        
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
08f0: 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65  hreads can be re
0900: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
0910: 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20   while one.**   
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77      process is w
0940: 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  riting..**.** Th
0950: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0960: 65 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f  es up in SQLITE_
0970: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0980: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0990: 69 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f  ite_page_get() o
09a0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
09b0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
09c0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
09d0: 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61  .** After all pa
09e0: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  ges have been re
09f0: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
0a00: 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29  ite_page_unref()
0a10: 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74  ,.** the state t
0a20: 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20  ransitions back 
0a30: 74 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b  to SQLITE_UNLOCK
0a40: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0a50: 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65  e.** that sqlite
0a60: 5f 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73  _page_write() is
0a70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0a80: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0a90: 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54  o.** SQLITE_WRIT
0aa0: 45 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68  ELOCK.  (Note th
0ab0: 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77  at sqlite_page_w
0ac0: 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20  rite() can only 
0ad0: 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20  be.** called on 
0ae0: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  an outstanding p
0af0: 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20  age which means 
0b00: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d  that the pager m
0b10: 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c  ust.** be in SQL
0b20: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66  ITE_READLOCK bef
0b30: 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f  ore it transitio
0b40: 6e 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49  ns to SQLITE_WRI
0b50: 54 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20  TELOCK.).** The 
0b60: 73 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c  sqlite_page_roll
0b70: 62 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74  back() and sqlit
0b80: 65 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20  e_page_commit() 
0b90: 66 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72  functions .** tr
0ba0: 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61  ansition the sta
0bb0: 74 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57  te from SQLITE_W
0bc0: 52 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f  RITELOCK back to
0bd0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
0be0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  ..*/.#define SQL
0bf0: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0c00: 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  0.#define SQLITE
0c10: 5f 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23  _READLOCK    1.#
0c20: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52  define SQLITE_WR
0c30: 49 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a  ITELOCK   2.../*
0c40: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
0c50: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
0c60: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
0c70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
0c80: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
0c90: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
0ca0: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
0cb0: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
0cc0: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
0cd0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
0ce0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
0cf0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
0d00: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
0d10: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
0d20: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
0d30: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e  pager_write() on
0d40: 20 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f   a page prior to
0d50: 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d   making.** any m
0d60: 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20  odifications to 
0d70: 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20  that page.  The 
0d80: 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74  first time sqlit
0d90: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a  e3pager_write().
0da0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ** is called, th
0db0: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
0dc0: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69  contents are wri
0dd0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f  tten into the ro
0de0: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0df0: 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f  l and PgHdr.inJo
0e00: 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e  urnal and PgHdr.
0e10: 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73 65 74  needSync are set
0e20: 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a  .  Later, once.*
0e30: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  * the journal pa
0e40: 67 65 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f  ge has made it o
0e50: 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72  nto the disk sur
0e60: 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64  face, PgHdr.need
0e70: 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72  Sync.** is clear
0e80: 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65  ed.  The modifie
0e90: 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  d page cannot be
0ea0: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
0eb0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  to the original.
0ec0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
0ed0: 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e   until the journ
0ee0: 61 6c 20 70 61 67 65 73 20 68 61 73 20 62 65 65  al pages has bee
0ef0: 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
0f00: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64   and the.** PgHd
0f10: 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62  r.needSync has b
0f20: 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  een cleared..**.
0f30: 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69 72  ** The PgHdr.dir
0f40: 74 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  ty flag is set w
0f50: 68 65 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72  hen sqlite3pager
0f60: 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  _write() is call
0f70: 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65  ed and.** is cle
0f80: 61 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20  ared again when 
0f90: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
0fa0: 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b   is written back
0fb0: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
0fc0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
0fd0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0fe0: 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72  ruct PgHdr PgHdr
0ff0: 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b  ;.struct PgHdr {
1000: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1020: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
1030: 6f 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67  o which this pag
1040: 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50  e belongs */.  P
1050: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1070: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1080: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
1090: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
10a0: 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68  Hash, *pPrevHash
10b0: 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69  ;  /* Hash colli
10c0: 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50  sion chain for P
10d0: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50  gHdr.pgno */.  P
10e0: 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c  gHdr *pNextFree,
10f0: 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a   *pPrevFree;  /*
1100: 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67   Freelist of pag
1110: 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
1120: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
1130: 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  xtAll;          
1140: 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f       /* A list o
1150: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
1160: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d   PgHdr *pNextStm
1170: 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20  t, *pPrevStmt;  
1180: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
1190: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
11a0: 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  t journal */.  u
11b0: 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  8 inJournal;    
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d0: 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65   TRUE if has bee
11e0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  n written to jou
11f0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53  rnal */.  u8 inS
1200: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1210: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
1220: 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65   if in the state
1230: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
1240: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20  */.  u8 dirty;  
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1260: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77      /* TRUE if w
1270: 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  e need to write 
1280: 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a  back changes */.
1290: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c   /* Sync journal
12c0: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
12d0: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
12e0: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
12f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1300: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
1310: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69  llback() for thi
1320: 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72  s page */.  shor
1330: 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20  t int nRef;     
1340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1350: 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66  mber of users of
1360: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1370: 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20  PgHdr *pDirty;  
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1390: 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 73 6f  * Dirty pages so
13a0: 72 74 65 64 20 62 79 20 50 67 48 64 72 2e 70 67  rted by PgHdr.pg
13b0: 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54  no */.  /* SQLIT
13c0: 45 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65  E_PAGE_SIZE byte
13d0: 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66  s of page data f
13e0: 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65  ollow this heade
13f0: 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e  r */.  /* Pager.
1400: 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
1410: 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f  local data follo
1420: 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  w the page data 
1430: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
1440: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
1450: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
1460: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
1470: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
1480: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
1490: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
14a0: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
14b0: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
14c0: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
14d0: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
14e0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
14f0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1500: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
1510: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
1520: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
1530: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
1540: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1550: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
1560: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
1570: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
1580: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
1590: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
15a0: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
15b0: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
15c0: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
15d0: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
15e0: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
15f0: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
1600: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
1610: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
1620: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
1630: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
1640: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
1650: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
1660: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
1670: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
1680: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
1690: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
16a0: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
16b0: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
16c0: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
16d0: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
16e0: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
16f0: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
1700: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
1710: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
1720: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
1730: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
1740: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
1750: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
1760: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
1770: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
1780: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
1790: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
17a0: 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c  efine CODEC(P,D,
17b0: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
17c0: 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  ec ){ P->xCodec(
17d0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
17e0: 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64  ,X); }.#else.# d
17f0: 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c  efine CODEC(P,D,
1800: 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  N,X).#endif../*.
1810: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
1820: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
1830: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
1840: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
1850: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
1860: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
1870: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
1880: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
1890: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
18a0: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
18b0: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
18c0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
18d0: 54 52 41 28 50 29 20 28 28 76 6f 69 64 2a 29 26  TRA(P) ((void*)&
18e0: 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d  ((char*)(&(P)[1]
18f0: 29 29 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ))[SQLITE_PAGE_S
1900: 49 5a 45 5d 29 0a 23 64 65 66 69 6e 65 20 50 47  IZE]).#define PG
1910: 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47  HDR_TO_HIST(P,PG
1920: 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20  R)  \.          
1930: 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26    ((PgHistory*)&
1940: 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d  ((char*)(&(P)[1]
1950: 29 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69  ))[(PGR)->pageSi
1960: 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61  ze+(PGR)->nExtra
1970: 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69  ])../*.** How bi
1980: 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  g to make the ha
1990: 73 68 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f  sh table used fo
19a0: 72 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65  r locating in-me
19b0: 6d 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20 62 79  mory pages.** by
19c0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f   page number..*/
19d0: 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41  .#define N_PG_HA
19e0: 53 48 20 32 30 34 38 0a 0a 2f 2a 0a 2a 2a 20 48  SH 2048../*.** H
19f0: 61 73 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ash a page numbe
1a00: 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67  r.*/.#define pag
1a10: 65 72 5f 68 61 73 68 28 50 4e 29 20 20 28 28 50  er_hash(PN)  ((P
1a20: 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48 2d 31 29  N)&(N_PG_HASH-1)
1a30: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
1a40: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
1a50: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1a60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1a70: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
1a80: 50 61 67 65 72 20 7b 0a 20 20 63 68 61 72 20 2a  Pager {.  char *
1a90: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
1aa0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1ab0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ac0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
1ad0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
1ae0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1af0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
1b10: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
1b20: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
1b30: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
1b40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
1b50: 0a 20 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66  .  OsFile fd, jf
1b60: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
1b70: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1b80: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
1b90: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
1ba0: 20 4f 73 46 69 6c 65 20 73 74 66 64 3b 20 20 20   OsFile stfd;   
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1bd0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
1be0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20  t subjournal*/. 
1bf0: 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20   int dbSize;    
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c10: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1c20: 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  in the file */. 
1c30: 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b   int origDbSize;
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c50: 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68  dbSize before th
1c60: 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65  e current change
1c70: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69   */.  int stmtSi
1c80: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1c90: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74    /* Size of dat
1ca0: 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29  abase (in pages)
1cb0: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
1cc0: 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 73 74 6d 74   */.  off_t stmt
1cd0: 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  JSize;          
1ce0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
1cf0: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
1d00: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  in() */.  int nR
1d10: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1d20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d30: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
1d40: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1d50: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
1d60: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
1d70: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
1d80: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
1d90: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
1da0: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63  /.  int stmtNRec
1db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
1dd0: 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62  ords in stmt sub
1de0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
1df0: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
1e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1e10: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1e20: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
1e30: 79 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64  y page */.  void
1e40: 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28   (*xDestructor)(
1e50: 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43  void*,int); /* C
1e60: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
1e70: 20 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61   when freeing pa
1e80: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  ges */.  int pag
1e90: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
1ea0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1eb0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
1ec0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
1ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1ef0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
1f00: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  pages */.  int n
1f10: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1f20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f30: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
1f40: 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ges with PgHdr.n
1f50: 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d  Ref>0 */.  int m
1f60: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
1f70: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
1f80: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
1f90: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
1fa0: 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74  he */.  int nHit
1fb0: 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20  , nMiss, nOvfl; 
1fc0: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
1fd0: 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20  s, missing, and 
1fe0: 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f  LRU overflows */
1ff0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
2000: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
2010: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
2020: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
2030: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
2040: 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20  id *pCodecArg;  
2050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2060: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
2070: 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 75 38 20  Codec() */.  u8 
2080: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20  journalOpen;    
2090: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20a0: 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
20b0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20   descriptors is 
20c0: 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f  valid */.  u8 jo
20d0: 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20  urnalStarted;   
20e0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20f0: 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72  f header of jour
2100: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  nal is synced */
2110: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
2120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2130: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
2140: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
2150: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74   file */.  u8 st
2160: 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  mtOpen;         
2170: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2180: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
2190: 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  subjournal is op
21a0: 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49  en */.  u8 stmtI
21b0: 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  nUse;           
21c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61      /* True we a
21d0: 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e  re in a statemen
21e0: 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
21f0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74   */.  u8 stmtAut
2200: 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  oopen;          
2210: 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a    /* Open stmt j
2220: 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e  ournal when main
2230: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
2240: 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  ed*/.  u8 noSync
2250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2260: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
2270: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
2280: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
2290: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
22a0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
22b0: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
22c0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
22d0: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73  stness */.  u8 s
22e0: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
22f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
2300: 45 5f 55 4e 4c 4f 43 4b 2c 20 5f 52 45 41 44 4c  E_UNLOCK, _READL
2310: 4f 43 4b 20 6f 72 20 5f 57 52 49 54 45 4c 4f 43  OCK or _WRITELOC
2320: 4b 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73  K */.  u8 errMas
2330: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2340: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
2350: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
2360: 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d  rors */.  u8 tem
2370: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
2380: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
2390: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
23a0: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
23b0: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
23c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
23d0: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
23e0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
23f0: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
2400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2410: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
2420: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
2430: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
2440: 20 64 69 72 74 79 46 69 6c 65 3b 20 20 20 20 20   dirtyFile;     
2450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2460: 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
2470: 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 69  le has changed i
2480: 6e 20 61 6e 79 20 77 61 79 20 2a 2f 0a 20 20 75  n any way */.  u
2490: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
24a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
24b0: 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  sable dont_rollb
24c0: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
24d0: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
24e0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
24f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2500: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
2510: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61 49   I/O */.  u8 *aI
2520: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
2530: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2540: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2550: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2560: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
2570: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
2580: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2590: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
25a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
25b0: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
25c0: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
25d0: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
25e0: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
25f0: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
2600: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
2610: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
2620: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
2630: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
2640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2650: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
2660: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
2670: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
2680: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
2690: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
26a0: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
26b0: 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  nal */.  PgHdr *
26c0: 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d  aHash[N_PG_HASH]
26d0: 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ;    /* Hash tab
26e0: 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e  le to map page n
26f0: 75 6d 62 65 72 20 6f 66 20 50 67 48 64 72 20 2a  umber of PgHdr *
2700: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  /.};../*.** Thes
2710: 65 20 61 72 65 20 62 69 74 73 20 74 68 61 74 20  e are bits that 
2720: 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61  can be set in Pa
2730: 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a  ger.errMask..*/.
2740: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
2750: 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20  R_FULL     0x01 
2760: 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66 61   /* a write() fa
2770: 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  iled */.#define 
2780: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20  PAGER_ERR_MEM   
2790: 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c     0x02  /* mall
27a0: 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23  oc() failed */.#
27b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
27c0: 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20  _LOCK     0x04  
27d0: 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  /* error in the 
27e0: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
27f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
2800: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30  R_ERR_CORRUPT  0
2810: 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65  x08  /* database
2820: 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   or journal corr
2830: 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e  uption */.#defin
2840: 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  e PAGER_ERR_DISK
2850: 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67 65       0x10  /* ge
2860: 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65  neral disk I/O e
2870: 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64 20  rror - bad hard 
2880: 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  drive? */../*.**
2890: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
28a0: 65 20 63 6f 6e 74 61 69 6e 73 20 70 61 67 65 20  e contains page 
28b0: 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 66  records in the f
28c0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66 6f 72 6d  ollowing.** form
28d0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c  at..**.** Actual
28e0: 6c 79 2c 20 74 68 69 73 20 73 74 72 75 63 74 75  ly, this structu
28f0: 72 65 20 69 73 20 74 68 65 20 63 6f 6d 70 6c 65  re is the comple
2900: 74 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 66  te page record f
2910: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 66 6f 72 6d  or pager.** form
2920: 61 74 73 20 6c 65 73 73 20 74 68 61 6e 20 33 2e  ats less than 3.
2930: 20 20 42 65 67 69 6e 6e 69 6e 67 20 77 69 74 68    Beginning with
2940: 20 66 6f 72 6d 61 74 20 33 2c 20 74 68 69 73 20   format 3, this 
2950: 72 65 63 6f 72 64 20 69 73 20 73 75 72 72 6f 75  record is surrou
2960: 6e 64 65 64 0a 2a 2a 20 62 79 20 74 77 6f 20 63  nded.** by two c
2970: 68 65 63 6b 73 75 6d 73 2e 0a 2a 2f 0a 74 79 70  hecksums..*/.typ
2980: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
2990: 52 65 63 6f 72 64 20 50 61 67 65 52 65 63 6f 72  Record PageRecor
29a0: 64 3b 0a 73 74 72 75 63 74 20 50 61 67 65 52 65  d;.struct PageRe
29b0: 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20 70 67  cord {.  Pgno pg
29c0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
29d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29e0: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
29f0: 20 63 68 61 72 20 61 44 61 74 61 5b 53 51 4c 49   char aData[SQLI
2a00: 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20  TE_PAGE_SIZE];  
2a10: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 64 61 74   /* Original dat
2a20: 61 20 66 6f 72 20 70 61 67 65 20 70 67 6e 6f 20  a for page pgno 
2a30: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  */.};../*.** Jou
2a40: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
2a50: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
2a60: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
2a70: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
2a80: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
2a90: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
2aa0: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
2ab0: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
2ac0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
2ad0: 65 20 74 68 72 65 65 20 6a 6f 75 72 6e 61 6c 20  e three journal 
2ae0: 66 6f 72 6d 61 74 73 20 28 73 6f 20 66 61 72 29  formats (so far)
2af0: 2e 20 54 68 65 20 31 73 74 20 6a 6f 75 72 6e 61  . The 1st journa
2b00: 6c 20 66 6f 72 6d 61 74 20 77 72 69 74 65 73 0a  l format writes.
2b10: 2a 2a 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ** 32-bit intege
2b20: 72 73 20 69 6e 20 74 68 65 20 62 79 74 65 2d 6f  rs in the byte-o
2b30: 72 64 65 72 20 6f 66 20 74 68 65 20 68 6f 73 74  rder of the host
2b40: 20 6d 61 63 68 69 6e 65 2e 20 20 4e 65 77 0a 2a   machine.  New.*
2b50: 2a 20 66 6f 72 6d 61 74 73 20 77 72 69 74 65 73  * formats writes
2b60: 20 69 6e 74 65 67 65 72 73 20 61 73 20 62 69 67   integers as big
2b70: 2d 65 6e 64 69 61 6e 2e 20 20 41 6c 6c 20 6e 65  -endian.  All ne
2b80: 77 20 6a 6f 75 72 6e 61 6c 73 20 75 73 65 20 74  w journals use t
2b90: 68 65 0a 2a 2a 20 6e 65 77 20 66 6f 72 6d 61 74  he.** new format
2ba0: 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 74 6f  , but we have to
2bb0: 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64   be able to read
2bc0: 20 61 6e 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61   an older journa
2bd0: 6c 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  l in order.** to
2be0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2bf0: 6c 73 20 63 72 65 61 74 65 64 20 62 79 20 6f 6c  ls created by ol
2c00: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
2c10: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a  the library..**.
2c20: 2a 2a 20 54 68 65 20 33 72 64 20 6a 6f 75 72 6e  ** The 3rd journ
2c30: 61 6c 20 66 6f 72 6d 61 74 20 28 61 64 64 65 64  al format (added
2c40: 20 66 6f 72 20 32 2e 38 2e 30 29 20 61 64 64 73   for 2.8.0) adds
2c50: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
2c60: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
2c70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
2c80: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
2c90: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
2ca0: 68 69 6c 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  hile the.** jour
2cb0: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
2cc0: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
2cd0: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
2ce0: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 0a 2a  ight appear in.*
2cf0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
2d00: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
2d10: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
2d20: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
2d30: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
2d40: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
2d50: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
2d60: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
2d70: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
2d80: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
2d90: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
2da0: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
2db0: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
2dc0: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
2dd0: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
2de0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
2df0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
2e00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
2e10: 68 65 20 33 72 64 20 6a 6f 75 72 6e 61 6c 20 66  he 3rd journal f
2e20: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
2e30: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
2e40: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
2e50: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
2e60: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
2e70: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
2e80: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
2e90: 65 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  e SQLITE_PAGE_SI
2ea0: 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ZE bytes of data
2eb0: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
2ec0: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
2ed0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
2ee0: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
2ef0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
2f00: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
2f10: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
2f20: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
2f30: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
2f40: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
2f50: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
2f60: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
2f70: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
2f80: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
2f90: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
2fa0: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
2fb0: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
2fc0: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
2fd0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
2fe0: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
2ff0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
3000: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
3010: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
3020: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
3030: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
3040: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
3050: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
3060: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
3070: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
3080: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
3090: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
30a0: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
30b0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
30c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
30d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 31 5b 5d 20 3d  ournalMagic1[] =
30e0: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
30f0: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
3100: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
3110: 78 64 34 2c 0a 7d 3b 0a 73 74 61 74 69 63 20 63  xd4,.};.static c
3120: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
3130: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
3140: 32 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  2[] = {.  0xd9, 
3150: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
3160: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
3170: 36 33 2c 20 30 78 64 35 2c 0a 7d 3b 0a 73 74 61  63, 0xd5,.};.sta
3180: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
3190: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
31a0: 4d 61 67 69 63 33 5b 5d 20 3d 20 7b 0a 20 20 30  Magic3[] = {.  0
31b0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
31c0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
31d0: 31 2c 20 30 78 36 33 2c 20 30 78 64 36 2c 0a 7d  1, 0x63, 0xd6,.}
31e0: 3b 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  ;.#define JOURNA
31f0: 4c 5f 46 4f 52 4d 41 54 5f 31 20 31 0a 23 64 65  L_FORMAT_1 1.#de
3200: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  fine JOURNAL_FOR
3210: 4d 41 54 5f 32 20 32 0a 23 64 65 66 69 6e 65 20  MAT_2 2.#define 
3220: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33  JOURNAL_FORMAT_3
3230: 20 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f   3../*.** The fo
3240: 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 67 65 72 20  llowing integer 
3250: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 61 74 20  determines what 
3260: 66 6f 72 6d 61 74 20 74 6f 20 75 73 65 20 77 68  format to use wh
3270: 65 6e 20 63 72 65 61 74 69 6e 67 0a 2a 2a 20 6e  en creating.** n
3280: 65 77 20 70 72 69 6d 61 72 79 20 6a 6f 75 72 6e  ew primary journ
3290: 61 6c 20 66 69 6c 65 73 2e 20 20 42 79 20 64 65  al files.  By de
32a0: 66 61 75 6c 74 20 77 65 20 61 6c 77 61 79 73 20  fault we always 
32b0: 75 73 65 20 66 6f 72 6d 61 74 20 33 2e 0a 2a 2a  use format 3..**
32c0: 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 77   When testing, w
32d0: 65 20 63 61 6e 20 73 65 74 20 74 68 69 73 20 76  e can set this v
32e0: 61 6c 75 65 20 74 6f 20 6f 6c 64 65 72 20 6a 6f  alue to older jo
32f0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20 69 6e  urnal formats in
3300: 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d 61 6b   order to.** mak
3310: 65 20 73 75 72 65 20 74 68 61 74 20 6e 65 77 65  e sure that newe
3320: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  r versions of th
3330: 65 20 6c 69 62 72 61 72 79 20 61 72 65 20 61 62  e library are ab
3340: 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  le to rollback o
3350: 6c 64 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  lder.** journal 
3360: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  files..**.** Not
3370: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
3380: 20 6a 6f 75 72 6e 61 6c 73 20 61 6c 77 61 79 73   journals always
3390: 20 75 73 65 20 66 6f 72 6d 61 74 20 32 20 61 6e   use format 2 an
33a0: 64 20 6f 6d 69 74 20 74 68 65 20 68 65 61 64 65  d omit the heade
33b0: 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  r..*/.#ifdef SQL
33c0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 6a 6f 75  ITE_TEST.int jou
33d0: 72 6e 61 6c 5f 66 6f 72 6d 61 74 20 3d 20 33 3b  rnal_format = 3;
33e0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
33f0: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20 33  journal_format 3
3400: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
3410: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
3420: 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63  eader and of eac
3430: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  h page in the jo
3440: 75 72 6e 61 6c 20 76 61 72 69 65 73 20 61 63 63  urnal varies acc
3450: 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 77 68 69  ording.** to whi
3460: 63 68 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ch journal forma
3470: 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  t is being used.
3480: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
3490: 6d 61 63 72 6f 73 20 66 69 67 75 72 65 20 6f 75  macros figure ou
34a0: 74 0a 2a 2a 20 74 68 65 20 73 69 7a 65 73 20 62  t.** the sizes b
34b0: 61 73 65 64 20 6f 6e 20 66 6f 72 6d 61 74 20 6e  ased on format n
34c0: 75 6d 62 65 72 73 2e 0a 2a 2f 0a 23 64 65 66 69  umbers..*/.#defi
34d0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
34e0: 5a 28 58 29 20 5c 0a 20 20 20 28 73 69 7a 65 6f  Z(X) \.   (sizeo
34f0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  f(aJournalMagic1
3500: 29 20 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ) + sizeof(Pgno)
3510: 20 2b 20 28 28 58 29 3e 3d 33 29 2a 32 2a 73 69   + ((X)>=3)*2*si
3520: 7a 65 6f 66 28 75 33 32 29 29 0a 23 64 65 66 69  zeof(u32)).#defi
3530: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
3540: 28 58 29 20 5c 0a 20 20 20 28 53 51 4c 49 54 45  (X) \.   (SQLITE
3550: 5f 50 41 47 45 5f 53 49 5a 45 20 2b 20 73 69 7a  _PAGE_SIZE + siz
3560: 65 6f 66 28 50 67 6e 6f 29 20 2b 20 28 28 58 29  eof(Pgno) + ((X)
3570: 3e 3d 33 29 2a 73 69 7a 65 6f 66 28 75 33 32 29  >=3)*sizeof(u32)
3580: 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  )../*.** Enable 
3590: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
35a0: 74 72 61 63 6b 69 6e 67 20 68 65 72 65 3a 0a 2a  tracking here:.*
35b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
35c0: 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72  TEST.  int pager
35d0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
35e0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
35f0: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
3600: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
3610: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
3620: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
3630: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
3640: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
3650: 20 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20    printf(.      
3660: 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64   "REFCNT: %4d ad
3670: 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25  dr=0x%08x nRef=%
3680: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e  d\n",.       p->
3690: 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52  pgno, (int)PGHDR
36a0: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
36b0: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
36c0: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
36d0: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
36e0: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
36f0: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
3700: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
3710: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
3720: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
3730: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
3740: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
3750: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
3760: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3770: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
3780: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
3790: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
37a0: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
37b0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
37c0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
37d0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
37e0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
37f0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
3800: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
3810: 6f 72 6d 61 74 20 69 73 20 32 20 6f 72 20 33 2c  ormat is 2 or 3,
3820: 20 72 65 61 64 20 61 20 62 69 67 2d 65 6e 64 69   read a big-endi
3830: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20  an integer.  If 
3840: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
3850: 6f 72 6d 61 74 20 69 73 20 31 2c 20 72 65 61 64  ormat is 1, read
3860: 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 20 74   an integer in t
3870: 68 65 20 6e 61 74 69 76 65 20 62 79 74 65 2d 6f  he native byte-o
3880: 72 64 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 68  rder of the.** h
3890: 6f 73 74 20 6d 61 63 68 69 6e 65 2e 0a 2a 2f 0a  ost machine..*/.
38a0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
38b0: 32 62 69 74 73 28 69 6e 74 20 66 6f 72 6d 61 74  2bits(int format
38c0: 2c 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  , OsFile *fd, u3
38d0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20  2 *pRes){.  u32 
38e0: 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  res;.  int rc;. 
38f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
3900: 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69  ead(fd, &res, si
3910: 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66  zeof(res));.  if
3920: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3930: 26 26 20 66 6f 72 6d 61 74 3e 4a 4f 55 52 4e 41  && format>JOURNA
3940: 4c 5f 46 4f 52 4d 41 54 5f 31 20 29 7b 0a 20 20  L_FORMAT_1 ){.  
3950: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3960: 61 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ac[4];.    memcp
3970: 79 28 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a  y(ac, &res, 4);.
3980: 20 20 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d      res = (ac[0]
3990: 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c  <<24) | (ac[1]<<
39a0: 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29  16) | (ac[2]<<8)
39b0: 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20   | ac[3];.  }.  
39c0: 2a 70 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72  *pRes = res;.  r
39d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
39e0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
39f0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
3a00: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
3a10: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
3a20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
3a30: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
3a40: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
3a50: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
3a60: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
3a70: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3a80: 69 73 20 32 20 6f 72 20 33 2c 20 77 72 69 74 65  is 2 or 3, write
3a90: 20 74 68 65 20 69 6e 74 65 67 65 72 20 61 73 20   the integer as 
3aa0: 34 20 62 69 67 2d 65 6e 64 69 61 6e 0a 2a 2a 20  4 big-endian.** 
3ab0: 62 79 74 65 73 2e 20 20 49 66 20 74 68 65 20 6a  bytes.  If the j
3ac0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 69 73  ournal format is
3ad0: 20 31 2c 20 77 72 69 74 65 20 74 68 65 20 69 6e   1, write the in
3ae0: 74 65 67 65 72 20 69 6e 20 74 68 65 20 6e 61 74  teger in the nat
3af0: 69 76 65 0a 2a 2a 20 62 79 74 65 20 6f 72 64 65  ive.** byte orde
3b00: 72 2e 20 20 49 6e 20 6e 6f 72 6d 61 6c 20 6f 70  r.  In normal op
3b10: 65 72 61 74 69 6f 6e 2c 20 6f 6e 6c 79 20 66 6f  eration, only fo
3b20: 72 6d 61 74 73 20 32 20 61 6e 64 20 33 20 61 72  rmats 2 and 3 ar
3b30: 65 20 75 73 65 64 2e 0a 2a 2a 20 4a 6f 75 72 6e  e used..** Journ
3b40: 61 6c 20 66 6f 72 6d 61 74 20 31 20 69 73 20 6f  al format 1 is o
3b50: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 74 65 73  nly used for tes
3b60: 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
3b70: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
3b80: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20  OsFile *fd, u32 
3b90: 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  val){.  unsigned
3ba0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
3bb0: 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  f( journal_forma
3bc0: 74 3c 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75  t<=1 ){.    retu
3bd0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
3be0: 65 28 66 64 2c 20 26 76 61 6c 2c 20 34 29 3b 0a  e(fd, &val, 4);.
3bf0: 20 20 7d 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76    }.  ac[0] = (v
3c00: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
3c10: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
3c20: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
3c30: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
3c40: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
3c50: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72   val & 0xff;.  r
3c60: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
3c70: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
3c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
3c90: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
3ca0: 20 69 6e 74 6f 20 61 20 70 61 67 65 20 68 65 61   into a page hea
3cb0: 64 65 72 20 72 69 67 68 74 20 62 65 66 6f 72 65  der right before
3cc0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74   the.** page dat
3cd0: 61 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 6f 76  a.  This will ov
3ce0: 65 72 77 72 69 74 65 20 74 68 65 20 50 67 48 64  erwrite the PgHd
3cf0: 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
3d00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
3d10: 67 65 72 20 69 73 20 62 69 67 2d 65 6e 64 69 61  ger is big-endia
3d20: 6e 20 66 6f 72 20 66 6f 72 6d 61 74 73 20 32 20  n for formats 2 
3d30: 61 6e 64 20 33 20 61 6e 64 20 6e 61 74 69 76 65  and 3 and native
3d40: 20 62 79 74 65 20 6f 72 64 65 72 0a 2a 2a 20 66   byte order.** f
3d50: 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  or journal forma
3d60: 74 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t 1..*/.static v
3d70: 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74 73 28  oid store32bits(
3d80: 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20 2a  u32 val, PgHdr *
3d90: 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  p, int offset){.
3da0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3db0: 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75  *ac;.  ac = &((u
3dc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47  nsigned char*)PG
3dd0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b  HDR_TO_DATA(p))[
3de0: 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 6a  offset];.  if( j
3df0: 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3c 3d 31  ournal_format<=1
3e00: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61   ){.    memcpy(a
3e10: 63 2c 20 26 76 61 6c 2c 20 34 29 3b 0a 20 20 7d  c, &val, 4);.  }
3e20: 65 6c 73 65 7b 0a 20 20 20 20 61 63 5b 30 5d 20  else{.    ac[0] 
3e30: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
3e40: 66 66 3b 0a 20 20 20 20 61 63 5b 31 5d 20 3d 20  ff;.    ac[1] = 
3e50: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
3e60: 3b 0a 20 20 20 20 61 63 5b 32 5d 20 3d 20 28 76  ;.    ac[2] = (v
3e70: 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20  al>>8) & 0xff;. 
3e80: 20 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26     ac[3] = val &
3e90: 20 30 78 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f   0xff;.  }.}.../
3ea0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
3eb0: 20 62 69 74 73 20 69 6e 20 74 68 65 20 70 50 61   bits in the pPa
3ec0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74  ger->errMask int
3ed0: 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65 0a  o an approprate.
3ee0: 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a  ** return code..
3ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
3f00: 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67 65  ger_errcode(Page
3f10: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
3f20: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
3f30: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
3f40: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
3f50: 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63  ERR_LOCK )    rc
3f60: 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43   = SQLITE_PROTOC
3f70: 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OL;.  if( pPager
3f80: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
3f90: 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20 20 20  R_ERR_DISK )    
3fa0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
3fb0: 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  R;.  if( pPager-
3fc0: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
3fd0: 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20 20 72  _ERR_FULL )    r
3fe0: 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
3ff0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
4000: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
4010: 52 52 5f 4d 45 4d 20 29 20 20 20 20 20 72 63 20  RR_MEM )     rc 
4020: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
4030: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
4040: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
4050: 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63 20 3d  R_CORRUPT ) rc =
4060: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
4070: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4080: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65  ./*.** Add or re
4090: 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  move a page from
40a0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
40b0: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
40c0: 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d  in the.** statem
40d0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
40e0: 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65  ** The Pager kee
40f0: 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  ps a separate li
4100: 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  st of pages that
4110: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
4120: 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65  n.** the stateme
4130: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69  nt journal.  Thi
4140: 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69  s helps the sqli
4150: 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
4160: 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  mmit().** routin
4170: 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65  e run MUCH faste
4180: 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  r for the common
4190: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72   case where ther
41a0: 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61  e are many.** pa
41b0: 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75  ges in memory bu
41c0: 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65  t only a few are
41d0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
41e0: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  t journal..*/.st
41f0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61  atic void page_a
4200: 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
4210: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
4220: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
4230: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
4240: 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20  ( pPg->inStmt ) 
4250: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
4260: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
4270: 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78  ==0 && pPg->pNex
4280: 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50  tStmt==0 );.  pP
4290: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
42a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
42b0: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61  pStmt ){.    pPa
42c0: 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65  ger->pStmt->pPre
42d0: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d  vStmt = pPg;.  }
42e0: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  .  pPg->pNextStm
42f0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  t = pPager->pStm
4300: 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74  t;.  pPager->pSt
4310: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  mt = pPg;.  pPg-
4320: 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73  >inStmt = 1;.}.s
4330: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
4340: 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
4350: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
4360: 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  ){.  if( !pPg->i
4370: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
4380: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
4390: 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Stmt ){.    asse
43a0: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  rt( pPg->pPrevSt
43b0: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70  mt->pNextStmt==p
43c0: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
43d0: 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53  PrevStmt->pNextS
43e0: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
43f0: 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Stmt;.  }else{. 
4400: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
4410: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70  pPager->pStmt==p
4420: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
4430: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
4440: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
4450: 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
4460: 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  extStmt ){.    a
4470: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
4480: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
4490: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  ==pPg );.    pPg
44a0: 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72  ->pNextStmt->pPr
44b0: 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50  evStmt = pPg->pP
44c0: 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70  revStmt;.  }.  p
44d0: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
44e0: 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53  0;.  pPg->pPrevS
44f0: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  tmt = 0;.  pPg->
4500: 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  inStmt = 0;.}../
4510: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
4520: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
4530: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
4540: 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  e number.  Retur
4550: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
4560: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
4570: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
4580: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
4590: 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
45a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
45b0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
45c0: 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  r *p = pPager->a
45d0: 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28  Hash[pager_hash(
45e0: 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28  pgno)];.  while(
45f0: 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70   p && p->pgno!=p
4600: 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  gno ){.    p = p
4610: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
4620: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
4630: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
4640: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
4650: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
4660: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
4670: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
4680: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
4690: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
46a0: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
46b0: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
46c0: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
46d0: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
46e0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
46f0: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
4700: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
4710: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
4720: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
4730: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
4740: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4750: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
4760: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
4770: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
4780: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
4790: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
47a0: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  Pg=pNext){.    p
47b0: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
47c0: 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
47d0: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
47e0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
47f0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
4800: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
4810: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
4820: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
4830: 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  pAll = 0;.  mems
4840: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
4850: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
4860: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70  er->aHash));.  p
4870: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
4880: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4890: 73 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52  state>=SQLITE_WR
48a0: 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  ITELOCK ){.    s
48b0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
48c0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
48d0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  }.  sqlite3OsUnl
48e0: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
48f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
4900: 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43  e = SQLITE_UNLOC
4910: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  K;.  pPager->dbS
4920: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67  ize = -1;.  pPag
4930: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
4940: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
4950: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
4960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
4970: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
4980: 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
4990: 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  r has the journa
49a0: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a  l file open and.
49b0: 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  ** a write lock 
49c0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
49d0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
49e0: 65 6c 65 61 73 65 73 20 74 68 65 20 64 61 74 61  eleases the data
49f0: 62 61 73 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f  base.** write lo
4a00: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
4a10: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 6e 20 69  a read lock in i
4a20: 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a  ts place.  The j
4a30: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
4a40: 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c  s deleted and cl
4a50: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  osed..**.** TODO
4a60: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
4a70: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
4a80: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
4a90: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
4aa0: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
4ab0: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
4ac0: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
4ad0: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
4ae0: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
4af0: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
4b00: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
4b10: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
4b20: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
4b30: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
4b40: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
4b50: 70 50 67 3b 0a 20 20 69 66 28 20 70 50 61 67 65  pPg;.  if( pPage
4b60: 72 2d 3e 73 74 61 74 65 3c 53 51 4c 49 54 45 5f  r->state<SQLITE_
4b70: 57 52 49 54 45 4c 4f 43 4b 20 29 20 72 65 74 75  WRITELOCK ) retu
4b80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
4b90: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
4ba0: 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
4bb0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4bc0: 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
4bd0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
4be0: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
4bf0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
4c00: 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  pen = 0;.  }.  i
4c10: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
4c20: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
4c30: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
4c40: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
4c50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
4c60: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  pen = 0;.    sql
4c70: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
4c80: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
4c90: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
4ca0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
4cb0: 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
4cc0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
4cd0: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
4ce0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
4cf0: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
4d00: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
4d10: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
4d20: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
4d30: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
4d40: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
4d50: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
4d60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
4d70: 3e 64 69 72 74 79 46 69 6c 65 3d 3d 30 20 7c 7c  >dirtyFile==0 ||
4d80: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
4d90: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  nal==0 );.  }.  
4da0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
4db0: 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  adLock(&pPager->
4dc0: 66 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  fd);.  if( rc==S
4dd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4de0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
4df0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b  SQLITE_READLOCK;
4e00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
4e10: 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
4e20: 61 70 70 65 6e 20 69 66 20 61 20 70 72 6f 63 65  appen if a proce
4e30: 73 73 20 64 6f 65 73 20 61 20 42 45 47 49 4e 2c  ss does a BEGIN,
4e40: 20 74 68 65 6e 20 66 6f 72 6b 73 20 61 6e 64 20   then forks and 
4e50: 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  the.    ** child
4e60: 20 70 72 6f 63 65 73 73 20 64 6f 65 73 20 74 68   process does th
4e70: 65 20 43 4f 4d 4d 49 54 2e 20 20 42 65 63 61 75  e COMMIT.  Becau
4e80: 73 65 20 6f 66 20 74 68 65 20 73 65 6d 61 6e 74  se of the semant
4e90: 69 63 73 20 6f 66 20 75 6e 69 78 0a 20 20 20 20  ics of unix.    
4ea0: 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  ** file locking,
4eb0: 20 74 68 65 20 75 6e 6c 6f 63 6b 20 77 69 6c 6c   the unlock will
4ec0: 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   fail..    */.  
4ed0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
4ee0: 3d 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b  = SQLITE_UNLOCK;
4ef0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
4f10: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
4f20: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
4f30: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
4f40: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
4f50: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
4f60: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
4f70: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
4f80: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
4f90: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
4fa0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
4fb0: 2e 20 20 57 65 20 63 6f 6e 73 69 64 65 72 65 64  .  We considered
4fc0: 20 64 6f 20 61 20 63 68 65 63 6b 73 75 6d 0a 2a   do a checksum.*
4fd0: 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
4fe0: 65 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20  e, but that was 
4ff0: 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20  found to be too 
5000: 73 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  slow..*/.static 
5010: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
5020: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
5030: 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20  gno pgno, const 
5040: 63 68 61 72 20 2a 61 44 61 74 61 29 7b 0a 20 20  char *aData){.  
5050: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
5060: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 2b 20  er->cksumInit + 
5070: 70 67 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 63  pgno;.  return c
5080: 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ksum;.}../*.** R
5090: 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67  ead a single pag
50a0: 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
50b0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f  al file opened o
50c0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
50d0: 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62  r.** jfd.  Playb
50e0: 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67  ack this one pag
50f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  e..**.** There a
5100: 72 65 20 74 68 72 65 65 20 64 69 66 66 65 72 65  re three differe
5110: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
5120: 74 73 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20  ts.  The format 
5130: 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
5140: 69 6e 65 73 0a 2a 2a 20 77 68 69 63 68 20 66 6f  ines.** which fo
5150: 72 6d 61 74 20 69 73 20 75 73 65 64 20 62 79 20  rmat is used by 
5160: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  the journal that
5170: 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
5180: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5190: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
51a0: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
51b0: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
51c0: 64 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29 7b 0a  d, int format){.
51d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
51e0: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
51f0: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
5200: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
5210: 63 61 63 68 65 20 2a 2f 0a 20 20 50 61 67 65 52  cache */.  PageR
5220: 65 63 6f 72 64 20 70 67 52 65 63 3b 0a 20 20 75  ecord pgRec;.  u
5230: 33 32 20 63 6b 73 75 6d 3b 0a 0a 20 20 72 63 20  32 cksum;..  rc 
5240: 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72  = read32bits(for
5250: 6d 61 74 2c 20 6a 66 64 2c 20 26 70 67 52 65 63  mat, jfd, &pgRec
5260: 2e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  .pgno);.  if( rc
5270: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5280: 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
5290: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
52a0: 64 2c 20 26 70 67 52 65 63 2e 61 44 61 74 61 2c  d, &pgRec.aData,
52b0: 20 73 69 7a 65 6f 66 28 70 67 52 65 63 2e 61 44   sizeof(pgRec.aD
52c0: 61 74 61 29 29 3b 0a 20 20 69 66 28 20 72 63 21  ata));.  if( rc!
52d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
52e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 53 61  urn rc;..  /* Sa
52f0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
5300: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
5310: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
5320: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
5330: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
5340: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
5350: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
5360: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
5370: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
5380: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
5390: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
53a0: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
53b0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
53c0: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
53d0: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
53e0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
53f0: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
5400: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
5410: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
5420: 67 52 65 63 2e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  gRec.pgno==0 ){.
5430: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5440: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
5450: 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e 28 75 6e  ( pgRec.pgno>(un
5460: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
5470: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
5480: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5490: 20 7d 0a 20 20 69 66 28 20 66 6f 72 6d 61 74 3e   }.  if( format>
54a0: 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f  =JOURNAL_FORMAT_
54b0: 33 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  3 ){.    rc = re
54c0: 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61 74 2c  ad32bits(format,
54d0: 20 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20   jfd, &cksum);. 
54e0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
54f0: 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70  rn rc;.    if( p
5500: 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
5510: 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f 2c 20 70  r, pgRec.pgno, p
5520: 67 52 65 63 2e 61 44 61 74 61 29 21 3d 63 6b 73  gRec.aData)!=cks
5530: 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
5540: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
5550: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
5560: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 70 61 67  Playback the pag
5570: 65 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 69  e.  Update the i
5580: 6e 2d 6d 65 6d 6f 72 79 20 63 6f 70 79 20 6f 66  n-memory copy of
5590: 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 61   the page.  ** a
55a0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
55b0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
55c0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
55d0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
55e0: 65 72 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b  er, pgRec.pgno);
55f0: 0a 20 20 54 52 41 43 45 32 28 22 50 4c 41 59 42  .  TRACE2("PLAYB
5600: 41 43 4b 20 25 64 5c 6e 22 2c 20 70 67 52 65 63  ACK %d\n", pgRec
5610: 2e 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65  .pgno);.  sqlite
5620: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
5630: 3e 66 64 2c 20 28 70 67 52 65 63 2e 70 67 6e 6f  >fd, (pgRec.pgno
5640: 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54  -1)*(off_t)SQLIT
5650: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
5660: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
5670: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
5680: 20 70 67 52 65 63 2e 61 44 61 74 61 2c 20 53 51   pgRec.aData, SQ
5690: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
56a0: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
56b0: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
56c0: 75 6c 64 20 65 76 65 72 20 62 65 20 72 6f 6c 6c  uld ever be roll
56d0: 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
56e0: 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 20 66  in use, except f
56f0: 6f 72 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 31  or page.    ** 1
5700: 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
5710: 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
5720: 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
5730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
5740: 20 20 20 20 2a 2a 20 61 63 74 69 76 65 2e 0a 20      ** active.. 
5750: 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
5760: 70 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  pData;.    asser
5770: 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  t( pPg->nRef==0 
5780: 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20  || pPg->pgno==1 
5790: 29 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50  );.    pData = P
57a0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
57b0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  );.    memcpy(pD
57c0: 61 74 61 2c 20 70 67 52 65 63 2e 61 44 61 74 61  ata, pgRec.aData
57d0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
57e0: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
57f0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
5800: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
5810: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
5820: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
5830: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
5840: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
5850: 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  ;.    pPg->needS
5860: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 43 4f 44  ync = 0;.    COD
5870: 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
5880: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
5890: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
58a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
58b0: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
58c0: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
58d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
58e0: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
58f0: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
5900: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
5910: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
5920: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
5930: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
5940: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
5950: 2a 0a 2a 2a 20 20 20 20 2a 20 20 38 20 62 79 74  *.**    *  8 byt
5960: 65 20 70 72 65 66 69 78 2e 20 20 4f 6e 65 20 6f  e prefix.  One o
5970: 66 20 74 68 65 20 61 4a 6f 75 72 6e 61 6c 4d 61  f the aJournalMa
5980: 67 69 63 31 32 33 20 76 65 63 74 6f 72 73 20 64  gic123 vectors d
5990: 65 66 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20  efined.**       
59a0: 61 62 6f 76 65 2e 20 20 54 68 65 20 66 6f 72 6d  above.  The form
59b0: 61 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  at of the journa
59c0: 6c 20 66 69 6c 65 20 69 73 20 64 65 74 65 72 6d  l file is determ
59d0: 69 6e 65 64 20 62 79 20 77 68 69 63 68 0a 2a 2a  ined by which.**
59e0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 74 68         of the th
59f0: 72 65 65 20 70 72 65 66 69 78 20 76 65 63 74 6f  ree prefix vecto
5a00: 72 73 20 69 73 20 73 65 65 6e 2e 0a 2a 2a 20 20  rs is seen..**  
5a10: 20 20 2a 20 20 34 20 62 79 74 65 20 62 69 67 2d    *  4 byte big-
5a20: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
5a30: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
5a40: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
5a50: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
5a60: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
5a70: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
5a80: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
5a90: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
5aa0: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
5ab0: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
5ac0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
5ad0: 6c 20 73 69 7a 65 2e 20 20 54 68 69 73 20 66 69  l size.  This fi
5ae0: 65 6c 64 20 61 70 70 65 61 72 73 0a 2a 2a 20 20  eld appears.**  
5af0: 20 20 20 20 20 69 6e 20 66 6f 72 6d 61 74 20 33       in format 3
5b00: 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 2a 20 20   only..**    *  
5b10: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
5b20: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
5b30: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
5b40: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
5b50: 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
5b60: 65 63 6b 73 75 6d 2e 20 20 54 68 69 73 20 66 69  ecksum.  This fi
5b70: 65 6c 64 20 61 70 70 65 61 72 73 20 69 6e 20 66  eld appears in f
5b80: 6f 72 6d 61 74 20 33 20 6f 6e 6c 79 2e 0a 2a 2a  ormat 3 only..**
5b90: 20 20 20 20 2a 20 20 34 20 62 79 74 65 20 69 6e      *  4 byte in
5ba0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
5bb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
5bc0: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
5bd0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
5be0: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
5bf0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 20   rollback..**   
5c00: 20 2a 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65   *  Zero or more
5c10: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
5c20: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
5c30: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
5c40: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
5c50: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
5c60: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
5c70: 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  E bytes of data.
5c80: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
5c90: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 20 28 66  byte checksum (f
5ca0: 6f 72 6d 61 74 20 33 20 6f 6e 6c 79 29 0a 2a 2a  ormat 3 only).**
5cb0: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
5cc0: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
5cd0: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
5ce0: 20 74 68 65 20 66 69 72 73 74 20 34 20 62 75 6c   the first 4 bul
5cf0: 6c 65 74 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  lets above..** E
5d00: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
5d10: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
5d20: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 35  nstance of the 5
5d30: 74 68 20 62 75 6c 6c 65 74 2e 20 20 4e 6f 74 65  th bullet.  Note
5d40: 20 74 68 61 74 0a 2a 2a 20 62 75 6c 6c 65 74 73   that.** bullets
5d50: 20 32 20 61 6e 64 20 33 20 6f 6e 6c 79 20 61 70   2 and 3 only ap
5d60: 70 65 61 72 20 69 6e 20 66 6f 72 6d 61 74 2d 33  pear in format-3
5d70: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a   journals..**.**
5d80: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
5d90: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
5da0: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
5db0: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
5dc0: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
5dd0: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
5de0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
5df0: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
5e00: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
5e10: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
5e20: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
5e30: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
5e40: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
5e50: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
5e60: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
5e70: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
5e80: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
5e90: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
5ea0: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
5eb0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
5ec0: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
5ed0: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
5ee0: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
5ef0: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
5f00: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
5f10: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
5f20: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
5f30: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
5f40: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
5f50: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
5f60: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
5f70: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
5f80: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
5f90: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
5fa0: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
5fb0: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
5fc0: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
5fd0: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
5fe0: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
5ff0: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
6000: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
6010: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
6020: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
6030: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
6040: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
6050: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
6060: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
6070: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
6080: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
6090: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
60a0: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
60b0: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
60c0: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
60d0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
60e0: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
60f0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
6100: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
6110: 0a 2a 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  .**.** Journal f
6120: 6f 72 6d 61 74 73 20 31 20 61 6e 64 20 32 20 64  ormats 1 and 2 d
6130: 6f 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6e 52  o not have an nR
6140: 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
6150: 68 65 61 64 65 72 20 73 6f 20 77 65 0a 2a 2a 20  header so we.** 
6160: 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65 20  have to compute 
6170: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 66 69  nRec from the fi
6180: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 68  le size.  This h
6190: 61 73 20 72 69 73 6b 73 20 28 61 73 20 64 65 73  as risks (as des
61a0: 63 72 69 62 65 64 0a 2a 2a 20 61 62 6f 76 65 29  cribed.** above)
61b0: 20 77 68 69 63 68 20 69 73 20 77 68 79 20 61 6c   which is why al
61c0: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62  l persistent tab
61d0: 6c 65 73 20 68 61 76 65 20 62 65 65 6e 20 63 68  les have been ch
61e0: 61 6e 67 65 64 20 74 6f 20 75 73 65 0a 2a 2a 20  anged to use.** 
61f0: 66 6f 72 6d 61 74 20 33 2e 0a 2a 2a 0a 2a 2a 20  format 3..**.** 
6200: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
6210: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
6220: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
6230: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
6240: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
6250: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69   the database wi
6260: 6c 6c 20 6c 69 6b 65 6c 79 20 61 6c 72 65 61 64  ll likely alread
6270: 79 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  y be.** corrupte
6280: 64 2c 20 73 6f 20 74 68 65 20 50 41 47 45 52 5f  d, so the PAGER_
6290: 45 52 52 5f 43 4f 52 52 55 50 54 20 62 69 74 20  ERR_CORRUPT bit 
62a0: 69 73 20 73 65 74 20 69 6e 20 70 50 61 67 65 72  is set in pPager
62b0: 2d 3e 65 72 72 4d 61 73 6b 0a 2a 2a 20 61 6e 64  ->errMask.** and
62c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
62d0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
62e0: 20 69 74 20 61 6c 6c 20 77 6f 72 6b 73 2c 20 74   it all works, t
62f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6300: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 53 51 4c 49  .** returns SQLI
6310: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
6320: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
6330: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
6340: 72 2c 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  r, int useJourna
6350: 6c 53 69 7a 65 29 7b 0a 20 20 6f 66 66 5f 74 20  lSize){.  off_t 
6360: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
6370: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
6380: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
6390: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
63a0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
63b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
63c0: 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
63d0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  e journal */.  i
63e0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
63f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
6400: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
6410: 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
6420: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
6430: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
6440: 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
6450: 20 69 6e 74 20 66 6f 72 6d 61 74 3b 20 20 20 20   int format;    
6460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
6470: 6d 61 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  mat of the journ
6480: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 75 6e  al file. */.  un
6490: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
64a0: 69 63 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  ic[sizeof(aJourn
64b0: 61 6c 4d 61 67 69 63 31 29 5d 3b 0a 20 20 69 6e  alMagic1)];.  in
64c0: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  t rc;..  /* Figu
64d0: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
64e0: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
64f0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
6500: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
6510: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
6520: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
6530: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
6540: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
6550: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
6560: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
6570: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
6580: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
6590: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
65a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
65b0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
65c0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
65d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
65e0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
65f0: 73 6d 61 6c 6c 20 74 6f 20 63 6f 6e 74 61 69 6e  small to contain
6600: 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
6610: 65 72 2c 0a 20 20 2a 2a 20 69 74 20 6d 75 73 74  er,.  ** it must
6620: 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70   mean that the p
6630: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
6640: 74 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ted the journal 
6650: 77 61 73 20 6a 75 73 74 0a 20 20 2a 2a 20 62 65  was just.  ** be
6660: 67 69 6e 6e 69 6e 67 20 74 6f 20 77 72 69 74 65  ginning to write
6670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6680: 65 20 77 68 65 6e 20 69 74 20 64 69 65 64 2e 20  e when it died. 
6690: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 0a 20   In that case,. 
66a0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
66b0: 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 68 61 76   file should hav
66c0: 65 20 73 74 69 6c 6c 20 62 65 65 6e 20 63 6f 6d  e still been com
66d0: 70 6c 65 74 65 6c 79 20 75 6e 63 68 61 6e 67 65  pletely unchange
66e0: 64 2e 0a 20 20 2a 2a 20 4e 6f 74 68 69 6e 67 20  d..  ** Nothing 
66f0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
6700: 65 64 20 62 61 63 6b 2e 20 20 57 65 20 63 61 6e  ed back.  We can
6710: 20 73 61 66 65 6c 79 20 69 67 6e 6f 72 65 20 74   safely ignore t
6720: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  his journal..  *
6730: 2f 0a 20 20 69 66 28 20 73 7a 4a 20 3c 20 73 69  /.  if( szJ < si
6740: 7a 65 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a  zeof(aMagic)+siz
6750: 65 6f 66 28 50 67 6e 6f 29 20 29 7b 0a 20 20 20  eof(Pgno) ){.   
6760: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
6770: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
6780: 61 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ad the beginning
6790: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
67a0: 61 6e 64 20 74 72 75 6e 63 61 74 65 20 74 68 65  and truncate the
67b0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
67c0: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
67d0: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
67e0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
67f0: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
6800: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
6810: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a  izeof(aMagic));.
6820: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6830: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6840: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b  SQLITE_PROTOCOL;
6850: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
6860: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  ayback;.  }.  if
6870: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
6880: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 2c   aJournalMagic3,
6890: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
68a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 6d 61  ==0 ){.    forma
68b0: 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  t = JOURNAL_FORM
68c0: 41 54 5f 33 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AT_3;.  }else if
68d0: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
68e0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 32 2c   aJournalMagic2,
68f0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
6900: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 6d 61  ==0 ){.    forma
6910: 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  t = JOURNAL_FORM
6920: 41 54 5f 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AT_2;.  }else if
6930: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
6940: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 2c   aJournalMagic1,
6950: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
6960: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 6d 61  ==0 ){.    forma
6970: 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  t = JOURNAL_FORM
6980: 41 54 5f 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  AT_1;.  }else{. 
6990: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
69a0: 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74  ROTOCOL;.    got
69b0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
69c0: 20 20 7d 0a 20 20 69 66 28 20 66 6f 72 6d 61 74    }.  if( format
69d0: 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  >=JOURNAL_FORMAT
69e0: 5f 33 20 29 7b 0a 20 20 20 20 69 66 28 20 73 7a  _3 ){.    if( sz
69f0: 4a 20 3c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  J < sizeof(aMagi
6a00: 63 29 20 2b 20 33 2a 73 69 7a 65 6f 66 28 75 33  c) + 3*sizeof(u3
6a10: 32 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  2) ){.      /* I
6a20: 67 6e 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  gnore the journa
6a30: 6c 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 73  l if it is too s
6a40: 6d 61 6c 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20  mall to contain 
6a50: 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20  a complete.     
6a60: 20 2a 2a 20 68 65 61 64 65 72 2e 20 20 57 65 20   ** header.  We 
6a70: 61 6c 72 65 61 64 79 20 64 69 64 20 74 68 69 73  already did this
6a80: 20 74 65 73 74 20 6f 6e 63 65 20 61 62 6f 76 65   test once above
6a90: 2c 20 62 75 74 20 61 74 20 74 68 65 20 70 72 69  , but at the pri
6aa0: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 65 73 74  or.      ** test
6ab0: 2c 20 77 65 20 64 69 64 20 6e 6f 74 20 6b 6e 6f  , we did not kno
6ac0: 77 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  w the journal fo
6ad0: 72 6d 61 74 20 61 6e 64 20 73 6f 20 77 65 20 68  rmat and so we h
6ae0: 61 64 20 74 6f 20 61 73 73 75 6d 65 0a 20 20 20  ad to assume.   
6af0: 20 20 20 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65     ** the smalle
6b00: 73 74 20 70 6f 73 73 69 62 6c 65 20 68 65 61 64  st possible head
6b10: 65 72 2e 20 20 4e 6f 77 20 77 65 20 6b 6e 6f 77  er.  Now we know
6b20: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 62   the header is b
6b30: 69 67 67 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  igger.      ** t
6b40: 68 61 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  han the minimum 
6b50: 73 6f 20 77 65 20 74 65 73 74 20 61 67 61 69 6e  so we test again
6b60: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
6b70: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
6b80: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ck;.    }.    rc
6b90: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 6f   = read32bits(fo
6ba0: 72 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rmat, &pPager->j
6bb0: 66 64 2c 20 28 75 33 32 2a 29 26 6e 52 65 63 29  fd, (u32*)&nRec)
6bc0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
6bd0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
6be0: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  ;.    rc = read3
6bf0: 32 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 26 70  2bits(format, &p
6c00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
6c10: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
6c20: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
6c30: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
6c40: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
6c50: 78 66 66 66 66 66 66 66 66 20 7c 7c 20 75 73 65  xffffffff || use
6c60: 4a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  JournalSize ){. 
6c70: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
6c80: 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
6c90: 5a 28 33 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  Z(3))/JOURNAL_PG
6ca0: 5f 53 5a 28 33 29 3b 0a 20 20 20 20 7d 0a 20 20  _SZ(3);.    }.  
6cb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 63 20  }else{.    nRec 
6cc0: 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  = (szJ - JOURNAL
6cd0: 5f 48 44 52 5f 53 5a 28 32 29 29 2f 4a 4f 55 52  _HDR_SZ(2))/JOUR
6ce0: 4e 41 4c 5f 50 47 5f 53 5a 28 32 29 3b 0a 20 20  NAL_PG_SZ(2);.  
6cf0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 63 2a 4a    assert( nRec*J
6d00: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 32 29 2b  OURNAL_PG_SZ(2)+
6d10: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 32  JOURNAL_HDR_SZ(2
6d20: 29 3d 3d 73 7a 4a 20 29 3b 0a 20 20 7d 0a 20 20  )==szJ );.  }.  
6d30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6d40: 66 6f 72 6d 61 74 2c 20 26 70 50 61 67 65 72 2d  format, &pPager-
6d50: 3e 6a 66 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20  >jfd, &mxPg);.  
6d60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6d70: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
6d80: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
6d90: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
6da0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
6db0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  || pPager->origD
6dc0: 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20  bSize==mxPg );. 
6dd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
6de0: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
6df0: 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  >fd, SQLITE_PAGE
6e00: 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50  _SIZE*(off_t)mxP
6e10: 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
6e20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
6e30: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
6e40: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
6e50: 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
6e60: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
6e70: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
6e80: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
6e90: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
6ea0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
6eb0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
6ec0: 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
6ed0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
6ee0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
6ef0: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
6f00: 66 64 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 20  fd, format);.   
6f10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6f20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
6f30: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
6f40: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
6f50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
6f60: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6f70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6f80: 50 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20  Pages that have 
6f90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
6fa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  the journal but 
6fb0: 6e 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a  never synced.  *
6fc0: 2a 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74  * where not rest
6fd0: 6f 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70  ored by the loop
6fe0: 20 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65   above.  We have
6ff0: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73   to restore thos
7000: 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20  e.  ** pages by 
7010: 72 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63  reading them bac
7020: 6b 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69  k from the origi
7030: 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20  nal database..  
7040: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
7050: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
7060: 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 66 6f  Hdr *pPg;.    fo
7070: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7080: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
7090: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
70a0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 53 51 4c     char zBuf[SQL
70b0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a  ITE_PAGE_SIZE];.
70c0: 20 20 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e        if( !pPg->
70d0: 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65  dirty ) continue
70e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74  ;.      if( (int
70f0: 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
7100: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
7110: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7120: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
7130: 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41  r->fd, SQLITE_PA
7140: 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 28  GE_SIZE*(off_t)(
7150: 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20  pPg->pgno-1));. 
7160: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
7170: 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
7180: 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 53 51 4c  r->fd, zBuf, SQL
7190: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
71a0: 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22          TRACE2("
71b0: 52 45 46 45 54 43 48 20 25 64 5c 6e 22 2c 20 70  REFETCH %d\n", p
71c0: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
71d0: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
71e0: 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   zBuf, pPg->pgno
71f0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 2);.        if
7200: 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
7210: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7220: 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20     memset(zBuf, 
7230: 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  0, SQLITE_PAGE_S
7240: 49 5a 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IZE);.      }.  
7250: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
7260: 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a  f==0 || memcmp(z
7270: 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  Buf, PGHDR_TO_DA
7280: 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45 5f  TA(pPg), SQLITE_
7290: 50 41 47 45 5f 53 49 5a 45 29 20 29 7b 0a 20 20  PAGE_SIZE) ){.  
72a0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
72b0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
72c0: 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50 41   zBuf, SQLITE_PA
72d0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
72e0: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
72f0: 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c  O_EXTRA(pPg), 0,
7300: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
7310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7320: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
7330: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
7340: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rty = 0;.    }. 
7350: 20 7d 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b   }..end_playback
7360: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
7370: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67  TE_OK ){.    pag
7380: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
7390: 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
73a0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
73b0: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
73c0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
73d0: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c  E_CORRUPT;.  }el
73e0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
73f0: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
7400: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
7410: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7420: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
7430: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
7440: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
7450: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
7460: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
7470: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
7480: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
7490: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
74a0: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
74b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
74c0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
74d0: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
74e0: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
74f0: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
7500: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
7510: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
7520: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
7530: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
7540: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
7550: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
7560: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
7570: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
7580: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
7590: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
75a0: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
75b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
75c0: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
75d0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
75e0: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
75f0: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
7600: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
7610: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
7620: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f  er *pPager){.  o
7630: 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20 20  ff_t szJ;       
7640: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
7650: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
7660: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  nal */.  int nRe
7670: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7680: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
7690: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
76a0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
76b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
76c0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
76d0: 3b 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65  ;..  /* Truncate
76e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
76f0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
7700: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
7710: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
7720: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
7730: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
7740: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61 67  SIZE*(off_t)pPag
7750: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20  er->stmtSize);. 
7760: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
7770: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
7780: 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  ze;..  /* Figure
7790: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
77a0: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
77b0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
77c0: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
77d0: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  t( pPager->stmtI
77e0: 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e  nUse && pPager->
77f0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
7800: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
7810: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
7820: 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65  ;.  nRec = pPage
7830: 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a  r->stmtNRec;.  .
7840: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
7850: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
7860: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
7870: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
7880: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
7890: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
78a0: 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
78b0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c 77  ment journal alw
78c0: 61 79 73 20 75 73 65 73 20 66 6f 72 6d 61 74 0a  ays uses format.
78d0: 20 20 2a 2a 20 32 20 69 6e 73 74 65 61 64 20 6f    ** 2 instead o
78e0: 66 20 66 6f 72 6d 61 74 20 33 20 73 69 6e 63 65  f format 3 since
78f0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65   it does not nee
7900: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
7910: 64 20 77 69 74 68 0a 20 20 2a 2a 20 70 6f 77 65  d with.  ** powe
7920: 72 20 66 61 69 6c 75 72 65 73 20 63 6f 72 72 75  r failures corru
7930: 70 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  pting the journa
7940: 6c 20 61 6e 64 20 63 61 6e 20 74 68 75 73 20 6f  l and can thus o
7950: 6d 69 74 20 74 68 65 20 63 68 65 63 6b 73 75 6d  mit the checksum
7960: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
7970: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nRec-1; i>=0; i-
7980: 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  -){.    rc = pag
7990: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
79a0: 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
79b0: 61 67 65 72 2d 3e 73 74 66 64 2c 20 32 29 3b 0a  ager->stfd, 2);.
79c0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
79d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
79e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
79f0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
7a00: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
7a10: 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
7a20: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 70 61 67  out how many pag
7a30: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  es need to be co
7a40: 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
7a50: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
7a60: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
7a70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
7a80: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
7a90: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  , pPager->stmtJS
7aa0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
7ab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7ac0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
7ad0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72  layback;.  }.  r
7ae0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
7af0: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a  eSize(&pPager->j
7b00: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
7b10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7b20: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  {.    goto end_s
7b30: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
7b40: 7d 0a 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20  }.  nRec = (szJ 
7b50: 2d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  - pPager->stmtJS
7b60: 69 7a 65 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  ize)/JOURNAL_PG_
7b70: 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
7b80: 74 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63  t);.  for(i=nRec
7b90: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
7ba0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
7bb0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
7bc0: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
7bd0: 2d 3e 6a 66 64 2c 20 6a 6f 75 72 6e 61 6c 5f 66  ->jfd, journal_f
7be0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69 66 28 20  ormat);.    if( 
7bf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7c00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
7c10: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
7c20: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
7c30: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
7c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 65 6e 64      }.  }.  .end
7c50: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a  _stmt_playback:.
7c60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7c70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
7c80: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
7c90: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b  GER_ERR_CORRUPT;
7ca0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
7cb0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20  _CORRUPT;.  }.  
7cc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7cd0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
7ce0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
7cf0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
7d00: 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
7d10: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  d..**.** The max
7d20: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74  imum number is t
7d30: 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75  he absolute valu
7d40: 65 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20  e of the mxPage 
7d50: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66  parameter..** If
7d60: 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
7d70: 69 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20  ive, the noSync 
7d80: 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74  flag is also set
7d90: 2e 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73  .  noSync bypass
7da0: 65 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  es.** calls to s
7db0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 2e 20  qlite3OsSync(). 
7dc0: 20 54 68 65 20 70 61 67 65 72 20 72 75 6e 73 20   The pager runs 
7dd0: 6d 75 63 68 20 66 61 73 74 65 72 20 77 69 74 68  much faster with
7de0: 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62   noSync on,.** b
7df0: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
7e00: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
7e10: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 20 61  es or there is a
7e20: 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a  n abrupt power .
7e30: 2a 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  ** failure, the 
7e40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69  database file mi
7e50: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61  ght be left in a
7e60: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
7e70: 6e 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62  nd.** unrepairab
7e80: 6c 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76  le state.  .*/.v
7e90: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
7ea0: 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50  _set_cachesize(P
7eb0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
7ec0: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
7ed0: 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20   mxPage>=0 ){.  
7ee0: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
7ef0: 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
7f00: 69 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ile;.    if( pPa
7f10: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29  ger->noSync==0 )
7f20: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
7f30: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
7f40: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
7f50: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78 50 61  nc = 1;.    mxPa
7f60: 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a 20 20  ge = -mxPage;.  
7f70: 7d 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  }.  if( mxPage>1
7f80: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
7f90: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
7fa0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
7fb0: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
7fc0: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
7fd0: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
7fe0: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
7ff0: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
8000: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
8010: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
8020: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
8030: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
8040: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
8050: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
8060: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
8070: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
8080: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
8090: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
80a0: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
80b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
80c0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
80d0: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
80e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
80f0: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
8100: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
8110: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
8120: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
8140: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
8150: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
8160: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
8170: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
8180: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
8190: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
81a0: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
81b0: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
81c0: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
81d0: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
81e0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
81f0: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
8200: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
8210: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
8220: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
8230: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
8240: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
8250: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
8260: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
8270: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
8280: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
8290: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
82a0: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
82b0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
82c0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
82d0: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
82e0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
82f0: 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
8300: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
8310: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8320: 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
8330: 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
8340: 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
8350: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
8360: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
8370: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
8380: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
8390: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
83a0: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
83b0: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
83c0: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
83d0: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
83e0: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
83f0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
8400: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
8420: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
8430: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
8440: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
8450: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
8460: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
8470: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
8480: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
8490: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
84a0: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
84b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
84c0: 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76  r_set_safety_lev
84d0: 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
84e0: 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20  , int level){.  
84f0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
8500: 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50    level==1 || pP
8510: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
8520: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
8530: 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26  nc = level==3 &&
8540: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
8550: 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  le;.  if( pPager
8560: 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 20 70 50  ->noSync==0 ) pP
8570: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
8580: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65   0;.}../*.** Ope
8590: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
85a0: 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  le.  Write the n
85b0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
85c0: 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a  into zName.** (z
85d0: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20  Name must be at 
85e0: 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d  least SQLITE_TEM
85f0: 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73  PNAME_SIZE bytes
8600: 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a   long.)  Write.*
8610: 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
8620: 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
8630: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
8640: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
8650: 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
8660: 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
8670: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ail..**.** The O
8680: 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
8690: 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
86a0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
86b0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f  hen it is.** clo
86c0: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
86d0: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
86e0: 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a  opentemp(char *z
86f0: 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64  File, OsFile *fd
8700: 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38  ){.  int cnt = 8
8710: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  ;.  int rc;.  do
8720: 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20  {.    cnt--;.   
8730: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
8740: 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20  leName(zFile);. 
8750: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8760: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
8770: 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20  File, fd, 1);.  
8780: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
8790: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
87a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
87b0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
87c0: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
87d0: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
87e0: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
87f0: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
8800: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
8810: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
8820: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
8830: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
8840: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
8850: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
8860: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
8870: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
8880: 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
8890: 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
88a0: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
88b0: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
88c0: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
88d0: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
88e0: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
88f0: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
8900: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
8910: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
8920: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
8930: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
8940: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
8950: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
8960: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
8970: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8980: 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20  e3pager_open(.  
8990: 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
89a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
89b0: 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
89c0: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
89d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
89e0: 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
89f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
8a00: 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
8a10: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20  /.  int mxPage, 
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a30: 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  Max number of in
8a40: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
8a50: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ges */.  int nEx
8a60: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
8a70: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
8a80: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
8a90: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
8aa0: 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  /.  int useJourn
8ab0: 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
8ac0: 54 52 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f  TRUE to use a ro
8ad0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
8ae0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  n this file */.)
8af0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
8b00: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  r;.  char *zFull
8b10: 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Pathname;.  int 
8b20: 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c  nameLen;.  OsFil
8b30: 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 2c 20  e fd;.  int rc, 
8b40: 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  i;.  int tempFil
8b50: 65 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  e;.  int memDb =
8b60: 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   0;.  int readOn
8b70: 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ly = 0;.  char z
8b80: 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
8b90: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a  NAME_SIZE];..  *
8ba0: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  ppPager = 0;.  i
8bb0: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
8bc0: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
8bd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
8be0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  MEM;.  }.  if( z
8bf0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
8c00: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
8c10: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
8c20: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
8c30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
8c40: 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46  Db = 1;.      zF
8c50: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
8c60: 6c 69 74 65 4d 61 6c 6c 6f 63 28 34 29 3b 0a 20  liteMalloc(4);. 
8c70: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
8c80: 74 68 6e 61 6d 65 20 29 20 73 74 72 63 70 79 28  thname ) strcpy(
8c90: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 22  zFullPathname, "
8ca0: 6e 69 6c 22 29 3b 0a 20 20 20 20 20 20 72 63 20  nil");.      rc 
8cb0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
8cc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 46   }else{.      zF
8cd0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
8ce0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
8cf0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
8d00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8d10: 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
8d20: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  e(zFullPathname,
8d30: 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29   &fd, &readOnly)
8d40: 3b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65  ;.      tempFile
8d50: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
8d60: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
8d70: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
8d80: 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b  emp(zTemp, &fd);
8d90: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
8da0: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
8db0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
8dc0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
8dd0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
8de0: 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
8df0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
8e00: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
8e10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8e20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
8e30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8e40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
8e50: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
8e60: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
8e70: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
8e80: 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20  ;.  }.  nameLen 
8e90: 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61  = strlen(zFullPa
8ea0: 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65  thname);.  pPage
8eb0: 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r = sqliteMalloc
8ec0: 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  ( sizeof(*pPager
8ed0: 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20  ) + nameLen*3 + 
8ee0: 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  30 );.  if( pPag
8ef0: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  er==0 ){.    sql
8f00: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
8f10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
8f20: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
8f30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8f40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
8f50: 53 45 54 5f 50 41 47 45 52 28 70 50 61 67 65 72  SET_PAGER(pPager
8f60: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
8f70: 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
8f80: 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50  &pPager[1];.  pP
8f90: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
8fa0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
8fb0: 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ename[nameLen+1]
8fc0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
8fd0: 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
8fe0: 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c  zDirectory[nameL
8ff0: 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28  en+1];.  strcpy(
9000: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
9010: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
9020: 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  );.  strcpy(pPag
9030: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
9040: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
9050: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
9060: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
9070: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
9080: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
9090: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
90a0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
90b0: 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70   = 0;.  strcpy(p
90c0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
90d0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
90e0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
90f0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
9100: 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e  strcpy(&pPager->
9110: 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e  zJournal[nameLen
9120: 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a  ], "-journal");.
9130: 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66    pPager->fd = f
9140: 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  d;.  pPager->jou
9150: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
9160: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
9170: 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20  al = useJournal 
9180: 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61  && !memDb;.  pPa
9190: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
91a0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
91b0: 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50  tInUse = 0;.  pP
91c0: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
91d0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
91e0: 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
91f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
9200: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
9210: 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  E;.  pPager->stm
9220: 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  tSize = 0;.  pPa
9230: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
9240: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50   0;.  pPager->nP
9250: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
9260: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
9270: 67 65 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a 20  ge>5 ? mxPage : 
9280: 31 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  10;.  pPager->st
9290: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55 4e 4c  ate = SQLITE_UNL
92a0: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  OCK;.  pPager->e
92b0: 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50  rrMask = 0;.  pP
92c0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
92d0: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61   tempFile;.  pPa
92e0: 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d  ger->memDb = mem
92f0: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
9300: 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
9310: 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  y;.  pPager->nee
9320: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
9330: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
9340: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
9350: 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
9360: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
9370: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
9380: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
9390: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
93a0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
93b0: 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b  nExtra = nExtra;
93c0: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
93d0: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
93e0: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
93f0: 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ));.  *ppPager =
9400: 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
9410: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9420: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
9430: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
9440: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
9450: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
9460: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
9470: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
9480: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
9490: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
94a0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
94b0: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
94c0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
94d0: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
94e0: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
94f0: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
9500: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
9510: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
9520: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
9530: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
9540: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
9550: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
9560: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
9570: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
9580: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
9590: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
95a0: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
95b0: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
95c0: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
95d0: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
95e0: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
95f0: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Desc;.}../*.** R
9600: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
9610: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
9620: 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
9630: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9640: 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69  .** pPager..*/.i
9650: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
9660: 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  pagecount(Pager 
9670: 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f  *pPager){.  off_
9680: 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t n;.  assert( p
9690: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
96a0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
96b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >=0 ){.    retur
96c0: 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
96d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
96e0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
96f0: 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d  Pager->fd, &n)!=
9700: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9710: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
9720: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49   |= PAGER_ERR_DI
9730: 53 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  SK;.    return 0
9740: 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c  ;.  }.  n /= SQL
9750: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ITE_PAGE_SIZE;. 
9760: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
9770: 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43  te!=SQLITE_UNLOC
9780: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
9790: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d  >dbSize = n;.  }
97a0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
97b0: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
97c0: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
97d0: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
97e0: 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f  nal(Pager*);.../
97f0: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61  *.** Unlink a pa
9800: 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
9810: 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
9820: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65  of all pages whe
9830: 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61  re nRef==0).** a
9840: 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  nd from its hash
9850: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
9860: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9870: 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64   unlinkPage(PgHd
9880: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
9890: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
98a0: 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65  pPager;..  /* Ke
98b0: 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e  ep the pFirstSyn
98c0: 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ced pointer poin
98d0: 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73  ting at the firs
98e0: 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70  t synchronized p
98f0: 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  age */.  if( pPg
9900: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
9910: 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67  Synced ){.    Pg
9920: 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
9930: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69  extFree;.    whi
9940: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
9950: 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
9960: 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
9970: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
9980: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
9990: 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
99a0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
99b0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
99c0: 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
99d0: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
99e0: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
99f0: 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  xtFree;.  }else{
9a00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
9a10: 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67  ger->pFirst==pPg
9a20: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
9a30: 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
9a40: 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69  extFree;.  }.  i
9a50: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
9a60: 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  e ){.    pPg->pN
9a70: 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
9a80: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
9a90: 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
9aa0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9ab0: 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
9ac0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
9ad0: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
9ae0: 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ee;.  }.  pPg->p
9af0: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
9b00: 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a  pPrevFree = 0;..
9b10: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
9b20: 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
9b30: 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  able */.  if( pP
9b40: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
9b50: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
9b60: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
9b70: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
9b80: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
9b90: 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20  PrevHash ){.    
9ba0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e  pPg->pPrevHash->
9bb0: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
9bc0: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65  >pNextHash;.  }e
9bd0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d  lse{.    int h =
9be0: 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d   pager_hash(pPg-
9bf0: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
9c00: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
9c10: 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20  h[h]==pPg );.   
9c20: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
9c30: 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
9c40: 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  sh;.  }.  pPg->p
9c50: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
9c60: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
9c70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9c80: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
9c90: 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d  truncate an in-m
9ca0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
9cb0: 20 44 65 6c 65 74 65 0a 2a 2a 20 65 76 65 72 79   Delete.** every
9cc0: 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e   pages whose pgn
9cd0: 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  o is larger than
9ce0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
9cf0: 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
9d00: 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ced..** Referenc
9d10: 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
9d20: 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
9d30: 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
9d40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
9d50: 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61  emoryTruncate(Pa
9d60: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
9d70: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
9d80: 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
9d90: 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
9da0: 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
9db0: 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
9dc0: 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
9dd0: 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
9de0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
9df0: 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
9e00: 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
9e10: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
9e20: 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
9e30: 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
9e40: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
9e50: 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
9e60: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9e70: 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
9e80: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
9e90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
9ea0: 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
9eb0: 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  ll;.      unlink
9ec0: 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
9ed0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
9ee0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
9ef0: 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
9f00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e   }.}../*.** Trun
9f10: 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
9f20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
9f30: 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
9f40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
9f50: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
9f60: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
9f70: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
9f80: 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
9f90: 3e 64 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20  >dbSize<0 ){.   
9fa0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
9fb0: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
9fc0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
9fd0: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
9fe0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
9ff0: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
a000: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
a010: 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
a020: 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  =(unsigned)pPage
a030: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
a040: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a050: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  K;.  }.  if( pPa
a060: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
a070: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
a080: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
a090: 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
a0a0: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
a0b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
a0c0: 20 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50    syncJournal(pP
a0d0: 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ager);.  rc = sq
a0e0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
a0f0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  &pPager->fd, SQL
a100: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f  ITE_PAGE_SIZE*(o
a110: 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a 20 20 69  ff_t)nPage);.  i
a120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a130: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
a140: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
a150: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
a170: 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
a180: 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
a190: 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
a1a0: 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
a1b0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
a1c0: 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
a1d0: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
a1e0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
a1f0: 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
a200: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
a210: 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
a220: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
a230: 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
a240: 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
a250: 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
a260: 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
a270: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
a280: 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
a290: 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
a2a0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
a2b0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
a2c0: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
a2d0: 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ump..*/.int sqli
a2e0: 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50  te3pager_close(P
a2f0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
a300: 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
a310: 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  ext;.  switch( p
a320: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a  Pager->state ){.
a330: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a340: 57 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a 20 20 20  WRITELOCK: {.   
a350: 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
a360: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
a370: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
a380: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
a390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
a3a0: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
a3b0: 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
a3c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a3d0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
a3e0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a3f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a400: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a  SQLITE_READLOCK:
a410: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
a420: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
a430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
a440: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
a450: 66 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fd);.      }.   
a460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a470: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
a480: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
a490: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ng */.      brea
a4a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
a4b0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
a4c0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
a4d0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
a4e0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
a4f0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
a500: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
a510: 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
a520: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
a530: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64  lose(&pPager->fd
a540: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a550: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a560: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20  Open==0 );.  /* 
a570: 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61  Temp files are a
a580: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
a590: 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20  eted by the OS. 
a5a0: 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   ** if( pPager->
a5b0: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a  tempFile ){.  **
a5c0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
a5d0: 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
a5e0: 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20  name);.  ** }.  
a5f0: 2a 2f 0a 20 20 43 4c 52 5f 50 41 47 45 52 28 70  */.  CLR_PAGER(p
a600: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
a610: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21  ager->zFilename!
a620: 3d 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b  =(char*)&pPager[
a630: 31 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  1] ){.    assert
a640: 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  ( 0 );  /* Canno
a650: 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  t happen */.    
a660: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
a670: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
a680: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
a690: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
a6a0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
a6b0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
a6c0: 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ry);.  }.  sqlit
a6d0: 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
a6e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a6f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
a700: 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
a710: 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
a720: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
a730: 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  gno sqlite3pager
a740: 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64  _pagenumber(void
a750: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
a760: 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50  r *p = DATA_TO_P
a770: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72  GHDR(pData);.  r
a780: 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d  eturn p->pgno;.}
a790: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
a7a0: 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  _ref() function 
a7b0: 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72  increments the r
a7c0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
a7d0: 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66  or a page..** If
a7e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72   the page is cur
a7f0: 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
a800: 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65  eelist (the refe
a810: 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
a820: 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d  ero) then.** rem
a830: 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ove it from the 
a840: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
a850: 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73  For non-test sys
a860: 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
a870: 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74   is a macro that
a880: 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66   calls _page_ref
a890: 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20  ().** online of 
a8a0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
a8b0: 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f  unt is zero.  Fo
a8c0: 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  r test systems, 
a8d0: 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73  page_ref().** is
a8e0: 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
a8f0: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
a900: 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20  set breakpoints 
a910: 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f  and trace it..*/
a920: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61  .static void _pa
a930: 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
a940: 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
a950: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
a960: 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
a970: 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
a980: 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
a990: 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
a9a0: 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  Pg==pPg->pPager-
a9b0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
a9c0: 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20  .      PgHdr *p 
a9d0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
a9e0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
a9f0: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
aa00: 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
aa10: 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67  ree; }.      pPg
aa20: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
aa30: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
aa40: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
aa50: 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
aa60: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
aa70: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
aa80: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
aa90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
aaa0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
aab0: 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
aac0: 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ree;.    }.    i
aad0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
aae0: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
aaf0: 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
ab00: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
ab10: 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  vFree;.    }else
ab20: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
ab30: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
ab40: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
ab50: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67   }.    pPg->pPag
ab60: 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
ab70: 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
ab80: 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d   REFINFO(pPg);.}
ab90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
aba0: 45 53 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69  EST.  static voi
abb0: 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72  d page_ref(PgHdr
abc0: 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20   *pPg){.    if( 
abd0: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
abe0: 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28        _page_ref(
abf0: 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
ac00: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  .      pPg->nRef
ac10: 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46  ++;.      REFINF
ac20: 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  O(pPg);.    }.  
ac30: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
ac40: 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28   page_ref(P)   (
ac50: 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61  (P)->nRef==0?_pa
ac60: 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29  ge_ref(P):(void)
ac70: 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e  (P)->nRef++).#en
ac80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
ac90: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
aca0: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
acb0: 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
acc0: 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
acd0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
ace0: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
acf0: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
ad00: 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
ad10: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
ad20: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
ad30: 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65  Data);.  page_re
ad40: 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
ad50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ad60: 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
ad70: 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72  urnal.  In other
ad80: 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
ad90: 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
ada0: 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
adb0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
adc0: 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
add0: 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
ade0: 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
adf0: 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69  e.** disk.  It i
ae00: 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f  s not safe to mo
ae10: 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61  dify the origina
ae20: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
ae30: 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74  until after.** t
ae40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
ae50: 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20  een synced.  If 
ae60: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
ae70: 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65  abase is modifie
ae80: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
ae90: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
aea0: 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61  d and a power fa
aeb0: 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68  ilure occurs, th
aec0: 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e  e unsynced journ
aed0: 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64  al.** data would
aee0: 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20   be lost and we 
aef0: 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20  would be unable 
af00: 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f  to completely ro
af10: 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61  llback the.** da
af20: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
af30: 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
af40: 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72  tion would occur
af50: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
af60: 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74  utine also updat
af70: 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  es the nRec fiel
af80: 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  d in the header 
af90: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
afa0: 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ** (See comments
afb0: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c   on the pager_pl
afc0: 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
afd0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
afe0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a  information.).**
aff0: 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64   If the sync mod
b000: 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73  e is FULL, two s
b010: 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e  yncs will occur.
b020: 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c    First the whol
b030: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20  e journal.** is 
b040: 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65  synced, then the
b050: 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
b060: 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73  pdated, then a s
b070: 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72  econd sync occur
b080: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
b090: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
b0a0: 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  , we do not care
b0b0: 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
b0c0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61  to rollback.** a
b0d0: 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  fter a power fai
b0e0: 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63  lure, so sync oc
b0f0: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  curs..**.** This
b100: 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
b110: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
b120: 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
b130: 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
b140: 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
b150: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
b160: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
b170: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
b180: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
b190: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
b1a0: 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
b1b0: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
b1c0: 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
b1d0: 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69  ase.  ** (assumi
b1e0: 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f  ng there is a jo
b1f0: 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65  urnal and it nee
b200: 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e  ds to be synced.
b210: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
b220: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
b230: 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
b240: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
b250: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
b260: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
b270: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  );.      /* asse
b280: 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  rt( !pPager->noS
b290: 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63  ync ); // noSync
b2a0: 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66   might be set if
b2b0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20   synchronous.   
b2c0: 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64     ** was turned
b2d0: 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74   off after the t
b2e0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
b2f0: 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20  tarted.  Ticket 
b300: 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20  #615 */.#ifndef 
b310: 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20  NDEBUG.      {. 
b320: 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
b330: 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e  ure the pPager->
b340: 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20  nRec counter we 
b350: 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65  are keeping agre
b360: 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  es.        ** wi
b370: 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70  th the nRec comp
b380: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69  uted from the si
b390: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
b3a0: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
b3b0: 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  */.        off_t
b3c0: 20 68 64 72 53 7a 2c 20 70 67 53 7a 2c 20 6a 53   hdrSz, pgSz, jS
b3d0: 7a 3b 0a 20 20 20 20 20 20 20 20 68 64 72 53 7a  z;.        hdrSz
b3e0: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
b3f0: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
b400: 29 3b 0a 20 20 20 20 20 20 20 20 70 67 53 7a 20  );.        pgSz 
b410: 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  = JOURNAL_PG_SZ(
b420: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b  journal_format);
b430: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
b440: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
b450: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  &pPager->jfd, &j
b460: 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Sz);.        if(
b470: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
b480: 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rc;.        asse
b490: 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  rt( pPager->nRec
b4a0: 2a 70 67 53 7a 2b 68 64 72 53 7a 3d 3d 6a 53 7a  *pgSz+hdrSz==jSz
b4b0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
b4c0: 69 66 0a 20 20 20 20 20 20 69 66 28 20 6a 6f 75  if.      if( jou
b4d0: 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 33 20 29  rnal_format>=3 )
b4e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
b4f0: 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
b500: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
b510: 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 20 2a  al file header *
b520: 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  /.        off_t 
b530: 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 69 66 28  szJ;.        if(
b540: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
b550: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  c ){.          T
b560: 52 41 43 45 31 28 22 53 59 4e 43 5c 6e 22 29 3b  RACE1("SYNC\n");
b570: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
b580: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
b590: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
b5a0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
b5b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b5d0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
b5e0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69 7a 65  Pager->jfd, size
b5f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
b600: 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  1));.        rc 
b610: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
b620: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
b630: 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
b640: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
b650: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 73  rn rc;.        s
b660: 7a 4a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ = JOURNAL_HDR
b670: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
b680: 61 74 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20  at) +.          
b690: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
b6a0: 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  Rec*JOURNAL_PG_S
b6b0: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
b6c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b6d0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
b6e0: 2d 3e 6a 66 64 2c 20 73 7a 4a 29 3b 0a 20 20 20  ->jfd, szJ);.   
b6f0: 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
b700: 31 28 22 53 59 4e 43 5c 6e 22 29 3b 0a 20 20 20  1("SYNC\n");.   
b710: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b720: 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a  sSync(&pPager->j
b730: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
b740: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
b750: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
b760: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
b770: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
b780: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
b790: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
b7a0: 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
b7b0: 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
b7c0: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
b7d0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
b7e0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
b7f0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
b800: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
b810: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
b820: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
b830: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
b840: 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69  >pFirst;.  }..#i
b850: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
b860: 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
b870: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
b880: 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50  clear then the P
b890: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20  gHdr.needSync.  
b8a0: 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73  ** flag must als
b8b0: 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61  o be clear for a
b8c0: 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66  ll pages.  Verif
b8d0: 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
b8e0: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72   invariant is tr
b8f0: 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ue..  */.  else{
b900: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
b910: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
b920: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
b930: 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l){.      assert
b940: 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
b950: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
b960: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b970: 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
b980: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a  ager->pFirst );.
b990: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
b9a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b9b0: 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
b9c0: 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
b9d0: 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
b9e0: 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
b9f0: 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
ba00: 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
ba10: 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
ba20: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
ba30: 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
ba40: 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
ba50: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
ba60: 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
ba70: 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
ba80: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
ba90: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
baa0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
bab0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
bac0: 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
bad0: 67 65 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  ger;.  while( pL
bae0: 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
baf0: 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
bb00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
bb10: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
bb20: 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
bb30: 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f  )*(off_t)SQLITE_
bb40: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
bb50: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
bb60: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
bb70: 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
bb80: 20 36 29 3b 0a 20 20 20 20 54 52 41 43 45 32 28   6);.    TRACE2(
bb90: 22 53 54 4f 52 45 20 25 64 5c 6e 22 2c 20 70 4c  "STORE %d\n", pL
bba0: 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
bbb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
bbc0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
bbd0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
bbe0: 4c 69 73 74 29 2c 20 53 51 4c 49 54 45 5f 50 41  List), SQLITE_PA
bbf0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f  GE_SIZE);.    CO
bc00: 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
bc10: 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
bc20: 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 30  , pList->pgno, 0
bc30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
bc40: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
bc50: 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b  List->dirty = 0;
bc60: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
bc70: 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
bc80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bc90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c  OK;.}../*.** Col
bca0: 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79  lect every dirty
bcb0: 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72   page into a dir
bcc0: 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72  ty list and.** r
bcd0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
bce0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
bcf0: 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70  hat list.  All p
bd00: 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c  ages are.** coll
bd10: 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68  ected even if th
bd20: 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  ey are still in 
bd30: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  use..*/.static P
bd40: 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f  gHdr *pager_get_
bd50: 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
bd60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bd70: 20 20 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69    PgHdr *p, *pLi
bd80: 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b  st;.  pList = 0;
bd90: 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
bda0: 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
bdb0: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
bdc0: 28 20 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  ( p->dirty ){.  
bdd0: 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
bde0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c 69  pList;.      pLi
bdf0: 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  st = p;.    }.  
be00: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
be10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
be20: 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  re a page..**.**
be30: 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   A read lock on 
be40: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73  the disk file is
be50: 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74   obtained when t
be60: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73  he first page is
be70: 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54   acquired. .** T
be80: 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  his read lock is
be90: 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68   dropped when th
bea0: 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  e last page is r
beb0: 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eleased..**.** A
bec0: 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20   _get works for 
bed0: 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20  any page number 
bee0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20  greater than 0. 
bef0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
bf00: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c  .** file is smal
bf10: 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
bf20: 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65  uested page, the
bf30: 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b  n no actual disk
bf40: 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20  .** read occurs 
bf50: 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  and the memory i
bf60: 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  mage of the page
bf70: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
bf80: 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e  to.** all zeros.
bf90: 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61    The extra data
bfa0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
bfb0: 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
bfc0: 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20  itialized.** to 
bfd0: 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20  zeros the first 
bfe0: 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
bff0: 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
c000: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  y..**.** The acq
c010: 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
c020: 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
c030: 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
c040: 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
c050: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
c060: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
c070: 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
c080: 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
c090: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
c0a0: 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
c0b0: 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
c0c0: 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75  utine and _looku
c0d0: 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
c0e0: 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
c0f0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
c100: 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
c110: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
c120: 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
c130: 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
c140: 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
c150: 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
c160: 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a  ereas _lookup().
c170: 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
c180: 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
c190: 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
c1a0: 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
c1b0: 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
c1c0: 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
c1d0: 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
c1e0: 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
c1f0: 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
c200: 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f  y..** Since _loo
c210: 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
c220: 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
c230: 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
c240: 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
c250: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
c260: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
c270: 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50  er_get(Pager *pP
c280: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
c290: 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b   void **ppPage){
c2a0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
c2b0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4d   int rc;..  /* M
c2c0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
c2d0: 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
c2e0: 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
c2f0: 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
c300: 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
c310: 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
c320: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
c330: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
c340: 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45  Mask & ~(PAGER_E
c350: 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20  RR_FULL) ){.    
c360: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
c370: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
c380: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
c390: 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
c3a0: 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
c3b0: 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b   get a read lock
c3c0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
c3d0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
c3e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
c3f0: 52 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65  Ref==0 && !pPage
c400: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
c410: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
c420: 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  adLock(&pPager->
c430: 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fd);.    if( rc!
c440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c450: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
c460: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
c470: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
c480: 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20 20 2f  READLOCK;..    /
c490: 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
c4a0: 69 6c 65 20 65 78 69 73 74 73 2c 20 74 72 79 20  ile exists, try 
c4b0: 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 2e  to play it back.
c4c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c4d0: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
c4e0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 4f 73 46  al && sqlite3OsF
c4f0: 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72  ileExists(pPager
c500: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  ->zJournal) ){. 
c510: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20        int rc;.. 
c520: 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 20 77        /* Get a w
c530: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
c540: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
c550: 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
c560: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 4c 6f  sqlite3OsWriteLo
c570: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
c580: 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
c590: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c5a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
c5b0: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
c5c0: 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f  r->fd)!=SQLITE_O
c5d0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
c5e0: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
c5f0: 65 76 65 72 20 68 61 70 70 65 6e 21 20 2a 2f 0a  ever happen! */.
c600: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
c610: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b  SQLITE_INTERNAL;
c620: 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  .         }.    
c630: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
c640: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c650: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
c660: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
c670: 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;..       /* Ope
c680: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
c690: 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20  r reading only. 
c6a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   Return SQLITE_B
c6b0: 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a  USY if.       **
c6c0: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
c6d0: 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
c6e0: 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  al file. .      
c6f0: 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68   **.       ** Th
c700: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
c710: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
c720: 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66  be locked itself
c730: 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a  .  The.       **
c740: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
c750: 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65   never open unle
c760: 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ss the main data
c770: 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a  base file holds.
c780: 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74         ** a writ
c790: 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65  e lock, so there
c7a0: 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68   is never any ch
c7b0: 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ance of two or m
c7c0: 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72  ore.       ** pr
c7d0: 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20  ocesses opening 
c7e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74  the journal at t
c7f0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
c800: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
c810: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
c820: 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65 72  nReadOnly(pPager
c830: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
c840: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
c850: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c860: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
c870: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  rc = sqlite3OsUn
c880: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
c890: 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65  );.         asse
c8a0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
c8b0: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 72 65  K );.         re
c8c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
c8d0: 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
c8e0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c8f0: 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
c900: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c910: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 0a 20  lStarted = 0;.. 
c920: 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
c930: 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
c940: 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
c950: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
c960: 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  te.       ** loc
c970: 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
c980: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
c990: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c9a0: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
c9b0: 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
c9c0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
c9d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c9e0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
c9f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
ca00: 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
ca10: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  lse{.    /* Sear
ca20: 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63  ch for page in c
ca30: 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  ache */.    pPg 
ca40: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
ca50: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
ca60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
ca70: 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 73  mDb && pPager->s
ca80: 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 55 4e 4c  tate==SQLITE_UNL
ca90: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
caa0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
cab0: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20  ITE_READLOCK;.  
cac0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
cad0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
cae0: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
caf0: 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
cb00: 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
cb10: 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50     int h;.    pP
cb20: 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20  ager->nMiss++;. 
cb30: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
cb40: 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
cb50: 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  age || pPager->p
cb60: 46 69 72 73 74 3d 3d 30 20 7c 7c 20 70 50 61 67  First==0 || pPag
cb70: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
cb80: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
cb90: 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ew page */.     
cba0: 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
cbb0: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
cbc0: 70 50 67 29 20 2b 20 53 51 4c 49 54 45 5f 50 41  pPg) + SQLITE_PA
cbd0: 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 20 20  GE_SIZE .       
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbf0: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
cc00: 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
cc10: 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 20 20 2b 20 70 50 61 67 65 72 2d 3e 6d 65      + pPager->me
cc40: 6d 44 62 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  mDb*sizeof(PgHis
cc50: 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69  tory) );.      i
cc60: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
cc70: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69       pager_unwri
cc80: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
cc90: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
cca0: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
ccb0: 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20  _ERR_MEM;.      
ccc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ccd0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
cce0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
ccf0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
cd00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
cd10: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
cd20: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
cd30: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
cd40: 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65  pPager), 0, size
cd50: 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a  of(PgHistory));.
cd60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
cd70: 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
cd80: 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  er;.      pPg->p
cd90: 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
cda0: 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50  ->pAll;.      pP
cdb0: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
cdc0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
cdd0: 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nPage++;.    }el
cde0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  se{.      /* Fin
cdf0: 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
ce00: 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
ce10: 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
ce20: 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  does not.      *
ce30: 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
ce40: 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
ce50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
ce60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67      */.      pPg
ce70: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
ce80: 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20  tSynced;..      
ce90: 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
cea0: 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
ceb0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
cec0: 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
ced0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
cee0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
cef0: 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
cf00: 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
cf10: 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65  is a.      ** ve
cf20: 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
cf30: 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
cf40: 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
cf50: 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
cf60: 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74       ** it can't
cf70: 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20   be helped..    
cf80: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
cf90: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
cfa0: 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f   int rc = syncJo
cfb0: 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
cfc0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
cfd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
cfe0: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
cff0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
d000: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d010: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
d020: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
d030: 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
d040: 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
d050: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
d060: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  Ref==0 );..     
d070: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
d080: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
d090: 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
d0a0: 20 64 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f   dirty..      */
d0b0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
d0c0: 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
d0d0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
d0e0: 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
d0f0: 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
d100: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
d110: 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
d120: 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
d130: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
d140: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
d160: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
d170: 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
d180: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
d190: 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ERR;.        }. 
d1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
d1b0: 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d  ert( pPg->dirty=
d1c0: 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
d1d0: 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
d1e0: 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
d1f0: 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
d200: 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
d210: 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
d220: 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
d230: 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
d240: 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
d250: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64       ** sqlite_d
d260: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f  ont_rollback() o
d270: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
d280: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
d290: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
d2a0: 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63      ** It is nec
d2b0: 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69  essary to do thi
d2c0: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  s because the pa
d2d0: 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  ge marked always
d2e0: 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a  Rollback.      *
d2f0: 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61  * might be reloa
d300: 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74  ded at a later t
d310: 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20  ime but at that 
d320: 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72  point we won't r
d330: 65 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a  emember.      **
d340: 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
d350: 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
d360: 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
d370: 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
d380: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
d390: 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
d3a0: 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
d3b0: 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20  re on out..     
d3c0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
d3d0: 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
d3e0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  k ){.        pPa
d3f0: 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
d400: 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ack = 1;.      }
d410: 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e  ..      /* Unlin
d420: 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66  k the old page f
d430: 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
d440: 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74  t and the hash t
d450: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  able.      */.  
d460: 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70      unlinkPage(p
d470: 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
d480: 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  r->nOvfl++;.    
d490: 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  }.    pPg->pgno 
d4a0: 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  = pgno;.    if( 
d4b0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
d4c0: 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
d4d0: 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
d4e0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
d4f0: 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28  ite3CheckMemory(
d500: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
d510: 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20  al, pgno/8);.   
d520: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d530: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
d540: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
d550: 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
d560: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
d570: 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
d580: 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  &7)))!=0;.      
d590: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
d5a0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
d5b0: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
d5c0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
d5d0: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
d5e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
d5f0: 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26  Pager->aInStmt &
d600: 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
d610: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20  ger->stmtSize.  
d620: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
d630: 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
d640: 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
d650: 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20  no&7)))!=0 ){.  
d660: 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
d670: 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
d680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d690: 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
d6a0: 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  m_stmt_list(pPg)
d6b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
d6c0: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
d6d0: 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pPg->nRef = 1;. 
d6e0: 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
d6f0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
d700: 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67  f++;.    h = pag
d710: 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20  er_hash(pgno);. 
d720: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
d730: 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
d740: 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
d750: 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
d760: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
d770: 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
d780: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
d790: 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
d7a0: 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
d7b0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
d7c0: 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
d7d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
d7e0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
d7f0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
d800: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
d810: 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
d820: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
d830: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
d840: 62 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74 65  bSize<0 ) sqlite
d850: 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
d860: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
d870: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
d880: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  k!=0 ){.      sq
d890: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
d8a0: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
d8b0: 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pg));.      rc =
d8c0: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
d8d0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65  Pager);.      re
d8e0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
d8f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
d900: 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20  bSize<(int)pgno 
d910: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
d920: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
d930: 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41  g), 0, SQLITE_PA
d940: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65  GE_SIZE);.    }e
d950: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
d960: 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
d970: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
d980: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
d990: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
d9a0: 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
d9b0: 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47  off_t)SQLITE_PAG
d9c0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72  E_SIZE);.      r
d9d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d9e0: 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  d(&pPager->fd, P
d9f0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
da00: 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ), SQLITE_PAGE_S
da10: 49 5a 45 29 3b 0a 20 20 20 20 20 20 54 52 41 43  IZE);.      TRAC
da20: 45 32 28 22 46 45 54 43 48 20 25 64 5c 6e 22 2c  E2("FETCH %d\n",
da30: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
da40: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
da50: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
da60: 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
da70: 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  3);.      if( rc
da80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
da90: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c         off_t fil
daa0: 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  eSize;.        i
dab0: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
dac0: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64  Size(&pPager->fd
dad0: 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c  ,&fileSize)!=SQL
dae0: 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
daf0: 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a        || fileSiz
db00: 65 3e 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50  e>=pgno*SQLITE_P
db10: 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
db20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
db30: 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54  er_unref(PGHDR_T
db40: 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20  O_DATA(pPg));.  
db50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
db60: 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
db70: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
db80: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
db90: 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45  (pPg), 0, SQLITE
dba0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
dbb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
dbc0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
dbd0: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
dbe0: 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
dbf0: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
dc00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69  .    pPager->nHi
dc10: 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72 65  t++;.    page_re
dc20: 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  f(pPg);.  }.  *p
dc30: 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f  pPage = PGHDR_TO
dc40: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65  _DATA(pPg);.  re
dc50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dc60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
dc70: 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
dc80: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
dc90: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
dca0: 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
dcb0: 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
dcc0: 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
dcd0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
dce0: 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
dcf0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
dd00: 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53  n cache..**.** S
dd10: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
dd20: 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65  ager_get().  The
dd30: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
dd40: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
dd50: 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70  .** and sqlite3p
dd60: 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68  ager_get() is th
dd70: 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
dd80: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
dd90: 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
dda0: 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
ddb0: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
ddc0: 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
ddd0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
dde0: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
ddf0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
de00: 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
de10: 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
de20: 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
de30: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
de40: 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
de50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
de60: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
de70: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
de80: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
de90: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
dea0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
deb0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
dec0: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
ded0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
dee0: 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67  .  }.  pPg = pag
def0: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
df00: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
df10: 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Pg==0 ) return 0
df20: 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
df30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  );.  return PGHD
df40: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
df50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
df60: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
df70: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
df80: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
df90: 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
dfa0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
dfb0: 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
dfc0: 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
dfd0: 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
dfe0: 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
dff0: 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
e000: 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
e010: 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
e020: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
e030: 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
e040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
e050: 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20  ager_unref(void 
e060: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
e070: 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63   *pPg;..  /* Dec
e080: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
e090: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
e0a0: 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
e0b0: 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
e0c0: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73  HDR(pData);.  as
e0d0: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
e0e0: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  0 );.  pPg->nRef
e0f0: 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
e100: 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
e110: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
e120: 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
e130: 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
e140: 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
e150: 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
e160: 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
e170: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
e180: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
e190: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
e1a0: 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
e1b0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
e1c0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
e1d0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
e1e0: 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
e1f0: 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
e200: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
e210: 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
e220: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
e230: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
e240: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
e250: 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
e260: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
e270: 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
e280: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
e290: 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
e2a0: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
e2b0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
e2c0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
e2d0: 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
e2e0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e2f0: 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
e300: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
e310: 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
e320: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e330: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
e340: 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
e350: 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
e360: 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
e370: 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
e380: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
e390: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
e3a0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
e3b0: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
e3c0: 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
e3d0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
e3e0: 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 70 50  ->nRef==0 && !pP
e3f0: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
e400: 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
e410: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
e420: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
e430: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e440: 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
e450: 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
e460: 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
e470: 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 77 72   already be a wr
e480: 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  ite.** lock on t
e490: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e4a0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
e4b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
e4c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
e4d0: 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
e4e0: 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
e4f0: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
e500: 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
e510: 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
e520: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
e530: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
e540: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
e550: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
e560: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
e570: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
e580: 74 65 3d 3d 53 51 4c 49 54 45 5f 57 52 49 54 45  te==SQLITE_WRITE
e590: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
e5a0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
e5b0: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  lOpen==0 );.  as
e5c0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
e5d0: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71  eJournal );.  sq
e5e0: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
e5f0: 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
e600: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
e610: 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  al = sqliteMallo
e620: 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
e630: 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
e640: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
e650: 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nal==0 ){.    sq
e660: 6c 69 74 65 33 4f 73 52 65 61 64 4c 6f 63 6b 28  lite3OsReadLock(
e670: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
e680: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e690: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  = SQLITE_READLOC
e6a0: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
e6b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
e6c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e6d0: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50  OpenExclusive(pP
e6e0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
e6f0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61  &pPager->jfd,pPa
e700: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
e710: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e720: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
e730: 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
e740: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
e750: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
e760: 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
e770: 65 33 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50  e3OsReadLock(&pP
e780: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70  ager->fd);.    p
e790: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53  Pager->state = S
e7a0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a  QLITE_READLOCK;.
e7b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e7c0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
e7d0: 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44    sqlite3OsOpenD
e7e0: 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d  irectory(pPager-
e7f0: 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 26 70 50  >zDirectory, &pP
e800: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50  ager->jfd);.  pP
e810: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
e820: 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
e830: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
e840: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
e850: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
e860: 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
e870: 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
e880: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
e890: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
e8a0: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
e8b0: 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
e8c0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
e8d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
e8e0: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
e8f0: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
e900: 69 7a 65 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e  ize;.  if( journ
e910: 61 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e  al_format==JOURN
e920: 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20  AL_FORMAT_3 ){. 
e930: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e940: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
e950: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
e960: 69 63 33 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  ic3, sizeof(aJou
e970: 72 6e 61 6c 4d 61 67 69 63 33 29 29 3b 0a 20 20  rnalMagic3));.  
e980: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e990: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
e9a0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
e9b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
e9c0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66  er->noSync ? 0xf
e9d0: 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
e9e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
e9f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ea00: 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d     sqlite3Random
ea10: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
ea20: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
ea30: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
ea40: 69 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  it);.      rc = 
ea50: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
ea60: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
ea70: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
ea80: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
ea90: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d 3d  journal_format==
eaa0: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 32  JOURNAL_FORMAT_2
eab0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
eac0: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
ead0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
eae0: 61 6c 4d 61 67 69 63 32 2c 20 73 69 7a 65 6f 66  alMagic2, sizeof
eaf0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 32 29  (aJournalMagic2)
eb00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
eb10: 61 73 73 65 72 74 28 20 6a 6f 75 72 6e 61 6c 5f  assert( journal_
eb20: 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f  format==JOURNAL_
eb30: 46 4f 52 4d 41 54 5f 31 20 29 3b 0a 20 20 20 20  FORMAT_1 );.    
eb40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
eb50: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
eb60: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  , aJournalMagic1
eb70: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
eb80: 6c 4d 61 67 69 63 31 29 29 3b 0a 20 20 7d 0a 20  lMagic1));.  }. 
eb90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
eba0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  OK ){.    rc = w
ebb0: 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
ebc0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
ebd0: 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  >dbSize);.  }.  
ebe0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
ebf0: 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
ec00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ec10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
ec20: 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50  er_stmt_begin(pP
ec30: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
ec40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ec50: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
ec60: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
ec70: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
ec80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ec90: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
eca0: 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
ecb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a  .  return rc;  .
ecc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
ecd0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
ece0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
ecf0: 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
ed00: 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
ed10: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
ed20: 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
ed30: 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
ed40: 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73  ager_commit() is
ed50: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
ed60: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
ed70: 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
ed80: 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
ed90: 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
eda0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
edb0: 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
edc0: 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  _unref() is call
edd0: 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
ede0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
edf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d  .**.** The param
ee00: 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
ee10: 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
ee20: 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
ee30: 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
ee40: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
ee50: 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
ee60: 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
ee70: 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 0a   is used merely.
ee80: 2a 2a 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ** to acquire a 
ee90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
eea0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
eeb0: 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
eec0: 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6c 72   there.** is alr
eed0: 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
eee0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
eef0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
ef00: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
ef10: 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
ef20: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
ef30: 2e 20 20 46 6f 72 0a 2a 2a 20 74 65 6d 70 6f 72  .  For.** tempor
ef40: 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  ary files, the o
ef50: 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
ef60: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
ef70: 66 65 72 72 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  ferred until.** 
ef80: 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75  there is an actu
ef90: 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
efa0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
efb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
efc0: 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
efd0: 79 20 77 72 69 74 65 2d 6c 6f 63 6b 65 64 2c 20  y write-locked, 
efe0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
eff0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
f000: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67  sqlite3pager_beg
f010: 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  in(void *pData){
f020: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
f030: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
f040: 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
f050: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
f060: 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
f070: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
f080: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
f090: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
f0a0: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c  ager->state!=SQL
f0b0: 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  ITE_UNLOCK );.  
f0c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
f0d0: 65 3d 3d 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f  e==SQLITE_READLO
f0e0: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
f0f0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
f100: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
f110: 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
f120: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
f130: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
f140: 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20  _WRITELOCK;.    
f150: 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
f160: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
f170: 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
f180: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
f190: 69 74 65 33 4f 73 57 72 69 74 65 4c 6f 63 6b 28  ite3OsWriteLock(
f1a0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
f1b0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f1c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f1d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f1e0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
f1f0: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
f200: 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20  _WRITELOCK;.    
f210: 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46    pPager->dirtyF
f220: 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  ile = 0;.      T
f230: 52 41 43 45 31 28 22 54 52 41 4e 53 41 43 54 49  RACE1("TRANSACTI
f240: 4f 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66  ON\n");.      if
f250: 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
f260: 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d  rnal && !pPager-
f270: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
f280: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
f290: 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
f2a0: 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
f2b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
f2c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
f2d0: 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
f2e0: 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
f2f0: 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
f300: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
f310: 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
f320: 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
f330: 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
f340: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
f350: 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
f360: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
f370: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
f380: 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
f390: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
f3a0: 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
f3b0: 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
f3c0: 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
f3d0: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
f3e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
f3f0: 49 66 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  If the write.** 
f400: 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
f410: 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
f420: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
f430: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
f440: 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
f450: 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
f460: 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
f470: 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
f480: 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
f490: 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
f4a0: 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
f4b0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
f4c0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
f4d0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
f4e0: 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
f4f0: 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
f500: 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
f510: 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
f520: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
f530: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
f540: 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
f550: 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
f560: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
f570: 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
f580: 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
f590: 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
f5a0: 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
f5b0: 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  o sqlite3pager_c
f5c0: 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
f5d0: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
f5e0: 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
f5f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
f600: 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a  ger_write(void *
f610: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
f620: 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
f630: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
f640: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
f650: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
f660: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f670: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
f680: 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
f690: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
f6a0: 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ask ){ .    retu
f6b0: 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
f6c0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
f6d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
f6e0: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
f6f0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
f700: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
f710: 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
f720: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
f730: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
f740: 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
f750: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
f760: 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
f770: 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
f780: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
f790: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
f7a0: 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
f7b0: 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72  inStmt || pPager
f7c0: 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20  ->stmtInUse==0) 
f7d0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
f7e0: 69 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a 20 20  irtyFile = 1;.  
f7f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f800: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
f810: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
f820: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
f830: 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
f840: 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74 74 65  o be.  ** writte
f850: 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
f860: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
f870: 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
f880: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62  ournal.  ** or b
f890: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  oth..  **.  ** F
f8a0: 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
f8b0: 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
f8c0: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
f8d0: 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63  xists and.  ** c
f8e0: 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
f8f0: 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  oes not..  */.  
f900: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f910: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e  state!=SQLITE_UN
f920: 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73  LOCK );.  rc = s
f930: 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
f940: 6e 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20  n(pData);.  if( 
f950: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f960: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
f970: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
f980: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c  ager->state==SQL
f990: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 3b  ITE_WRITELOCK );
f9a0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
f9b0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
f9c0: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
f9d0: 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  l ){.    rc = pa
f9e0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
f9f0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
fa00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fa10: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
fa20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
fa30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
fa40: 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
fa50: 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65  urnal );.  pPage
fa60: 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d 20 31  r->dirtyFile = 1
fa70: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  ;..  /* The tran
fa80: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
fa90: 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
faa0: 65 20 68 61 76 65 20 61 20 77 72 69 74 65 20 6c  e have a write l
fab0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
fac0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
fad0: 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
fae0: 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
faf0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
fb00: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 66 20    ** journal if 
fb10: 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
fb20: 61 6c 72 65 61 64 79 2e 0a 20 20 2a 2f 0a 20 20  already..  */.  
fb30: 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
fb40: 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
fb50: 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
fb60: 61 67 65 72 2d 3e 6d 65 6d 44 62 29 20 29 7b 0a  ager->memDb) ){.
fb70: 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
fb80: 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
fb90: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
fba0: 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a        int szPg;.
fbb0: 20 20 20 20 20 20 75 33 32 20 73 61 76 65 64 3b        u32 saved;
fbc0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
fbd0: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
fbe0: 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
fbf0: 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
fc00: 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
fc10: 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
fc20: 32 28 22 4a 4f 55 52 4e 41 4c 20 25 64 5c 6e 22  2("JOURNAL %d\n"
fc30: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
fc40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
fc50: 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b  ist->pOrig==0 );
fc60: 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
fc70: 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
fc80: 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
fc90: 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
fca0: 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
fcb0: 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
fcc0: 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
fcd0: 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f  >pOrig, PGHDR_TO
fce0: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
fcf0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
fd00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fd10: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
fd20: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
fd30: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   {.        if( j
fd40: 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 4a  ournal_format>=J
fd50: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20  OURNAL_FORMAT_3 
fd60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
fd70: 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
fd80: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67  ksum(pPager, pPg
fd90: 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a  ->pgno, pData);.
fda0: 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20            saved 
fdb0: 3d 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54  = *(u32*)PGHDR_T
fdc0: 4f 5f 45 58 54 52 41 28 70 50 67 29 3b 0a 20 20  O_EXTRA(pPg);.  
fdd0: 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62          store32b
fde0: 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20  its(cksum, pPg, 
fdf0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
fe00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  );.          szP
fe10: 67 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g = SQLITE_PAGE_
fe20: 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20 20 20 20  SIZE+8;.        
fe30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
fe40: 20 73 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f 50   szPg = SQLITE_P
fe50: 41 47 45 5f 53 49 5a 45 2b 34 3b 0a 20 20 20 20  AGE_SIZE+4;.    
fe60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 74      }.        st
fe70: 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70  ore32bits(pPg->p
fe80: 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20  gno, pPg, -4);. 
fe90: 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61         CODEC(pPa
fea0: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
feb0: 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
fec0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fed0: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
fee0: 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44  jfd, &((char*)pD
fef0: 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b  ata)[-4], szPg);
ff00: 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
ff10: 22 4a 4f 55 52 4e 41 4c 20 25 64 20 25 64 5c 6e  "JOURNAL %d %d\n
ff20: 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ", pPg->pgno, pP
ff30: 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
ff40: 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
ff50: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
ff60: 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
ff70: 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f    if( journal_fo
ff80: 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f  rmat>=JOURNAL_FO
ff90: 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 20 20  RMAT_3 ){.      
ffa0: 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52      *(u32*)PGHDR
ffb0: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 20 3d  _TO_EXTRA(pPg) =
ffc0: 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20   saved;.        
ffd0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
ffe0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fff0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10000 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
10010 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
10020 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
10030 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
10040 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ULL;.          r
10050 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10060 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
10070 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
10080 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10090 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
100a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
100b0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
100c0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
100d0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
100e0 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  ;.        pPg->n
100f0 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
10100 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
10110 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
10120 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  l = 1;.        i
10130 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
10140 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
10150 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
10160 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
10170 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
10180 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 61  7);.          pa
10190 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
101a0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
101b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
101c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
101d0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
101e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
101f0 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
10200 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 54  >noSync;.      T
10210 52 41 43 45 33 28 22 41 50 50 45 4e 44 20 25 64  RACE3("APPEND %d
10220 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
10230 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
10240 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
10250 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
10260 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
10270 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
10280 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
10290 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
102a0 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
102b0 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
102c0 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74  ot in it,.  ** t
102d0 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
102e0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
102f0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
10300 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
10310 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
10320 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c 77 61 79  nt journal alway
10330 73 20 75 73 65 73 20 74 68 65 20 73 69 6d 70 6c  s uses the simpl
10340 69 65 72 20 66 6f 72 6d 61 74 20 32 20 74 68 61  ier format 2 tha
10350 74 20 6c 61 63 6b 73 0a 20 20 2a 2a 20 63 68 65  t lacks.  ** che
10360 63 6b 73 75 6d 73 2e 20 20 54 68 65 20 68 65 61  cksums.  The hea
10370 64 65 72 20 69 73 20 61 6c 73 6f 20 6f 6d 69 74  der is also omit
10380 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ted from the sta
10390 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
103a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
103b0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
103c0 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
103d0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
103e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
103f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
10400 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
10410 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
10420 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
10430 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ize );.    if( p
10440 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
10450 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
10460 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
10470 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
10480 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
10490 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
104a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 48 69 73  =0 );.      pHis
104b0 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  t->pStmt = sqlit
104c0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
104d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
104e0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
104f0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
10500 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
10510 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f  pStmt, PGHDR_TO_
10520 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
10530 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
10540 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
10550 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E2("STMT-JOURNAL
10560 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
10570 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  o);.    }else{. 
10580 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
10590 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
105a0 20 2d 34 29 3b 0a 20 20 20 20 20 20 43 4f 44 45   -4);.      CODE
105b0 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
105c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
105d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
105e0 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
105f0 72 2d 3e 73 74 66 64 2c 20 28 28 63 68 61 72 2a  r->stfd, ((char*
10600 29 70 44 61 74 61 29 2d 34 2c 20 53 51 4c 49 54  )pData)-4, SQLIT
10610 45 5f 50 41 47 45 5f 53 49 5a 45 2b 34 29 3b 0a  E_PAGE_SIZE+4);.
10620 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53 54        TRACE2("ST
10630 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 5c 6e 22  MT-JOURNAL %d\n"
10640 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
10650 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
10660 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
10670 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  no, 0);.      if
10680 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10690 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
106a0 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
106b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
106c0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
106d0 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
106e0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ULL;.        ret
106f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
10700 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
10710 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  mtNRec++;.      
10720 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10730 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
10740 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
10750 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
10760 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
10770 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  o&7);.    }.    
10780 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
10790 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a  _list(pPg);.  }.
107a0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
107b0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
107c0 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
107d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
107e0 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70  Size<(int)pPg->p
107f0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
10800 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
10810 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74  >pgno;.  }.  ret
10820 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10830 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10840 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
10850 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
10860 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
10870 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
10880 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e  e3pager_write().
10890 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
108a0 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
108b0 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
108c0 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
108d0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
108e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
108f0 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28  ger_iswriteable(
10900 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
10910 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
10920 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
10930 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  );.  return pPg-
10940 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >dirty;.}../*.**
10950 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e   Replace the con
10960 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65  tent of a single
10970 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69   page with the i
10980 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
10990 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d  e third.** argum
109a0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
109b0 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69  te3pager_overwri
109c0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
109d0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
109e0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69  d *pData){.  voi
109f0 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  d *pPage;.  int 
10a00 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
10a10 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61  te3pager_get(pPa
10a20 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67  ger, pgno, &pPag
10a30 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
10a40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
10a50 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
10a60 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
10a70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10a80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
10a90 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74  mcpy(pPage, pDat
10aa0 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  a, SQLITE_PAGE_S
10ab0 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IZE);.    }.    
10ac0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
10ad0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ef(pPage);.  }. 
10ae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10af0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
10b00 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
10b10 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
10b20 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
10b30 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
10b40 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
10b50 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20   on page "pgno" 
10b60 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
10b70 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
10b80 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
10b90 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
10ba0 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  rty..**.** The o
10bb0 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
10bc0 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
10bd0 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
10be0 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
10bf0 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
10c00 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
10c10 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
10c20 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
10c30 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
10c40 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
10c50 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
10c60 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
10c70 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
10c80 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72  zation, together
10c90 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c   with the.** sql
10ca0 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
10cb0 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
10cc0 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
10cd0 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
10ce0 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
10cf0 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
10d00 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
10d10 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
10d20 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
10d30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10d40 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
10d50 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
10d60 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
10d70 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
10d80 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
10d90 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
10da0 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
10db0 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
10dc0 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
10dd0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
10de0 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
10df0 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
10e00 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
10e10 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
10e20 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
10e30 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
10e40 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
10e50 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
10e60 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
10e70 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
10e80 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
10e90 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
10ea0 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
10eb0 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
10ec0 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
10ed0 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
10ee0 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
10ef0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10f00 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
10f10 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c  .** the dont_rol
10f20 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
10f30 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
10f40 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
10f50 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69   contains.** cri
10f60 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
10f70 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
10f80 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c  sure it gets rol
10f90 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74  led back in spit
10fa0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74  e.** of the dont
10fb0 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  _rollback() call
10fc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10fd0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74  3pager_dont_writ
10fe0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
10ff0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
11000 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50  gHdr *pPg;..  pP
11010 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
11020 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
11030 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
11040 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28  lback = 1;.  if(
11050 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72   pPg && pPg->dir
11060 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ty ){.    if( pP
11070 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
11080 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
11090 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
110a0 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
110b0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
110c0 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
110d0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
110e0 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
110f0 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
11100 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
11110 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
11120 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
11130 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
11140 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
11150 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
11160 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
11170 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
11180 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
11190 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
111a0 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
111b0 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
111c0 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
111d0 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
111e0 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
111f0 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
11200 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
11210 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
11220 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
11230 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
11240 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
11250 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
11260 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
11270 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
11280 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
11290 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
112a0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
112b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
112c0 54 52 41 43 45 32 28 22 44 4f 4e 54 5f 57 52 49  TRACE2("DONT_WRI
112d0 54 45 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 29 3b  TE %d\n", pgno);
112e0 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
112f0 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 0;.    }.  }
11300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
11310 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
11320 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
11330 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62   that if a rollb
11340 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ack occurs,.** i
11350 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
11360 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ry to restore th
11370 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69  e data on the gi
11380 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a  ven page.  This.
11390 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
113a0 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
113b0 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20   have to record 
113c0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
113d0 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63  n the.** rollbac
113e0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f  k journal..*/.vo
113f0 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
11400 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f  dont_rollback(vo
11410 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
11420 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
11430 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
11440 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
11450 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
11460 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
11470 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49  tate!=SQLITE_WRI
11480 54 45 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  TELOCK || pPager
11490 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
114a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
114b0 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
114c0 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  back || pPager->
114d0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
114e0 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  | pPager->memDb 
114f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
11500 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
11510 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
11520 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
11530 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  gDbSize ){.    a
11540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
11550 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
11560 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
11570 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
11580 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
11590 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67  pgno&7);.    pPg
115a0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
115b0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
115c0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
115d0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
115e0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
115f0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
11600 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65  o&7);.      page
11610 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
11620 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
11630 20 20 54 52 41 43 45 32 28 22 44 4f 4e 54 5f 52    TRACE2("DONT_R
11640 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70  OLLBACK %d\n", p
11650 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
11660 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
11670 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e  tInUse && !pPg->
11680 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  inStmt && (int)p
11690 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
116a0 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20  ->stmtSize ){.  
116b0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
116c0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
116d0 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
116e0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
116f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
11700 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
11710 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
11720 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
11730 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
11740 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67  pgno&7);.    pag
11750 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
11760 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  st(pPg);.  }.}..
11770 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50  ./*.** Clear a P
11780 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a  gHistory block.*
11790 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
117a0 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73  earHistory(PgHis
117b0 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20  tory *pHist){.  
117c0 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
117d0 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69  ->pOrig);.  sqli
117e0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
117f0 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70  tmt);.  pHist->p
11800 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73  Orig = 0;.  pHis
11810 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  t->pStmt = 0;.}.
11820 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c  ./*.** Commit al
11830 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  l changes to the
11840 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
11850 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
11860 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
11870 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20  he commit fails 
11880 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
11890 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d  a rollback attem
118a0 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e  pt is made.** an
118b0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
118c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
118d0 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b   the commit work
118e0 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  ed, SQLITE_OK.**
118f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
11900 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
11910 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  r_commit(Pager *
11920 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
11930 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
11940 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
11950 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45  errMask==PAGER_E
11960 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  RR_FULL ){.    r
11970 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
11980 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
11990 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
119a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
119b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
119c0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
119d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
119e0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
119f0 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
11a00 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
11a10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
11a20 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
11a30 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
11a40 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  =SQLITE_WRITELOC
11a50 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
11a60 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
11a70 7d 0a 20 20 54 52 41 43 45 31 28 22 43 4f 4d 4d  }.  TRACE1("COMM
11a80 49 54 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 50  IT\n");.  if( pP
11a90 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
11aa0 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
11ab0 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
11ac0 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
11ad0 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20  while( pPg ){.  
11ae0 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
11af0 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
11b00 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
11b10 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
11b20 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
11b30 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
11b40 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
11b50 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
11b60 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
11b70 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
11b80 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
11b90 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
11ba0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
11bb0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
11bc0 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
11bd0 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 20 20 72  _READLOCK;.    r
11be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11bf0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
11c00 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d 3d 30 20  r->dirtyFile==0 
11c10 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65  ){.    /* Exit e
11c20 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f  arly (without do
11c30 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e  ing the time-con
11c40 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  suming sqlite3Os
11c50 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20  Sync() calls).  
11c60 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61    ** if there ha
11c70 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
11c80 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
11c90 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
11ca0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11cb0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
11cc0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
11cd0 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
11ce0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
11cf0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
11d00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
11d10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11d20 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
11d30 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
11d40 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
11d50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11d60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  ){.    goto comm
11d70 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  it_abort;.  }.  
11d80 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
11d90 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
11da0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
11db0 50 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  Pg ){.    rc = p
11dc0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
11dd0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ist(pPg);.    if
11de0 28 20 72 63 20 7c 7c 20 28 21 70 50 61 67 65 72  ( rc || (!pPager
11df0 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71 6c 69  ->noSync && sqli
11e00 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
11e10 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f  r->fd)!=SQLITE_O
11e20 4b 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  K) ){.      goto
11e30 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
11e40 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
11e50 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
11e60 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  k(pPager);.  pPa
11e70 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
11e80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
11e90 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
11ea0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
11eb0 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65  wrong during the
11ec0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
11ed0 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f  .  */.commit_abo
11ee0 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rt:.  rc = sqlit
11ef0 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
11f00 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
11f10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11f20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11f30 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74  _FULL;.  }.  ret
11f40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11f50 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
11f60 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
11f70 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
11f80 74 6f 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64  to read-only mod
11f90 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
11fa0 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
11fb0 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
11fc0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
11fd0 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
11fe0 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
11ff0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
12000 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
12010 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
12020 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
12030 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
12040 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
12050 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51  ing protocol (SQ
12060 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f  LITE_PROTOCOL) o
12070 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
12080 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
12090 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
120a0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
120b0 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
120c0 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
120d0 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
120e0 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
120f0 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
12100 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
12110 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
12120 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
12130 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
12140 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
12150 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
12160 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12170 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
12180 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12190 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41  .  int rc;.  TRA
121a0 43 45 31 28 22 52 4f 4c 4c 42 41 43 4b 5c 6e 22  CE1("ROLLBACK\n"
121b0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
121c0 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 50 67  >memDb ){.    Pg
121d0 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
121e0 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
121f0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
12200 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
12210 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
12220 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29   if( !p->dirty )
12230 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12240 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
12250 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
12260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
12270 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
12280 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
12290 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
122a0 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
122b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
122c0 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22 52         TRACE2("R
122d0 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 5c  OLLBACK-PAGE %d\
122e0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20  n", p->pgno);.  
122f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12300 20 20 20 54 52 41 43 45 32 28 22 50 41 47 45 20     TRACE2("PAGE 
12310 25 64 20 69 73 20 63 6c 65 61 6e 5c 6e 22 2c 20  %d is clean\n", 
12320 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  p->pgno);.      
12330 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  }.      clearHis
12340 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
12350 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
12360 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72  .      p->inJour
12370 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
12380 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
12390 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74      p->pPrevStmt
123a0 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20   = p->pNextStmt 
123b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
123c0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
123d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
123e0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
123f0 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d  rigDbSize;.    m
12400 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
12410 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
12420 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
12430 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
12440 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41  ate = SQLITE_REA
12450 44 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  DLOCK;.    retur
12460 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12470 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
12480 3e 64 69 72 74 79 46 69 6c 65 20 7c 7c 20 21 70  >dirtyFile || !p
12490 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
124a0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  en ){.    rc = p
124b0 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
124c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
124d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
124e0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
124f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
12500 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
12510 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  && pPager->errMa
12520 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk!=PAGER_ERR_FU
12530 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
12540 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c  ager->state>=SQL
12550 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b  ITE_WRITELOCK ){
12560 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
12570 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
12580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
12590 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
125a0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
125b0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
125c0 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e!=SQLITE_WRITEL
125d0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
125e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
125f0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c  .  rc = pager_pl
12600 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
12610 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
12630 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12640 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  T;.    pPager->e
12650 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
12660 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ERR_CORRUPT;.  }
12670 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
12680 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
12690 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
126a0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
126b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
126c0 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
126d0 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
126e0 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
126f0 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
12700 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
12710 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
12720 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  r_isreadonly(Pag
12730 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
12740 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
12750 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
12760 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12770 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
12780 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
12790 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
127a0 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28  ite3pager_stats(
127b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
127c0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39    static int a[9
127d0 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
127e0 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
127f0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
12800 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
12810 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
12820 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
12830 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
12840 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
12850 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
12860 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Mask;.  a[6] = p
12870 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
12880 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
12890 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50  iss;.  a[8] = pP
128a0 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72  ager->nOvfl;.  r
128b0 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn a;.}../*.*
128c0 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
128d0 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
128e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
128f0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
12900 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
12910 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
12920 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
12930 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
12940 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
12950 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
12960 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
12970 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
12980 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
12990 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
129a0 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
129b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
129c0 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
129d0 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  begin(Pager *pPa
129e0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
129f0 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
12a00 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
12a10 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  E];.  assert( !p
12a20 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
12a30 20 29 3b 0a 20 20 54 52 41 43 45 31 28 22 53 54   );.  TRACE1("ST
12a40 4d 54 2d 42 45 47 49 4e 5c 6e 22 29 3b 0a 20 20  MT-BEGIN\n");.  
12a50 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
12a60 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
12a70 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
12a80 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
12a90 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
12aa0 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
12ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12ac0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
12ad0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
12ae0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
12af0 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
12b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12b10 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
12b20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12b30 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72  Open );.  pPager
12b40 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->aInStmt = sqli
12b50 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
12b60 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
12b70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12b80 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  aInStmt==0 ){.  
12b90 20 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 4c    sqlite3OsReadL
12ba0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
12bb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12bc0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
12bd0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
12be0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
12bf0 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
12c00 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
12c10 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
12c20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
12c30 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
12c40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
12c50 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 0a 20 20 20  tmtJSize == .   
12c60 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f   pPager->nRec*JO
12c70 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72  URNAL_PG_SZ(jour
12c80 6e 61 6c 5f 66 6f 72 6d 61 74 29 2b 4a 4f 55 52  nal_format)+JOUR
12c90 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72 6e  NAL_HDR_SZ(journ
12ca0 61 6c 5f 66 6f 72 6d 61 74 29 20 29 3b 0a 23 65  al_format) );.#e
12cb0 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73  ndif.  pPager->s
12cc0 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
12cd0 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f  r->nRec*JOURNAL_
12ce0 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f  PG_SZ(journal_fo
12cf0 72 6d 61 74 29 0a 20 20 20 20 20 20 20 20 20 20  rmat).          
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
12d10 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
12d20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b  journal_format);
12d30 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
12d40 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
12d50 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50 61  Size;.  if( !pPa
12d60 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
12d70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12d80 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
12d90 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e  zTemp, &pPager->
12da0 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  stfd);.    if( r
12db0 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
12dc0 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
12dd0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
12de0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
12df0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
12e00 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
12e10 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
12e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e30 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
12e40 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
12e50 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
12e60 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
12e70 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
12e80 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
12e90 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
12ea0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12eb0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
12ec0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
12ed0 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
12ee0 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
12ef0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
12f00 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
12f10 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
12f20 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52  , *pNext;.    TR
12f30 41 43 45 31 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE1("STMT-COMMI
12f40 54 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 21  T\n");.    if( !
12f50 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
12f60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
12f70 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74  Seek(&pPager->st
12f80 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a  fd, 0);.      /*
12f90 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
12fa0 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  te(&pPager->stfd
12fb0 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73  , 0); */.      s
12fc0 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
12fd0 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20  r->aInStmt );.  
12fe0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
12ff0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  tmt = 0;.    }. 
13000 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
13010 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
13020 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  Pg=pNext){.     
13030 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
13040 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61  extStmt;.      a
13050 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74  ssert( pPg->inSt
13060 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  mt );.      pPg-
13070 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
13080 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
13090 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
130a0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  mt = 0;.      if
130b0 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
130c0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
130d0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
130e0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
130f0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
13100 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
13110 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
13120 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
13130 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
13140 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
13150 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
13160 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
13170 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
13180 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
13190 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
131a0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
131b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
131c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
131d0 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
131e0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
131f0 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c  3pager_stmt_roll
13200 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
13210 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
13220 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
13230 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52  tInUse ){.    TR
13240 41 43 45 31 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE1("STMT-ROLLB
13250 41 43 4b 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28  ACK\n");.    if(
13260 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
13270 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
13280 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  Pg;.      for(pP
13290 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
132a0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
132b0 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20  NextStmt){.     
132c0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
132d0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
132e0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
132f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
13300 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
13310 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
13320 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
13330 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  ), pHist->pStmt,
13340 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
13350 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
13360 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
13370 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
13380 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
13390 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
133a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
133b0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
133c0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
133d0 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63       memoryTrunc
133e0 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
133f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
13400 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
13410 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73      rc = pager_s
13420 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  tmt_playback(pPa
13430 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
13440 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
13450 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
13460 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
13470 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13480 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
13490 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
134a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
134b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
134c0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
134d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
134e0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
134f0 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
13500 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  filename(Pager *
13510 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
13520 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
13530 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ame;.}../*.** Se
13540 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  t the codec for 
13550 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
13560 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
13570 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67  set_codec(.  Pag
13580 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
13590 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
135a0 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
135b0 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
135c0 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
135d0 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
135e0 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
135f0 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
13600 41 72 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Arg;.}..#ifdef S
13610 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
13620 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67   Print a listing
13630 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63   of all referenc
13640 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ed pages and the
13650 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f  ir ref count..*/
13660 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
13670 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72  er_refdump(Pager
13680 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
13690 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
136a0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
136b0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
136c0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
136d0 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
136e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
136f0 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
13700 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66  addr=0x%08x nRef
13710 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
13720 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29  pPg->pgno, (int)
13730 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
13740 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a  g), pPg->nRef);.
13750 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a             }.}.#endif.