/ Hex Artifact Content
Login

Artifact f35799e6c5d9dbb9701f3a8945a557a34b8e4850:


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 36 39  : pager.c,v 1.69
0350: 20 32 30 30 33 2f 30 31 2f 32 31 20 30 32 3a 33   2003/01/21 02:3
0360: 39 3a 33 37 20 64 72 68 20 45 78 70 20 24 0a 2a  9:37 drh Exp $.*
0370: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  /.#include "os.h
0380: 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  "         /* Mus
0390: 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65 6e  t be first to en
03a0: 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65 20  able large file 
03b0: 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63 6c  support */.#incl
03c0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
03d0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03e0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03f0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0400: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0410: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
0420: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0430: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0440: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73 74   off.*/.#if 0.st
0450: 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69 6e  atic Pager *main
0460: 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66 69  Pager = 0;.#defi
0470: 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 20  ne SET_PAGER(X) 
0480: 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d 3d   if( mainPager==
0490: 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d 20  0 ) mainPager = 
04a0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52 5f  (X).#define CLR_
04b0: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
04c0: 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20 6d  inPager==(X) ) m
04d0: 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64 65  ainPager = 0.#de
04e0: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20 20  fine TRACE1(X)  
04f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0500: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0510: 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64 65  tf(stderr,X).#de
0520: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0530: 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 6d     if( pPager==m
0540: 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69 6e  ainPager ) fprin
0550: 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a 23  tf(stderr,X,Y).#
0560: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0570: 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72 3d  Y,Z) if( pPager=
0580: 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72  =mainPager ) fpr
0590: 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 2c  intf(stderr,X,Y,
05a0: 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  Z).#else.#define
05b0: 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23 64   SET_PAGER(X).#d
05c0: 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28  efine CLR_PAGER(
05d0: 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  X).#define TRACE
05e0: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
05f0: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0600: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
0620: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0630: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0640: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0660: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  tes:.**.**   SQL
0670: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0680: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0690: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
06a0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   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 77 72 69 74 69 6e 67 20 74 68        writing th
06d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
06e0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
0710: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0720: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0730: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0740: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0750: 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
0760: 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68 65  READLOCK     The
0770: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0780: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0790: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
07b0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
07c0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
07d0: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
07f0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0800: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0810: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0840: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0850: 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54 45  *   SQLITE_WRITE
0860: 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67 65  LOCK    The page
0870: 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e   cache is writin
0880: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0890: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
08a0: 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20           Access 
08b0: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e  is exclusive.  N
08c0: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
08d0: 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  s or.**         
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
08f0: 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61  reads can be rea
0900: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
0910: 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 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 70 72 6f 63 65 73 73 20 69 73 20 77 72     process is wr
0940: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iting..**.** The
0950: 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65   page cache come
0960: 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f 55  s up in SQLITE_U
0970: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0980: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0990: 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f 63  te_page_get() oc
09a0: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
09b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53  transitions to S
09c0: 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e 0a  QLITE_READLOCK..
09d0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
09e0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
09f0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0a00: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0a10: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0a20: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0a30: 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e  o SQLITE_UNLOCK.
0a40: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0a50: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 5f  .** that sqlite_
0a60: 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73 20  page_write() is 
0a70: 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74  called, the stat
0a80: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0a90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54 45  .** SQLITE_WRITE
0aa0: 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68 61  LOCK.  (Note tha
0ab0: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0ac0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0ad0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0ae0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0af0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0b00: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0b10: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c 49  st.** be in SQLI
0b20: 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66 6f  TE_READLOCK befo
0b30: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0b40: 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49 54  s to SQLITE_WRIT
0b50: 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20 73  ELOCK.).** The s
0b60: 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62  qlite_page_rollb
0b70: 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ack() and sqlite
0b80: 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66  _page_commit() f
0b90: 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61  unctions .** tra
0ba0: 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61 74  nsition the stat
0bb0: 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57 52  e from SQLITE_WR
0bc0: 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f 20  ITELOCK back to 
0bd0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
0be0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
0bf0: 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  TE_UNLOCK      0
0c00: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
0c10: 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23 64  READLOCK    1.#d
0c20: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52 49  efine SQLITE_WRI
0c30: 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a 0a  TELOCK   2.../*.
0c40: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
0c50: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
0c60: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
0c70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
0c80: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
0c90: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
0ca0: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
0cb0: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
0cc0: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
0cd0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
0ce0: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
0cf0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
0d00: 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 74 79 70  e header..*/.typ
0d10: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
0d20: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
0d30: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
0d40: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
0d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d60: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
0d70: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
0d80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
0db0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
0dc0: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
0dd0: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
0de0: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
0df0: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
0e00: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
0e10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0e40: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
0e50: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
0e60: 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72  *pNextFree, *pPr
0e70: 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65  evFree;  /* Free
0e80: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68  list of pages wh
0e90: 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20  ere nRef==0 */. 
0ea0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c   PgHdr *pNextAll
0eb0: 2c 20 2a 70 50 72 65 76 41 6c 6c 3b 20 20 20 20  , *pPrevAll;    
0ec0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
0ed0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
0ee0: 72 20 2a 70 4e 65 78 74 43 6b 70 74 2c 20 2a 70  r *pNextCkpt, *p
0ef0: 50 72 65 76 43 6b 70 74 3b 20 20 2f 2a 20 4c 69  PrevCkpt;  /* Li
0f00: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
0f10: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
0f20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
0f30: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
0f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
0f50: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
0f60: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
0f70: 20 2a 2f 0a 20 20 75 38 20 69 6e 43 6b 70 74 3b   */.  u8 inCkpt;
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
0fa0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
0fb0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
0fc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
0ff0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1000: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1010: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1040: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1050: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1060: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1070: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1080: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1090: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
10a0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a  his page */.  /*
10b0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
10c0: 45 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  E bytes of page 
10d0: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
10e0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
10f0: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
1100: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
1110: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
1120: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
1130: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
1140: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
1150: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
1160: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
1170: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
1180: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
1190: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
11a0: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
11b0: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
11c0: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
11d0: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
11e0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
11f0: 54 52 41 28 50 29 20 28 28 76 6f 69 64 2a 29 26  TRA(P) ((void*)&
1200: 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d  ((char*)(&(P)[1]
1210: 29 29 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ))[SQLITE_PAGE_S
1220: 49 5a 45 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77  IZE])../*.** How
1230: 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68 65   big to make the
1240: 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65 64   hash table used
1250: 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69 6e   for locating in
1260: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a 2a  -memory pages.**
1270: 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e   by page number.
1280: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47  .*/.#define N_PG
1290: 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a 0a 2a  _HASH 2048../*.*
12a0: 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e 75  * Hash a page nu
12b0: 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mber.*/.#define 
12c0: 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20 20  pager_hash(PN)  
12d0: 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48  ((PN)&(N_PG_HASH
12e0: 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  -1))../*.** A op
12f0: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
1300: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1310: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1320: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
1330: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63 68 61  ct Pager {.  cha
1340: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
1350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1360: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1370: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
1380: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
1390: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
13a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
13b0: 6c 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66  le */.  OsFile f
13c0: 64 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20  d, jfd;         
13d0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
13e0: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
13f0: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
1400: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 63 70 66   */.  OsFile cpf
1410: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1420: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
1430: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 63 68 65  ptor for the che
1440: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
1450: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1480: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1490: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
14a0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
14b0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
14c0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
14d0: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6b  ange */.  int ck
14e0: 70 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ptSize;         
14f0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1500: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
1510: 67 65 73 29 20 61 74 20 63 6b 70 74 5f 62 65 67  ges) at ckpt_beg
1520: 69 6e 28 29 20 2a 2f 0a 20 20 6f 66 66 5f 74 20  in() */.  off_t 
1530: 63 6b 70 74 4a 53 69 7a 65 3b 20 20 20 20 20 20  ckptJSize;      
1540: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1550: 20 6a 6f 75 72 6e 61 6c 20 61 74 20 63 6b 70 74   journal at ckpt
1560: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 23 69 66 6e  _begin() */.#ifn
1570: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 6f 66 66  def NDEBUG.  off
1580: 5f 74 20 73 79 6e 63 4a 53 69 7a 65 3b 20 20 20  _t syncJSize;   
1590: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
15a0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 6c   of journal at l
15b0: 61 73 74 20 66 73 79 6e 63 28 29 20 63 61 6c 6c  ast fsync() call
15c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
15d0: 20 63 6b 70 74 4e 52 65 63 3b 20 20 20 20 20 20   ckptNRec;      
15e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15f0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
1600: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
1610: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
1620: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
1630: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1640: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1650: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
1660: 79 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64  y page */.  void
1670: 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28   (*xDestructor)(
1680: 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20  void*); /* Call 
1690: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
16a0: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
16b0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
16e0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
16f0: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ges */.  int nRe
1700: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1710: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1720: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
1730: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
1740: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
1750: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1760: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
1770: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1780: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
1790: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20   */.  int nHit, 
17a0: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
17b0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
17c0: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
17d0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
17e0: 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b   u8 journalOpen;
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1800: 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
1810: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
1820: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75   is valid */.  u
1830: 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  8 journalStarted
1840: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
1850: 75 65 20 69 66 20 69 6e 69 74 69 61 6c 20 6d 61  ue if initial ma
1860: 67 69 63 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  gic of journal i
1870: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
1880: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
1890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
18a0: 6e 6f 74 20 75 73 65 20 61 20 72 6f 6c 6c 62 61  not use a rollba
18b0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ck journal on th
18c0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  is file */.  u8 
18d0: 63 6b 70 74 4f 70 65 6e 3b 20 20 20 20 20 20 20  ckptOpen;       
18e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
18f0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   if the checkpoi
1900: 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
1910: 65 6e 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 49  en */.  u8 ckptI
1920: 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  nUse;           
1930: 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61      /* True we a
1940: 72 65 20 69 6e 20 61 20 63 68 65 63 6b 70 6f 69  re in a checkpoi
1950: 6e 74 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 41  nt */.  u8 ckptA
1960: 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20  utoopen;        
1970: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6b 70 74      /* Open ckpt
1980: 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61   journal when ma
1990: 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  in journal is op
19a0: 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ened*/.  u8 noSy
19b0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
19c0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
19d0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
19e0: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
19f0: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
1a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
1a10: 54 45 5f 55 4e 4c 4f 43 4b 2c 20 5f 52 45 41 44  TE_UNLOCK, _READ
1a20: 4c 4f 43 4b 20 6f 72 20 5f 57 52 49 54 45 4c 4f  LOCK or _WRITELO
1a30: 43 4b 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61  CK */.  u8 errMa
1a40: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1a50: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
1a60: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
1a70: 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74 65  rrors */.  u8 te
1a80: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
1a90: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
1aa0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
1ab0: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
1ac0: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
1ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1ae0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
1af0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
1b00: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
1b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b20: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
1b30: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
1b40: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1b50: 38 20 64 69 72 74 79 46 69 6c 65 3b 20 20 20 20  8 dirtyFile;    
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b70: 75 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  ue if database f
1b80: 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
1b90: 69 6e 20 61 6e 79 20 77 61 79 20 2a 2f 0a 20 20  in any way */.  
1ba0: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
1bb0: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
1bc0: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
1bd0: 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70  back() for all p
1be0: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  ages */.  u8 jou
1bf0: 72 6e 61 6c 46 6f 72 6d 61 74 3b 20 20 20 20 20  rnalFormat;     
1c00: 20 20 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e        /* Version
1c10: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6a   number of the j
1c20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
1c30: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c50: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
1c60: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
1c70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1c80: 75 38 20 2a 61 49 6e 43 6b 70 74 3b 20 20 20 20  u8 *aInCkpt;    
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1ca0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
1cb0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
1cc0: 62 61 73 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  base */.  PgHdr 
1cd0: 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b  *pFirst, *pLast;
1ce0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1cf0: 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20   free pages */. 
1d00: 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53 79   PgHdr *pFirstSy
1d10: 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  nced;        /* 
1d20: 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  First free page 
1d30: 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53  with PgHdr.needS
1d40: 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64  ync==0 */.  PgHd
1d50: 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20  r *pAll;        
1d60: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1d70: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
1d80: 20 20 50 67 48 64 72 20 2a 70 43 6b 70 74 3b 20    PgHdr *pCkpt; 
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da0: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
1db0: 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  n the checkpoint
1dc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67   journal */.  Pg
1dd0: 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f  Hdr *aHash[N_PG_
1de0: 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73  HASH];    /* Has
1df0: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
1e00: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 50 67  age number of Pg
1e10: 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Hdr */.};../*.**
1e20: 20 54 68 65 73 65 20 61 72 65 20 62 69 74 73 20   These are bits 
1e30: 74 68 61 74 20 63 61 6e 20 62 65 20 73 65 74 20  that can be set 
1e40: 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b  in Pager.errMask
1e50: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1e60: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20 20 20 20  ER_ERR_FULL     
1e70: 30 78 30 31 20 20 2f 2a 20 61 20 77 72 69 74 65  0x01  /* a write
1e80: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65  () failed */.#de
1e90: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4d  fine PAGER_ERR_M
1ea0: 45 4d 20 20 20 20 20 20 30 78 30 32 20 20 2f 2a  EM      0x02  /*
1eb0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
1ec0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
1ed0: 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30  R_ERR_LOCK     0
1ee0: 78 30 34 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e  x04  /* error in
1ef0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f   the locking pro
1f00: 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65  tocol */.#define
1f10: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
1f20: 50 54 20 20 30 78 30 38 20 20 2f 2a 20 64 61 74  PT  0x08  /* dat
1f30: 61 62 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c  abase or journal
1f40: 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23   corruption */.#
1f50: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
1f60: 5f 44 49 53 4b 20 20 20 20 20 30 78 31 30 20 20  _DISK     0x10  
1f70: 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69 73 6b 20  /* general disk 
1f80: 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62 61 64 20  I/O error - bad 
1f90: 68 61 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a  hard drive? */..
1fa0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
1fb0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
1fc0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 69 6e 20  page records in 
1fd0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1fe0: 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 74 79 70 65   format..*/.type
1ff0: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 52  def struct PageR
2000: 65 63 6f 72 64 20 50 61 67 65 52 65 63 6f 72 64  ecord PageRecord
2010: 3b 0a 73 74 72 75 63 74 20 50 61 67 65 52 65 63  ;.struct PageRec
2020: 6f 72 64 20 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  ord {.  Pgno pgn
2030: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
2040: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2050: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  ge number */.  c
2060: 68 61 72 20 61 44 61 74 61 5b 53 51 4c 49 54 45  har aData[SQLITE
2070: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a  _PAGE_SIZE];  /*
2080: 20 4f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 66   Original data f
2090: 6f 72 20 70 61 67 65 20 70 67 6e 6f 20 2a 2f 0a  or page pgno */.
20a0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  };../*.** Journa
20b0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
20c0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
20d0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
20e0: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
20f0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
2100: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
2110: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
2120: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
2130: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
2140: 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  wo journal forma
2150: 74 73 2e 20 20 54 68 65 20 6f 6c 64 65 72 20 6a  ts.  The older j
2160: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 77 72  ournal format wr
2170: 69 74 65 73 0a 2a 2a 20 33 32 2d 62 69 74 20 69  ites.** 32-bit i
2180: 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 62  ntegers in the b
2190: 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65  yte-order of the
21a0: 20 68 6f 73 74 20 6d 61 63 68 69 6e 65 2e 20 20   host machine.  
21b0: 54 68 65 20 6e 65 77 0a 2a 2a 20 66 6f 72 6d 61  The new.** forma
21c0: 74 20 77 72 69 74 65 73 20 69 6e 74 65 67 65 72  t writes integer
21d0: 73 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  s as big-endian.
21e0: 20 20 41 6c 6c 20 6e 65 77 20 6a 6f 75 72 6e 61    All new journa
21f0: 6c 73 20 75 73 65 20 74 68 65 0a 2a 2a 20 6e 65  ls use the.** ne
2200: 77 20 66 6f 72 6d 61 74 2c 20 62 75 74 20 77 65  w format, but we
2210: 20 68 61 76 65 20 74 6f 20 62 65 20 61 62 6c 65   have to be able
2220: 20 74 6f 20 72 65 61 64 20 61 6e 20 6f 6c 64 65   to read an olde
2230: 72 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6f 72 64  r journal in ord
2240: 65 72 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 69 74  er.** to roll it
2250: 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
2260: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
2270: 63 68 61 72 20 61 4f 6c 64 4a 6f 75 72 6e 61 6c  char aOldJournal
2280: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
2290: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
22a0: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
22b0: 2c 20 30 78 36 33 2c 20 30 78 64 34 2c 0a 7d 3b  , 0x63, 0xd4,.};
22c0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
22d0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
22e0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
22f0: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
2300: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
2310: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 35  0xa1, 0x63, 0xd5
2320: 2c 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 51 4c  ,.};.#define SQL
2330: 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e 41 4c 5f  ITE_NEW_JOURNAL_
2340: 46 4f 52 4d 41 54 20 31 0a 23 64 65 66 69 6e 65  FORMAT 1.#define
2350: 20 53 51 4c 49 54 45 5f 4f 4c 44 5f 4a 4f 55 52   SQLITE_OLD_JOUR
2360: 4e 41 4c 5f 46 4f 52 4d 41 54 20 30 0a 0a 2f 2a  NAL_FORMAT 0../*
2370: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2380: 67 20 69 6e 74 65 67 65 72 2c 20 69 66 20 73 65  g integer, if se
2390: 74 2c 20 63 61 75 73 65 73 20 6a 6f 75 72 6e 61  t, causes journa
23a0: 6c 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ls to be written
23b0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6f 6c 64 20 66   in the.** old f
23c0: 6f 72 6d 61 74 2e 20 20 54 68 69 73 20 69 73 20  ormat.  This is 
23d0: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
23e0: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 20 2d   purposes only -
23f0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 0a 2a 2a   to make sure.**
2400: 20 74 68 65 20 63 6f 64 65 20 69 73 20 61 62 6c   the code is abl
2410: 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e to rollback an
2420: 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   old journal..*/
2430: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2440: 45 53 54 0a 69 6e 74 20 70 61 67 65 72 5f 6f 6c  EST.int pager_ol
2450: 64 5f 66 6f 72 6d 61 74 20 3d 20 30 3b 0a 23 65  d_format = 0;.#e
2460: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
2470: 65 72 5f 6f 6c 64 5f 66 6f 72 6d 61 74 20 30 0a  er_old_format 0.
2480: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e  #endif../*.** En
2490: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63  able reference c
24a0: 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 68 65  ount tracking he
24b0: 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  re:.*/.#ifdef SQ
24c0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
24d0: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e  pager_refinfo_en
24e0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74  able = 0;.  stat
24f0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
2500: 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b  finfo(PgHdr *p){
2510: 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20  .    static int 
2520: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  cnt = 0;.    if(
2530: 20 21 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f   !pager_refinfo_
2540: 65 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  enable ) return;
2550: 0a 20 20 20 20 70 72 69 6e 74 66 28 0a 20 20 20  .    printf(.   
2560: 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64      "REFCNT: %4d
2570: 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65   addr=0x%08x nRe
2580: 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f=%d\n",.       
2590: 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47  p->pgno, (int)PG
25a0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
25b0: 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20  p->nRef.    );. 
25c0: 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53     cnt++;   /* S
25d0: 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20  omething to set 
25e0: 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20  a breakpoint on 
25f0: 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20  */.  }.# define 
2600: 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65  REFINFO(X)  page
2610: 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c  r_refinfo(X).#el
2620: 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49  se.# define REFI
2630: 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  NFO(X).#endif../
2640: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
2650: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
2660: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
2670: 65 73 63 72 69 70 74 6f 72 0a 2a 2f 0a 73 74 61  escriptor.*/.sta
2680: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
2690: 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
26a0: 2c 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  , OsFile *fd, u3
26b0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20  2 *pRes){.  u32 
26c0: 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  res;.  int rc;. 
26d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
26e0: 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69 7a  ad(fd, &res, siz
26f0: 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66 28  eof(res));.  if(
2700: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2710: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2720: 6c 46 6f 72 6d 61 74 3d 3d 53 51 4c 49 54 45 5f  lFormat==SQLITE_
2730: 4e 45 57 5f 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  NEW_JOURNAL_FORM
2740: 41 54 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  AT ){.    unsign
2750: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
2760: 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72     memcpy(ac, &r
2770: 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20  es, 4);.    res 
2780: 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20  = (ac[0]<<24) | 
2790: 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61  (ac[1]<<16) | (a
27a0: 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d  c[2]<<8) | ac[3]
27b0: 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
27c0: 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  res;.  return rc
27d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
27e0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
27f0: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
2800: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2810: 2e 20 20 57 72 69 74 69 6e 67 0a 2a 2a 20 69 73  .  Writing.** is
2820: 20 61 6c 77 61 79 73 20 64 6f 6e 65 20 75 73 69   always done usi
2830: 6e 67 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  ng the new journ
2840: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74  al format..*/.st
2850: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
2860: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
2870: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
2880: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
2890: 3b 0a 20 20 69 66 28 20 70 61 67 65 72 5f 6f 6c  ;.  if( pager_ol
28a0: 64 5f 66 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20  d_format ){.    
28b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f 73 57  return sqliteOsW
28c0: 72 69 74 65 28 66 64 2c 20 26 76 61 6c 2c 20 34  rite(fd, &val, 4
28d0: 29 3b 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20 3d  );.  }.  ac[0] =
28e0: 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66   (val>>24) & 0xf
28f0: 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61  f;.  ac[1] = (va
2900: 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20  l>>16) & 0xff;. 
2910: 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38   ac[2] = (val>>8
2920: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33  ) & 0xff;.  ac[3
2930: 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a  ] = val & 0xff;.
2940: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 4f    return sqliteO
2950: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
2960: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  );.}.../*.** Con
2970: 76 65 72 74 20 74 68 65 20 62 69 74 73 20 69 6e  vert the bits in
2980: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72   the pPager->err
2990: 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70  Mask into an app
29a0: 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72  roprate.** retur
29b0: 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  n code..*/.stati
29c0: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63  c int pager_errc
29d0: 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
29e0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
29f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2a00: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
2a10: 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b  & PAGER_ERR_LOCK
2a20: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
2a30: 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66  E_PROTOCOL;.  if
2a40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
2a50: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49  k & PAGER_ERR_DI
2a60: 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  SK )    rc = SQL
2a70: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28  ITE_IOERR;.  if(
2a80: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2a90: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   & PAGER_ERR_FUL
2aa0: 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  L )    rc = SQLI
2ab0: 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70  TE_FULL;.  if( p
2ac0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
2ad0: 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29   PAGER_ERR_MEM )
2ae0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2af0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50  _NOMEM;.  if( pP
2b00: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
2b10: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
2b20: 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
2b30: 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72  CORRUPT;.  retur
2b40: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2b50: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70  dd or remove a p
2b60: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  age from the lis
2b70: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74  t of all pages t
2b80: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a  hat are in the.*
2b90: 2a 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  * checkpoint jou
2ba0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
2bb0: 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65  Pager keeps a se
2bc0: 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70  parate list of p
2bd0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75  ages that are cu
2be0: 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68  rrently in.** th
2bf0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
2c00: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
2c10: 73 20 74 68 65 20 73 71 6c 69 74 65 70 61 67 65  s the sqlitepage
2c20: 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 29 0a  r_ckpt_commit().
2c30: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
2c40: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
2c50: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
2c60: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
2c70: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
2c80: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
2c90: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
2ca0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
2cb0: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
2cc0: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
2cd0: 63 6b 70 74 5f 6c 69 73 74 28 50 67 48 64 72 20  ckpt_list(PgHdr 
2ce0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
2cf0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2d00: 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
2d10: 3e 69 6e 43 6b 70 74 20 29 20 72 65 74 75 72 6e  >inCkpt ) return
2d20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
2d30: 3e 70 50 72 65 76 43 6b 70 74 3d 3d 30 20 26 26  >pPrevCkpt==0 &&
2d40: 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3d   pPg->pNextCkpt=
2d50: 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72  =0 );.  pPg->pPr
2d60: 65 76 43 6b 70 74 20 3d 20 30 3b 0a 20 20 69 66  evCkpt = 0;.  if
2d70: 28 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20  ( pPager->pCkpt 
2d80: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
2d90: 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20  Ckpt->pPrevCkpt 
2da0: 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
2db0: 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 70 50  ->pNextCkpt = pP
2dc0: 61 67 65 72 2d 3e 70 43 6b 70 74 3b 0a 20 20 70  ager->pCkpt;.  p
2dd0: 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20 70  Pager->pCkpt = p
2de0: 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70  Pg;.  pPg->inCkp
2df0: 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20  t = 1;.}.static 
2e00: 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65  void page_remove
2e10: 5f 66 72 6f 6d 5f 63 6b 70 74 5f 6c 69 73 74 28  _from_ckpt_list(
2e20: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2e30: 66 28 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20  f( !pPg->inCkpt 
2e40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2e50: 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 29  pPg->pPrevCkpt )
2e60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2e70: 67 2d 3e 70 50 72 65 76 43 6b 70 74 2d 3e 70 4e  g->pPrevCkpt->pN
2e80: 65 78 74 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a  extCkpt==pPg );.
2e90: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 43 6b      pPg->pPrevCk
2ea0: 70 74 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20  pt->pNextCkpt = 
2eb0: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a  pPg->pNextCkpt;.
2ec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2ed0: 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
2ee0: 2d 3e 70 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a  ->pCkpt==pPg );.
2ef0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
2f00: 3e 70 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e  >pCkpt = pPg->pN
2f10: 65 78 74 43 6b 70 74 3b 0a 20 20 7d 0a 20 20 69  extCkpt;.  }.  i
2f20: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70  f( pPg->pNextCkp
2f30: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
2f40: 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 2d   pPg->pNextCkpt-
2f50: 3e 70 50 72 65 76 43 6b 70 74 3d 3d 70 50 67 20  >pPrevCkpt==pPg 
2f60: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
2f70: 74 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70 74  tCkpt->pPrevCkpt
2f80: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70   = pPg->pPrevCkp
2f90: 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  t;.  }.  pPg->pN
2fa0: 65 78 74 43 6b 70 74 20 3d 20 30 3b 0a 20 20 70  extCkpt = 0;.  p
2fb0: 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20  Pg->pPrevCkpt = 
2fc0: 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74  0;.  pPg->inCkpt
2fd0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   = 0;.}../*.** F
2fe0: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
2ff0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
3000: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
3010: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
3020: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3030: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
3040: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
3050: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
3060: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
3070: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
3080: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  o){.  PgHdr *p =
3090: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
30a0: 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d  ager_hash(pgno)]
30b0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
30c0: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
30d0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
30e0: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
30f0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
3100: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
3110: 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ase and clear th
3120: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
3130: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3140: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
3150: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
3160: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
3170: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
3180: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
3190: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
31a0: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
31b0: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
31c0: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
31d0: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
31e0: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
31f0: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
3200: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
3210: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
3220: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
3230: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
3240: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Pg, *pNext;.  fo
3250: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
3260: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
3270: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
3280: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
3290: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
32a0: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
32b0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
32c0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
32d0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
32e0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
32f0: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
3300: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61   0;.  memset(pPa
3310: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
3320: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
3330: 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ash));.  pPager-
3340: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  >nPage = 0;.  if
3350: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
3360: 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  =SQLITE_WRITELOC
3370: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 70  K ){.    sqlitep
3380: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
3390: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
33a0: 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  iteOsUnlock(&pPa
33b0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67  ger->fd);.  pPag
33c0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
33d0: 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  TE_UNLOCK;.  pPa
33e0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
33f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
3400: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
3410: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
3420: 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  pen==0 );.}../*.
3430: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
3440: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
3450: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
3460: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
3470: 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69  pen and.** a wri
3480: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
3490: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
34a0: 6f 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 20  outine releases 
34b0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
34c0: 77 72 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61  write lock and a
34d0: 63 71 75 69 72 65 73 20 61 20 72 65 61 64 20 6c  cquires a read l
34e0: 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65  ock in its place
34f0: 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  .  The journal f
3500: 69 6c 65 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65  ile.** is delete
3510: 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2f  d and closed..*/
3520: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
3530: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61  r_unwritelock(Pa
3540: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
3550: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
3560: 2a 70 50 67 3b 0a 20 20 69 66 28 20 70 50 61 67  *pPg;.  if( pPag
3570: 65 72 2d 3e 73 74 61 74 65 3c 53 51 4c 49 54 45  er->state<SQLITE
3580: 5f 57 52 49 54 45 4c 4f 43 4b 20 29 20 72 65 74  _WRITELOCK ) ret
3590: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
35a0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70   sqlitepager_ckp
35b0: 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
35c0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
35d0: 63 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  ckptOpen ){.    
35e0: 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 70  sqliteOsClose(&p
35f0: 50 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20  Pager->cpfd);.  
3600: 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70    pPager->ckptOp
3610: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  en = 0;.  }.  if
3620: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
3630: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
3640: 69 74 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  iteOsClose(&pPag
3650: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50  er->jfd);.    pP
3660: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
3670: 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  n = 0;.    sqlit
3680: 65 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  eOsDelete(pPager
3690: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
36a0: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
36b0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
36c0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
36d0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
36e0: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
36f0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
3700: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
3710: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
3720: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
3730: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
3740: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
3750: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
3760: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
3770: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
3780: 72 74 79 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  rtyFile==0 || pP
3790: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
37a0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ==0 );.  }.  rc 
37b0: 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f  = sqliteOsReadLo
37c0: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
37d0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
37e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
37f0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
3800: 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d  TE_READLOCK;.  }
3810: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
3820: 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
3830: 6e 20 69 66 20 61 20 70 72 6f 63 65 73 73 20 64  n if a process d
3840: 6f 65 73 20 61 20 42 45 47 49 4e 2c 20 74 68 65  oes a BEGIN, the
3850: 6e 20 66 6f 72 6b 73 20 61 6e 64 20 74 68 65 0a  n forks and the.
3860: 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 72 6f      ** child pro
3870: 63 65 73 73 20 64 6f 65 73 20 74 68 65 20 43 4f  cess does the CO
3880: 4d 4d 49 54 2e 20 20 42 65 63 61 75 73 65 20 6f  MMIT.  Because o
3890: 66 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20  f the semantics 
38a0: 6f 66 20 75 6e 69 78 0a 20 20 20 20 2a 2a 20 66  of unix.    ** f
38b0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 74 68 65  ile locking, the
38c0: 20 75 6e 6c 6f 63 6b 20 77 69 6c 6c 20 66 61 69   unlock will fai
38d0: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  l..    */.    pP
38e0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
38f0: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d  LITE_UNLOCK;.  }
3900: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3910: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
3920: 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74  ngle page from t
3930: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
3940: 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64  opened on file d
3950: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64  escriptor.** jfd
3960: 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73  .  Playback this
3970: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   one page..*/.st
3980: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
3990: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
39a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
39b0: 4f 73 46 69 6c 65 20 2a 6a 66 64 29 7b 0a 20 20  OsFile *jfd){.  
39c0: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
39d0: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
39e0: 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
39f0: 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
3a00: 63 68 65 20 2a 2f 0a 20 20 50 61 67 65 52 65 63  che */.  PageRec
3a10: 6f 72 64 20 70 67 52 65 63 3b 0a 0a 20 20 72 63  ord pgRec;..  rc
3a20: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
3a30: 61 67 65 72 2c 20 6a 66 64 2c 20 26 70 67 52 65  ager, jfd, &pgRe
3a40: 63 2e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72  c.pgno);.  if( r
3a50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
3a60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
3a70: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 6a 66   sqliteOsRead(jf
3a80: 64 2c 20 26 70 67 52 65 63 2e 61 44 61 74 61 2c  d, &pgRec.aData,
3a90: 20 73 69 7a 65 6f 66 28 70 67 52 65 63 2e 61 44   sizeof(pgRec.aD
3aa0: 61 74 61 29 29 3b 0a 20 20 69 66 28 20 72 63 21  ata));.  if( rc!
3ab0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
3ac0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 53 61  urn rc;..  /* Sa
3ad0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
3ae0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   the page */.  i
3af0: 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3e 70 50  f( pgRec.pgno>pP
3b00: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
3b10: 70 67 52 65 63 2e 70 67 6e 6f 3d 3d 30 20 29 20  pgRec.pgno==0 ) 
3b20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
3b30: 52 52 55 50 54 3b 0a 0a 20 20 2f 2a 20 50 6c 61  RRUPT;..  /* Pla
3b40: 79 62 61 63 6b 20 74 68 65 20 70 61 67 65 2e 20  yback the page. 
3b50: 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d   Update the in-m
3b60: 65 6d 6f 72 79 20 63 6f 70 79 20 6f 66 20 74 68  emory copy of th
3b70: 65 20 70 61 67 65 0a 20 20 2a 2a 20 61 74 20 74  e page.  ** at t
3b80: 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 69 66  he same time, if
3b90: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 20   there is one.. 
3ba0: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
3bb0: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
3bc0: 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20   pgRec.pgno);.  
3bd0: 69 66 28 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50  if( pPg==0 || pP
3be0: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
3bf0: 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22 50 4c  {.    TRACE2("PL
3c00: 41 59 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 67  AYBACK %d\n", pg
3c10: 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 73  Rec.pgno);.    s
3c20: 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61  qliteOsSeek(&pPa
3c30: 67 65 72 2d 3e 66 64 2c 20 28 70 67 52 65 63 2e  ger->fd, (pgRec.
3c40: 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53  pgno-1)*(off_t)S
3c50: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
3c60: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
3c70: 65 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  eOsWrite(&pPager
3c80: 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61 44 61 74  ->fd, pgRec.aDat
3c90: 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  a, SQLITE_PAGE_S
3ca0: 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  IZE);.  }.  if( 
3cb0: 70 50 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  pPg ){.    memcp
3cc0: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
3cd0: 70 50 67 29 2c 20 70 67 52 65 63 2e 61 44 61 74  pPg), pgRec.aDat
3ce0: 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  a, SQLITE_PAGE_S
3cf0: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  IZE);.    memset
3d00: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
3d10: 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
3d20: 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 70 50  >nExtra);.    pP
3d30: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
3d40: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
3d50: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
3d60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
3d70: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
3d80: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
3d90: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
3da0: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
3db0: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
3dc0: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
3dd0: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
3de0: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
3df0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
3e00: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
3e10: 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 69  :  There is an i
3e20: 6e 69 74 69 61 6c 0a 2a 2a 20 66 69 6c 65 2d 74  nitial.** file-t
3e30: 79 70 65 20 73 74 72 69 6e 67 20 66 6f 72 20 73  ype string for s
3e40: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 2e 20  anity checking. 
3e50: 20 54 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   Then there is a
3e60: 20 73 69 6e 67 6c 65 0a 2a 2a 20 50 67 6e 6f 20   single.** Pgno 
3e70: 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20  number which is 
3e80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
3e90: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
3ea0: 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 68  ase before.** ch
3eb0: 61 6e 67 65 73 20 77 65 72 65 20 6d 61 64 65 2e  anges were made.
3ec0: 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69    The database i
3ed0: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 74  s truncated to t
3ee0: 68 69 73 20 73 69 7a 65 2e 0a 2a 2a 20 4e 65 78  his size..** Nex
3ef0: 74 20 63 6f 6d 65 20 7a 65 72 6f 20 6f 72 20 6d  t come zero or m
3f00: 6f 72 65 20 70 61 67 65 20 72 65 63 6f 72 64 73  ore page records
3f10: 20 77 68 65 72 65 20 65 61 63 68 20 70 61 67 65   where each page
3f20: 20 72 65 63 6f 72 64 0a 2a 2a 20 63 6f 6e 73 69   record.** consi
3f30: 73 74 73 20 6f 66 20 61 20 50 67 6e 6f 20 61 6e  sts of a Pgno an
3f40: 64 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  d SQLITE_PAGE_SI
3f50: 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ZE bytes of data
3f60: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 50 61  .  See.** the Pa
3f70: 67 65 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  geRecord structu
3f80: 72 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  re for details..
3f90: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
3fa0: 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
3fb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
3fc0: 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
3fd0: 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
3fe0: 65 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64  e (as determined
3ff0: 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74   by looking at t
4000: 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 0a  he magic number.
4010: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
4020: 69 6e 67 29 20 74 68 65 6e 20 74 68 69 73 20 72  ing) then this r
4030: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
4040: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2e 0a  QLITE_PROTOCOL..
4050: 2a 2a 20 49 66 20 61 6e 79 20 6f 74 68 65 72 20  ** If any other 
4060: 65 72 72 6f 72 73 20 6f 63 63 75 72 20 64 75 72  errors occur dur
4070: 69 6e 67 20 70 6c 61 79 62 61 63 6b 2c 20 74 68  ing playback, th
4080: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 0a  e database will.
4090: 2a 2a 20 6c 69 6b 65 6c 79 20 62 65 20 63 6f 72  ** likely be cor
40a0: 72 75 70 74 65 64 2c 20 73 6f 20 74 68 65 20 50  rupted, so the P
40b0: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
40c0: 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 0a 2a   bit is set in.*
40d0: 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
40e0: 6b 20 61 6e 64 20 53 51 4c 49 54 45 5f 43 4f 52  k and SQLITE_COR
40f0: 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
4100: 2e 20 20 49 66 20 69 74 20 61 6c 6c 0a 2a 2a 20  .  If it all.** 
4110: 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74 68 69 73  works, then this
4120: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4130: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
4140: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
4150: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
4160: 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74  pPager){.  off_t
4170: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
4180: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4190: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
41a0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
41b0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
41c0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
41d0: 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
41e0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
41f0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
4200: 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
4210: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
4220: 61 67 69 63 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  agic[sizeof(aJou
4230: 72 6e 61 6c 4d 61 67 69 63 29 5d 3b 0a 20 20 69  rnalMagic)];.  i
4240: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 46 69 67  nt rc;..  /* Fig
4250: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
4260: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
4270: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
4280: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
4290: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
42a0: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
42b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
42c0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
42d0: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
42e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
42f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 46 69   rc = sqliteOsFi
4300: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
4310: 6a 66 64 2c 20 26 6e 52 65 63 29 3b 0a 20 20 69  jfd, &nRec);.  i
4320: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4330: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
4340: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
4350: 20 69 66 28 20 6e 52 65 63 20 3c 20 73 69 7a 65   if( nRec < size
4360: 6f 66 28 61 4d 61 67 69 63 29 2b 73 69 7a 65 6f  of(aMagic)+sizeo
4370: 66 28 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 67  f(Pgno) ){.    g
4380: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
4390: 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28  ;.  }.  nRec = (
43a0: 6e 52 65 63 20 2d 20 28 73 69 7a 65 6f 66 28 61  nRec - (sizeof(a
43b0: 4d 61 67 69 63 29 2b 73 69 7a 65 6f 66 28 50 67  Magic)+sizeof(Pg
43c0: 6e 6f 29 29 29 20 2f 20 73 69 7a 65 6f 66 28 50  no))) / sizeof(P
43d0: 61 67 65 52 65 63 6f 72 64 29 3b 0a 0a 20 20 2f  ageRecord);..  /
43e0: 2a 20 52 65 61 64 20 74 68 65 20 62 65 67 69 6e  * Read the begin
43f0: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
4400: 6e 61 6c 20 61 6e 64 20 74 72 75 6e 63 61 74 65  nal and truncate
4410: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
4420: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
4430: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
4440: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
4450: 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50 61  qliteOsRead(&pPa
4460: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
4470: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
4480: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
4490: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
44a0: 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43   = SQLITE_PROTOC
44b0: 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  OL;.    goto end
44c0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
44d0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
44e0: 69 63 2c 20 61 4f 6c 64 4a 6f 75 72 6e 61 6c 4d  ic, aOldJournalM
44f0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
4500: 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  gic))==0 ){.    
4510: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 46  pPager->journalF
4520: 6f 72 6d 61 74 20 3d 20 53 51 4c 49 54 45 5f 4f  ormat = SQLITE_O
4530: 4c 44 5f 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  LD_JOURNAL_FORMA
4540: 54 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d  T;.  }else if( m
4550: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
4560: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
4570: 65 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20  eof(aMagic))==0 
4580: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
4590: 6f 75 72 6e 61 6c 46 6f 72 6d 61 74 20 3d 20 53  ournalFormat = S
45a0: 51 4c 49 54 45 5f 4e 45 57 5f 4a 4f 55 52 4e 41  QLITE_NEW_JOURNA
45b0: 4c 5f 46 4f 52 4d 41 54 3b 0a 20 20 7d 65 6c 73  L_FORMAT;.  }els
45c0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
45d0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20  TE_PROTOCOL;.   
45e0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
45f0: 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72  ck;.  }.  rc = r
4600: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
4610: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
4620: 26 6d 78 50 67 29 3b 0a 20 20 69 66 28 20 72 63  &mxPg);.  if( rc
4630: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
4640: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
4650: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  back;.  }.  rc =
4660: 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74   sqliteOsTruncat
4670: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  e(&pPager->fd, S
4680: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
4690: 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a 20 20  (off_t)mxPg);.  
46a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
46b0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
46c0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
46d0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
46e0: 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20 2f 2a   = mxPg;.  .  /*
46f0: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
4700: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
4710: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
4720: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
4730: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
4740: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
4750: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63  =0; i--){.    rc
4760: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
4770: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
4780: 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  r, &pPager->jfd)
4790: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
47a0: 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
47b0: 0a 20 20 7d 0a 0a 0a 65 6e 64 5f 70 6c 61 79 62  .  }...end_playb
47c0: 61 63 6b 3a 0a 23 69 66 20 21 64 65 66 69 6e 65  ack:.#if !define
47d0: 64 28 4e 44 45 42 55 47 29 20 26 26 20 64 65 66  d(NDEBUG) && def
47e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
47f0: 29 0a 20 20 2f 2a 20 46 6f 72 20 70 61 67 65 73  ).  /* For pages
4800: 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 72   that were never
4810: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
4820: 65 20 6a 6f 75 72 6e 61 6c 2c 20 72 65 73 74 6f  e journal, resto
4830: 72 65 20 74 68 65 0a 20 20 2a 2a 20 6d 65 6d 6f  re the.  ** memo
4840: 72 79 20 63 6f 70 79 20 66 72 6f 6d 20 74 68 65  ry copy from the
4850: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
4860: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20  se file..  **.  
4870: 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 64 65 20  ** This is code 
4880: 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
4890: 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 74  esting only.  It
48a0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
48b0: 0a 20 20 2a 2a 20 63 6f 6d 70 65 6e 73 61 74 65  .  ** compensate
48c0: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 4f   for the sqliteO
48d0: 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  sTruncate() call
48e0: 20 69 6e 73 69 64 65 20 0a 20 20 2a 2a 20 73 71   inside .  ** sq
48f0: 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61  litepager_rollba
4900: 63 6b 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ck()..  */.  if(
4910: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4920: 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
4930: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
4940: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
4950: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
4960: 6c 6c 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ll){.      if( (
4970: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
4980: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
4990: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ize ){.        s
49a0: 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61  qliteOsSeek(&pPa
49b0: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
49c0: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
49d0: 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b  )(pPg->pgno-1));
49e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
49f0: 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50 61 67  liteOsRead(&pPag
4a00: 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
4a10: 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49  _DATA(pPg), SQLI
4a20: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
4a30: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
4a40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
4a50: 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
4a60: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
4a70: 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45  (pPg), 0, SQLITE
4a80: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
4a90: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
4aa0: 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
4ab0: 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
4ac0: 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  ->nExtra);.     
4ad0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
4ae0: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64   0;.      pPg->d
4af0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irty = 0;.    }.
4b00: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
4b10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4b20: 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72  {.    pager_unwr
4b30: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
4b40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
4b50: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
4b60: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
4b70: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
4b80: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
4b90: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
4ba0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
4bb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
4bd0: 61 63 6b 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ack the checkpoi
4be0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
4bf0: 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
4c00: 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
4c10: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
4c20: 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
4c30: 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
4c40: 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
4c50: 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
4c60: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
4c70: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4c80: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
4c90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
4ca0: 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 73 74  checkpoint is st
4cb0: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
4cc0: 63 6b 70 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  ckptSize, not in
4cd0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
4ce0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
4cf0: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
4d00: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
4d10: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
4d20: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
4d30: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
4d40: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
4d50: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
4d60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
4d70: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
4d80: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
4d90: 73 65 74 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  set pPager->ckpt
4da0: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
4db0: 20 69 6e 74 20 70 61 67 65 72 5f 63 6b 70 74 5f   int pager_ckpt_
4dc0: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
4dd0: 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74  pPager){.  off_t
4de0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
4df0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4e00: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
4e10: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
4e20: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
4e30: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
4e40: 72 63 3b 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61  rc;..  /* Trunca
4e50: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
4e60: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
4e70: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a  inal size..  */.
4e80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 54    rc = sqliteOsT
4e90: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
4ea0: 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  >fd, SQLITE_PAGE
4eb0: 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61  _SIZE*(off_t)pPa
4ec0: 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 29 3b 0a  ger->ckptSize);.
4ed0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
4ee0: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53   = pPager->ckptS
4ef0: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ize;..  /* Figur
4f00: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
4f10: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
4f20: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
4f30: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
4f40: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70  ert( pPager->ckp
4f50: 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
4f60: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
4f70: 0a 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28  .  sqliteOsSeek(
4f80: 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30  &pPager->cpfd, 0
4f90: 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67  );.  nRec = pPag
4fa0: 65 72 2d 3e 63 6b 70 74 4e 52 65 63 3b 0a 20 20  er->ckptNRec;.  
4fb0: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
4fc0: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
4fd0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
4fe0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
4ff0: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
5000: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
5010: 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 5f 6f  */.  if( pager_o
5020: 6c 64 5f 66 6f 72 6d 61 74 20 29 7b 0a 20 20 20  ld_format ){.   
5030: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5040: 46 6f 72 6d 61 74 20 3d 20 53 51 4c 49 54 45 5f  Format = SQLITE_
5050: 4f 4c 44 5f 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  OLD_JOURNAL_FORM
5060: 41 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AT;.  }else{.   
5070: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5080: 46 6f 72 6d 61 74 20 3d 20 53 51 4c 49 54 45 5f  Format = SQLITE_
5090: 4e 45 57 5f 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d  NEW_JOURNAL_FORM
50a0: 41 54 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  AT;.  }.  for(i=
50b0: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nRec-1; i>=0; i-
50c0: 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  -){.    rc = pag
50d0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
50e0: 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
50f0: 61 67 65 72 2d 3e 63 70 66 64 29 3b 0a 20 20 20  ager->cpfd);.   
5100: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5110: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 63 6b  OK ) goto end_ck
5120: 70 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  pt_playback;.  }
5130: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
5140: 74 20 68 6f 77 20 6d 61 6e 79 20 70 61 67 65 73  t how many pages
5150: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 70 69   need to be copi
5160: 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 74 72  ed out of the tr
5170: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6a  ansaction.  ** j
5180: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 72  ournal..  */.  r
5190: 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 65 65 6b  c = sqliteOsSeek
51a0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
51b0: 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65  Pager->ckptJSize
51c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
51d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
51e0: 74 6f 20 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79  to end_ckpt_play
51f0: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  back;.  }.  rc =
5200: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
5210: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
5220: 26 6e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  &nRec);.  if( rc
5230: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5240: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74     goto end_ckpt
5250: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
5260: 20 6e 52 65 63 20 3d 20 28 6e 52 65 63 20 2d 20   nRec = (nRec - 
5270: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a  pPager->ckptJSiz
5280: 65 29 2f 73 69 7a 65 6f 66 28 50 61 67 65 52 65  e)/sizeof(PageRe
5290: 63 6f 72 64 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  cord);.  for(i=n
52a0: 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Rec-1; i>=0; i--
52b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
52c0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
52d0: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
52e0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 69  ger->jfd);.    i
52f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5300: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 63 6b 70 74   ) goto end_ckpt
5310: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
5320: 20 0a 0a 65 6e 64 5f 63 6b 70 74 5f 70 6c 61 79   ..end_ckpt_play
5330: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d  back:.  if( rc!=
5340: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5350: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
5360: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f   |= PAGER_ERR_CO
5370: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
5380: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
5390: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
53a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
53b0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
53c0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
53d0: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
53e0: 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  allowed..**.** T
53f0: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
5400: 72 20 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74  r is the absolut
5410: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d  e value of the m
5420: 78 50 61 67 65 20 70 61 72 61 6d 65 74 65 72 2e  xPage parameter.
5430: 0a 2a 2a 20 49 66 20 6d 78 50 61 67 65 20 69 73  .** If mxPage is
5440: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 6e   negative, the n
5450: 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c  oSync flag is al
5460: 73 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20  so set.  noSync 
5470: 62 79 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c  bypasses.** call
5480: 73 20 74 6f 20 73 71 6c 69 74 65 4f 73 53 79 6e  s to sqliteOsSyn
5490: 63 28 29 2e 20 20 54 68 65 20 70 61 67 65 72 20  c().  The pager 
54a0: 72 75 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72  runs much faster
54b0: 20 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c   with noSync on,
54c0: 0a 2a 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f  .** but if the o
54d0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
54e0: 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
54f0: 20 69 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f   is an abrupt po
5500: 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c  wer .** failure,
5510: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5520: 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  le might be left
5530: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
5540: 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70  ent and.** unrep
5550: 61 69 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20  airable state.  
5560: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 70  .*/.void sqlitep
5570: 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69  ager_set_cachesi
5580: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
5590: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
55a0: 20 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20 29   if( mxPage>=0 )
55b0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
55c0: 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
55d0: 65 6d 70 46 69 6c 65 3b 0a 20 20 7d 65 6c 73 65  empFile;.  }else
55e0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
55f0: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78  Sync = 1;.    mx
5600: 50 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a  Page = -mxPage;.
5610: 20 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67 65    }.  if( mxPage
5620: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
5630: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
5640: 67 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge;.  }.}../*.**
5650: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
5660: 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  y file.  Write t
5670: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
5680: 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a  ile into zName.*
5690: 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  * (zName must be
56a0: 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45   at least SQLITE
56b0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62  _TEMPNAME_SIZE b
56c0: 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69  ytes long.)  Wri
56d0: 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  te.** the file d
56e0: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
56f0: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
5700: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
5710: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
5720: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
5730: 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54  we fail..**.** T
5740: 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
5750: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
5760: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
5770: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  le when it is.**
5780: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
5790: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 70 61 67  ic int sqlitepag
57a0: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72  er_opentemp(char
57b0: 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20   *zFile, OsFile 
57c0: 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  *fd){.  int cnt 
57d0: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
57e0: 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a   do{.    cnt--;.
57f0: 20 20 20 20 73 71 6c 69 74 65 4f 73 54 65 6d 70      sqliteOsTemp
5800: 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b  FileName(zFile);
5810: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
5820: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
5830: 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20  zFile, fd, 1);. 
5840: 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26   }while( cnt>0 &
5850: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc!=SQLITE_OK 
5860: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5870: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
5880: 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65  a new page cache
5890: 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
58a0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63  er to the page c
58b0: 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72  ache in *ppPager
58c0: 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f  ..** The file to
58d0: 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20   be cached need 
58e0: 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20  not exist.  The 
58f0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b  file is not lock
5900: 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20  ed until.** the 
5910: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
5920: 6c 69 74 65 70 61 67 65 72 5f 67 65 74 28 29 20  litepager_get() 
5930: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
5940: 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
5950: 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
5960: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
5970: 71 6c 69 74 65 70 61 67 65 72 5f 75 6e 72 65 66  qlitepager_unref
5980: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ()..**.** If zFi
5990: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
59a0: 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
59b0: 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
59c0: 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
59d0: 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
59e0: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
59f0: 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77  hed.  The file w
5a00: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  ill be deleted.*
5a10: 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
5a20: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
5a30: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5a40: 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61  pager_open(.  Pa
5a50: 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
5a60: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
5a70: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
5a80: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
5a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
5aa0: 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
5ab0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
5ac0: 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
5ad0: 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20 20    int mxPage,   
5ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
5af0: 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  x number of in-m
5b00: 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
5b10: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
5b20: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
5b30: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
5b40: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
5b50: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
5b60: 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
5b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
5b80: 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f 6c 6c  UE to use a roll
5b90: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20  back journal on 
5ba0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  this file */.){.
5bb0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
5bc0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61  .  char *zFullPa
5bd0: 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 61  thname;.  int na
5be0: 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20  meLen;.  OsFile 
5bf0: 66 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fd;.  int rc;.  
5c00: 69 6e 74 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  int tempFile;.  
5c10: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
5c20: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
5c30: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
5c40: 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65  IZE];..  *ppPage
5c50: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  r = 0;.  if( sql
5c60: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
5c70: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
5c80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5c90: 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  }.  if( zFilenam
5ca0: 65 20 29 7b 0a 20 20 20 20 7a 46 75 6c 6c 50 61  e ){.    zFullPa
5cb0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 4f  thname = sqliteO
5cc0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
5cd0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ilename);.    rc
5ce0: 20 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52   = sqliteOsOpenR
5cf0: 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61  eadWrite(zFullPa
5d00: 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65  thname, &fd, &re
5d10: 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 74 65 6d  adOnly);.    tem
5d20: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pFile = 0;.  }el
5d30: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
5d40: 69 74 65 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  itepager_opentem
5d50: 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20  p(zTemp, &fd);. 
5d60: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
5d70: 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50  Temp;.    zFullP
5d80: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
5d90: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
5da0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 74  Filename);.    t
5db0: 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 7d  empFile = 1;.  }
5dc0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61  .  if( sqlite_ma
5dd0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20  lloc_failed ){. 
5de0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5df0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
5e00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5e10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
5e20: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
5e30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
5e40: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
5e50: 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74  }.  nameLen = st
5e60: 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rlen(zFullPathna
5e70: 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  me);.  pPager = 
5e80: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
5e90: 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20  zeof(*pPager) + 
5ea0: 6e 61 6d 65 4c 65 6e 2a 32 20 2b 20 33 30 20 29  nameLen*2 + 30 )
5eb0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d  ;.  if( pPager==
5ec0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f  0 ){.    sqliteO
5ed0: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
5ee0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
5ef0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
5f00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5f10: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 50  MEM;.  }.  SET_P
5f20: 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20 20  AGER(pPager);.  
5f30: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
5f40: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67  e = (char*)&pPag
5f50: 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  er[1];.  pPager-
5f60: 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
5f70: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
5f80: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72  ameLen+1];.  str
5f90: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
5fa0: 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  ename, zFullPath
5fb0: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
5fc0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
5fd0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
5fe0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
5ff0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
6000: 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d   strcpy(&pPager-
6010: 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65  >zJournal[nameLe
6020: 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b  n], "-journal");
6030: 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
6040: 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  fd;.  pPager->jo
6050: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
6060: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
6070: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
6080: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  ;.  pPager->ckpt
6090: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
60a0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20  er->ckptInUse = 
60b0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
60c0: 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
60d0: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
60e0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
60f0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
6100: 63 6b 70 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20  ckptJSize = 0;. 
6110: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
6120: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   0;.  pPager->mx
6130: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e 35 20  Page = mxPage>5 
6140: 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a 20  ? mxPage : 10;. 
6150: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
6160: 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a   SQLITE_UNLOCK;.
6170: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
6180: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
6190: 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
61a0: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
61b0: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
61c0: 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nly;.  pPager->n
61d0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
61e0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
61f0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
6200: 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
6210: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
6220: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
6230: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
6240: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  0;.  pPager->pLa
6250: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
6260: 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72  ->nExtra = nExtr
6270: 61 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  a;.  memset(pPag
6280: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
6290: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
62a0: 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72  sh));.  *ppPager
62b0: 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
62c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
62d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
62e0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
62f0: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
6300: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
6310: 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
6320: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
6330: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
6340: 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
6350: 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
6360: 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
6370: 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
6380: 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
6390: 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
63a0: 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
63b0: 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
63c0: 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
63d0: 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
63e0: 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
63f0: 65 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20  epager_close(). 
6400: 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73   .** Destructors
6410: 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64   are only called
6420: 20 62 79 20 73 71 6c 69 74 65 70 61 67 65 72 5f   by sqlitepager_
6430: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
6440: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 73 65 74   sqlitepager_set
6450: 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  _destructor(Page
6460: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
6470: 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 29 29  (*xDesc)(void*))
6480: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
6490: 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
64a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
64b0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
64c0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
64d0: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
64e0: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
64f0: 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Pager..*/.int sq
6500: 6c 69 74 65 70 61 67 65 72 5f 70 61 67 65 63 6f  litepager_pageco
6510: 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
6520: 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20  r){.  off_t n;. 
6530: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
6540: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
6550: 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b  er->dbSize>=0 ){
6560: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
6570: 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a  er->dbSize;.  }.
6580: 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69    if( sqliteOsFi
6590: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
65a0: 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f  fd, &n)!=SQLITE_
65b0: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
65c0: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
65d0: 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20  ER_ERR_DISK;.   
65e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
65f0: 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41 47   n /= SQLITE_PAG
6600: 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 70 50  E_SIZE;.  if( pP
6610: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c  ager->state!=SQL
6620: 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  ITE_UNLOCK ){.  
6630: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
6640: 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = n;.  }.  retu
6650: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
6660: 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
6670: 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
6680: 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
6690: 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
66a0: 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
66b0: 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
66c0: 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
66d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
66e0: 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
66f0: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
6700: 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
6710: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
6720: 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
6730: 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
6740: 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
6750: 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
6760: 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
6770: 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
6780: 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
6790: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
67a0: 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
67b0: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
67c0: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74  coredump..*/.int
67d0: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6c 6f   sqlitepager_clo
67e0: 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
67f0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
6800: 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63   *pNext;.  switc
6810: 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  h( pPager->state
6820: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
6830: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3a 20 7b  ITE_WRITELOCK: {
6840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67  .      sqlitepag
6850: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
6860: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
6870: 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  eOsUnlock(&pPage
6880: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
6890: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
68a0: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
68b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
68c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
68d0: 54 45 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a 20  TE_READLOCK: {. 
68e0: 20 20 20 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c       sqliteOsUnl
68f0: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
6900: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6910: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
6920: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
6930: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
6940: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6950: 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  }.  for(pPg=pPag
6960: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
6970: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  Pg=pNext){.    p
6980: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
6990: 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
69a0: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
69b0: 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26   sqliteOsClose(&
69c0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61  pPager->fd);.  a
69d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
69e0: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
69f0: 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
6a00: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
6a10: 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
6a20: 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
6a30: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
6a40: 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 4f  {.  **   sqliteO
6a50: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
6a60: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a  zFilename);.  **
6a70: 20 7d 0a 20 20 2a 2f 0a 20 20 43 4c 52 5f 50 41   }.  */.  CLR_PA
6a80: 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20 20 73  GER(pPager);.  s
6a90: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
6aa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6ab0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6ac0: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
6ad0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
6ae0: 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
6af0: 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 70 61  */.Pgno sqlitepa
6b00: 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76  ger_pagenumber(v
6b10: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
6b20: 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54  gHdr *p = DATA_T
6b30: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
6b40: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
6b50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
6b60: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
6b70: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
6b80: 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  age.  If the pag
6b90: 65 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  e is.** currentl
6ba0: 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
6bb0: 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65  t (the reference
6bc0: 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20   count is zero) 
6bd0: 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69  then.** remove i
6be0: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  t from the freel
6bf0: 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ist..*/.#define 
6c00: 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28  page_ref(P)   ((
6c10: 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67  P)->nRef==0?_pag
6c20: 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28  e_ref(P):(void)(
6c30: 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 73 74 61 74  P)->nRef++).stat
6c40: 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65  ic void _page_re
6c50: 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
6c60: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
6c70: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
6c80: 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
6c90: 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
6ca0: 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a  t.  Remove it. *
6cb0: 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70  /.    if( pPg==p
6cc0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
6cd0: 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
6ce0: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
6cf0: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
6d00: 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
6d10: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
6d20: 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
6d30: 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
6d40: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
6d50: 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  d = p;.    }.   
6d60: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
6d70: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
6d80: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
6d90: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
6da0: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  extFree;.    }el
6db0: 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
6dc0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
6dd0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
6de0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
6df0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
6e00: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
6e10: 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
6e20: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
6e30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6e40: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
6e50: 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
6e60: 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  evFree;.    }.  
6e70: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e    pPg->pPager->n
6e80: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67  Ref++;.  }.  pPg
6e90: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49  ->nRef++;.  REFI
6ea0: 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  NFO(pPg);.}../*.
6eb0: 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
6ec0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6ed0: 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68   for a page.  Th
6ee0: 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20  e input pointer 
6ef0: 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  is.** a referenc
6f00: 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61  e to the page da
6f10: 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ta..*/.int sqlit
6f20: 65 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20  epager_ref(void 
6f30: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
6f40: 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
6f50: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
6f60: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
6f70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6f80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
6f90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
6fa0: 20 74 68 65 6e 20 77 72 69 74 65 20 61 6c 6c 20   then write all 
6fb0: 66 72 65 65 20 64 69 72 74 79 20 70 61 67 65 73  free dirty pages
6fc0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6fd0: 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  .** file..**.** 
6fe0: 57 72 69 74 69 6e 67 20 61 6c 6c 20 66 72 65 65  Writing all free
6ff0: 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
7000: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 66 74  the database aft
7010: 65 72 20 74 68 65 20 73 79 6e 63 20 69 73 20 61  er the sync is a
7020: 0a 2a 2a 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73 20  .** non-obvious 
7030: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 66  optimization.  f
7040: 73 79 6e 63 28 29 20 69 73 20 61 6e 20 65 78 70  sync() is an exp
7050: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
7060: 20 73 6f 20 77 65 0a 2a 2a 20 77 61 6e 74 20 74   so we.** want t
7070: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 6e  o minimize the n
7080: 75 6d 62 65 72 20 6f 74 20 74 69 6d 65 73 20 69  umber ot times i
7090: 74 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 66 74  t is called. Aft
70a0: 65 72 20 61 6e 20 66 73 79 6e 63 28 29 20 63 61  er an fsync() ca
70b0: 6c 6c 2c 0a 2a 2a 20 77 65 20 61 72 65 20 66 72  ll,.** we are fr
70c0: 65 65 20 74 6f 20 77 72 69 74 65 20 64 69 72 74  ee to write dirt
70d0: 79 20 70 61 67 65 73 20 62 61 63 6b 20 74 6f 20  y pages back to 
70e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
70f0: 74 20 69 73 20 62 65 73 74 0a 2a 2a 20 74 6f 20  t is best.** to 
7100: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 77 72 69  go ahead and wri
7110: 74 65 20 61 73 20 6d 61 6e 79 20 64 69 72 74 79  te as many dirty
7120: 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69 62   pages as possib
7130: 6c 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 0a  le to minimize .
7140: 2a 2a 20 74 68 65 20 72 69 73 6b 20 6f 66 20 68  ** the risk of h
7150: 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 6e 6f 74  aving to do anot
7160: 68 65 72 20 66 73 79 6e 63 28 29 20 6c 61 74 65  her fsync() late
7170: 72 20 6f 6e 2e 20 20 57 72 69 74 69 6e 67 20 64  r on.  Writing d
7180: 69 72 74 79 0a 2a 2a 20 66 72 65 65 20 70 61 67  irty.** free pag
7190: 65 73 20 69 6e 20 74 68 69 73 20 77 61 79 20 77  es in this way w
71a0: 61 73 20 6f 62 73 65 72 76 65 64 20 74 6f 20 6d  as observed to m
71b0: 61 6b 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  ake database ope
71c0: 72 61 74 69 6f 6e 73 20 67 6f 0a 2a 2a 20 75 70  rations go.** up
71d0: 20 74 6f 20 31 30 20 74 69 6d 65 73 20 66 61 73   to 10 times fas
71e0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65  ter..**.** If we
71f0: 20 61 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20   are writing to 
7200: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
7210: 73 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  se, there is no 
7220: 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72 76 65  need to preserve
7230: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 72 69 74  .** the integrit
7240: 79 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y of the journal
7250: 20 66 69 6c 65 2c 20 73 6f 20 77 65 20 63 61 6e   file, so we can
7260: 20 73 61 76 65 20 74 69 6d 65 20 61 6e 64 20 73   save time and s
7270: 6b 69 70 20 74 68 65 0a 2a 2a 20 66 73 79 6e 63  kip the.** fsync
7280: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
7290: 74 20 73 79 6e 63 41 6c 6c 50 61 67 65 73 28 50  t syncAllPages(P
72a0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
72b0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
72c0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
72d0: 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
72e0: 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
72f0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
7300: 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
7310: 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
7320: 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
7330: 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
7340: 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
7350: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
7360: 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
7370: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
7380: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
7390: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
73a0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
73b0: 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
73c0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20  r->noSync );.   
73d0: 20 20 20 54 52 41 43 45 31 28 22 53 59 4e 43 5c     TRACE1("SYNC\
73e0: 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
73f0: 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50  sqliteOsSync(&pP
7400: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
7410: 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
7420: 74 75 72 6e 20 72 63 3b 0a 23 69 66 6e 64 65 66  turn rc;.#ifndef
7430: 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 72 63   NDEBUG.      rc
7440: 20 3d 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53   = sqliteOsFileS
7450: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
7460: 2c 20 26 70 50 61 67 65 72 2d 3e 73 79 6e 63 4a  , &pPager->syncJ
7470: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
7480: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
7490: 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  rc;.#endif.     
74a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
74b0: 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
74c0: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
74d0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
74e0: 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e    /* Erase the n
74f0: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f  eedSync flag fro
7500: 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20  m every page..  
7510: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67    */.    for(pPg
7520: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
7530: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
7540: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
7550: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
7560: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
7570: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
7580: 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
7590: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
75a0: 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
75b0: 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
75c0: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
75d0: 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
75e0: 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
75f0: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
7600: 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
7610: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
7620: 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
7630: 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
7640: 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f  /.  else{.    fo
7650: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7660: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
7670: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
7680: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
7690: 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
76a0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
76b0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
76c0: 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70  ynced==pPager->p
76d0: 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e  First );.  }.#en
76e0: 64 69 66 0a 20 20 0a 0a 0a 20 20 72 65 74 75 72  dif.  ...  retur
76f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
7700: 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
7710: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
7720: 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
7730: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
7740: 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
7750: 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
7760: 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
7770: 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
7780: 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
7790: 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
77a0: 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20  ** A _get works 
77b0: 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
77c0: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
77d0: 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
77e0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
77f0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
7800: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
7810: 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
7820: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
7830: 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
7840: 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
7850: 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
7860: 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
7870: 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
7880: 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
7890: 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
78a0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
78b0: 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
78c0: 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
78d0: 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
78e0: 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
78f0: 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
7900: 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
7910: 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
7920: 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
7930: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
7940: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
7950: 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
7960: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
7970: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
7980: 73 71 6c 69 74 65 70 61 67 65 72 5f 6c 6f 6f 6b  sqlitepager_look
7990: 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
79a0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
79b0: 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
79c0: 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
79d0: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
79e0: 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
79f0: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
7a00: 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
7a10: 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
7a20: 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
7a30: 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
7a40: 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
7a50: 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
7a60: 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
7a70: 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
7a80: 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
7a90: 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
7aa0: 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
7ab0: 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
7ac0: 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
7ad0: 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
7ae0: 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
7af0: 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
7b00: 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
7b10: 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
7b20: 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
7b30: 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
7b40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70  ..*/.int sqlitep
7b50: 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a  ager_get(Pager *
7b60: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
7b70: 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65  o, void **ppPage
7b80: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
7b90: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
7ba0: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
7bb0: 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
7bc0: 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
7bd0: 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
7be0: 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
7bf0: 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
7c00: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7c10: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
7c20: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
7c30: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
7c40: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
7c50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
7c60: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
7c70: 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
7c80: 68 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c  hen get a read l
7c90: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
7ca0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
7cb0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
7cc0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
7cd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52 65   rc = sqliteOsRe
7ce0: 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  adLock(&pPager->
7cf0: 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fd);.    if( rc!
7d00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7d10: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
7d20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
7d30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
7d40: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
7d50: 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20  TE_READLOCK;..  
7d60: 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
7d70: 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
7d80: 72 79 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61  ry to play it ba
7d90: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ck..    */.    i
7da0: 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
7db0: 75 72 6e 61 6c 20 26 26 20 73 71 6c 69 74 65 4f  urnal && sqliteO
7dc0: 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67  sFileExists(pPag
7dd0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b  er->zJournal) ){
7de0: 0a 20 20 20 20 20 20 20 69 6e 74 20 72 63 2c 20  .       int rc, 
7df0: 64 75 6d 6d 79 3b 0a 0a 20 20 20 20 20 20 20 2f  dummy;..       /
7e00: 2a 20 47 65 74 20 61 20 77 72 69 74 65 20 6c 6f  * Get a write lo
7e10: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7e20: 73 65 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  se.       */.   
7e30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
7e40: 73 57 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67  sWriteLock(&pPag
7e50: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
7e60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7e70: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69 66  K ){.         if
7e80: 28 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b  ( sqliteOsUnlock
7e90: 28 26 70 50 61 67 65 72 2d 3e 66 64 29 21 3d 53  (&pPager->fd)!=S
7ea0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7eb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73         /* This s
7ec0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
7ed0: 65 6e 21 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  en! */.         
7ee0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
7ef0: 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  TERNAL;.        
7f00: 20 7d 0a 20 20 20 20 20 20 20 20 20 2a 70 70 50   }.         *ppP
7f10: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
7f20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7f30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
7f40: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
7f50: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 0a  ITE_WRITELOCK;..
7f60: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
7f70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 65  he journal for e
7f80: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2e  xclusive access.
7f90: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
7fa0: 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a  BUSY if.       *
7fb0: 2a 20 77 65 20 63 61 6e 6e 6f 74 20 67 65 74 20  * we cannot get 
7fc0: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
7fd0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
7fe0: 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a  file. .       **
7ff0: 0a 20 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  .       ** Even 
8000: 74 68 6f 75 67 68 20 77 65 20 77 69 6c 6c 20 6f  though we will o
8010: 6e 6c 79 20 62 65 20 72 65 61 64 69 6e 67 20 66  nly be reading f
8020: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
8030: 20 6e 6f 74 20 77 72 69 74 69 6e 67 2c 0a 20 20   not writing,.  
8040: 20 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20       ** we have 
8050: 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
8060: 6e 61 6c 20 66 6f 72 20 77 72 69 74 69 6e 67 20  nal for writing 
8070: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6f 62 74 61  in order to obta
8080: 69 6e 20 61 6e 0a 20 20 20 20 20 20 20 2a 2a 20  in an.       ** 
8090: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
80a0: 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f   lock..       */
80b0: 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .       rc = sql
80c0: 69 74 65 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  iteOsOpenReadWri
80d0: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
80e0: 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
80f0: 64 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  d, &dummy);.    
8100: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8110: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8120: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 55 6e   rc = sqliteOsUn
8130: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
8140: 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65  );.         asse
8150: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
8160: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 2a 70  K );.         *p
8170: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
8180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8190: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d  E_BUSY;.       }
81a0: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
81b0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
81c0: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
81d0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
81e0: 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50   0;..       /* P
81f0: 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
8200: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
8210: 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
8220: 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20  se write.       
8230: 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
8240: 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
8250: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ock..       */. 
8260: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
8270: 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
8280: 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
8290: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
82a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
82b0: 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  c;.       }.    
82c0: 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  }.    pPg = 0;. 
82d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
82e0: 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69  earch for page i
82f0: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70  n cache */.    p
8300: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
8310: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
8320: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
8330: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
8340: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
8350: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67  s not in the pag
8360: 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
8370: 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65  int h;.    pPage
8380: 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20  r->nMiss++;.    
8390: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
83a0: 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
83b0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72   || pPager->pFir
83c0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  st==0 ){.      /
83d0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
83e0: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  age */.      pPg
83f0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
8400: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29  aw( sizeof(*pPg)
8410: 20 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53   + SQLITE_PAGE_S
8420: 49 5a 45 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  IZE + pPager->nE
8430: 78 74 72 61 20 29 3b 0a 20 20 20 20 20 20 69 66  xtra );.      if
8440: 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
8450: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
8460: 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75  .        pager_u
8470: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
8480: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
8490: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
84a0: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20  AGER_ERR_MEM;.  
84b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
84c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
84d0: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
84e0: 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pPg, 0, sizeof(*
84f0: 70 50 67 29 29 3b 0a 20 20 20 20 20 20 70 50 67  pPg));.      pPg
8500: 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
8510: 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  r;.      pPg->pN
8520: 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
8530: 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28  >pAll;.      if(
8540: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
8550: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
8560: 3e 70 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20  >pAll->pPrevAll 
8570: 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 7d 0a 20  = pPg;.      }. 
8580: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 41       pPg->pPrevA
8590: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ll = 0;.      pP
85a0: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
85b0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
85c0: 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nPage++;.    }el
85d0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  se{.      /* Fin
85e0: 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
85f0: 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
8600: 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
8610: 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  does not.      *
8620: 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
8630: 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
8640: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
8650: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67      */.      pPg
8660: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
8670: 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20  tSynced;..      
8680: 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
8690: 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
86a0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
86b0: 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
86c0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
86d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
86e0: 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
86f0: 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
8700: 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65  is a.      ** ve
8710: 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
8720: 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
8730: 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
8740: 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
8750: 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74       ** it can't
8760: 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20   be helped..    
8770: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
8780: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
8790: 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 41 6c   int rc = syncAl
87a0: 6c 50 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  lPages(pPager);.
87b0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
87c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
87d0: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
87e0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
87f0: 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
8800: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
8810: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
8820: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
8830: 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
8840: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  r->pFirst;.     
8850: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
8860: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b   pPg->nRef==0 );
8870: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
8880: 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
8890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
88a0: 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20  f it is dirty.. 
88b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
88c0: 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
88d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
88e0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
88f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   );.        TRAC
8900: 45 32 28 22 53 41 56 45 20 25 64 5c 6e 22 2c 20  E2("SAVE %d\n", 
8910: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
8920: 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b      sqliteOsSeek
8930: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
8940: 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f 66 66  Pg->pgno-1)*(off
8950: 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  _t)SQLITE_PAGE_S
8960: 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 72 63  IZE);.        rc
8970: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
8980: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  (&pPager->fd, PG
8990: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
89a0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
89b0: 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ZE);.        if(
89c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
89d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
89e0: 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  tepager_rollback
89f0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
8a00: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
8a10: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8a20: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
8a30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a40: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
8a50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8a60: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
8a70: 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ty==0 );..      
8a80: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77  /* If the page w
8a90: 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20  e are recycling 
8aa0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  is marked as alw
8ab0: 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  aysRollback, the
8ac0: 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  n.      ** set t
8ad0: 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
8ae0: 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
8af0: 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
8b00: 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
8b10: 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e_dont_rollback(
8b20: 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  ) optimization f
8b30: 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  or the rest of t
8b40: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
8b50: 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
8b60: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
8b70: 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
8b80: 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
8b90: 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  aysRollback.    
8ba0: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
8bb0: 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
8bc0: 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
8bd0: 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
8be0: 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 20  t remember.     
8bf0: 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
8c00: 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
8c10: 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
8c20: 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
8c30: 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  s must.      ** 
8c40: 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  be marked as alw
8c50: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  aysRollback from
8c60: 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20   here on out..  
8c70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
8c80: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
8c90: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
8ca0: 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
8cb0: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
8cc0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e    }..      /* Un
8cd0: 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
8ce0: 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
8cf0: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
8d00: 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f  h table.      */
8d10: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
8d20: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
8d30: 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  nced ){.        
8d40: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
8d50: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
8d60: 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
8d70: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
8d80: 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
8d90: 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
8da0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
8db0: 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
8dc0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
8dd0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
8de0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
8df0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
8e00: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
8e10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8e20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8e30: 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a  >pFirst==pPg );.
8e40: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
8e50: 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
8e60: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 7d  extFree;.      }
8e70: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
8e80: 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
8e90: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
8ea0: 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
8eb0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
8ec0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8ed0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
8ee0: 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
8ef0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
8f00: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
8f10: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
8f20: 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
8f30: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
8f40: 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 20  pPrevFree = 0;. 
8f50: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e       if( pPg->pN
8f60: 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
8f70: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
8f80: 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
8f90: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20  Pg->pPrevHash;. 
8fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8fb0: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
8fc0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
8fd0: 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
8fe0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
8ff0: 74 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 65 6c  tHash;.      }el
9000: 73 65 7b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  se{.        h = 
9010: 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e  pager_hash(pPg->
9020: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  pgno);.        a
9030: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
9040: 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a  Hash[h]==pPg );.
9050: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
9060: 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e  aHash[h] = pPg->
9070: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 20 20 20  pNextHash;.     
9080: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e   }.      pPg->pN
9090: 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
90a0: 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20  PrevHash = 0;.  
90b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66      pPager->nOvf
90c0: 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  l++;.    }.    p
90d0: 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
90e0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
90f0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  >aInJournal && (
9100: 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
9110: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
9120: 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 65 63        sqliteChec
9130: 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  kMemory(pPager->
9140: 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  aInJournal, pgno
9150: 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  /8);.      asser
9160: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
9170: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
9180: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
9190: 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   (pPager->aInJou
91a0: 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  rnal[pgno/8] & (
91b0: 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
91c0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
91d0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
91e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
91f0: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
9200: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
9210: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
9220: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
9230: 49 6e 43 6b 70 74 20 26 26 20 28 69 6e 74 29 70  InCkpt && (int)p
9240: 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70  gno<=pPager->ckp
9250: 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  tSize.          
9260: 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61     && (pPager->a
9270: 49 6e 43 6b 70 74 5b 70 67 6e 6f 2f 38 5d 20 26  InCkpt[pgno/8] &
9280: 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
9290: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  =0 ){.      page
92a0: 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c 69 73  _add_to_ckpt_lis
92b0: 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  t(pPg);.    }els
92c0: 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65  e{.      page_re
92d0: 6d 6f 76 65 5f 66 72 6f 6d 5f 63 6b 70 74 5f 6c  move_from_ckpt_l
92e0: 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
92f0: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
9300: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65   0;.    pPg->nRe
9310: 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e  f = 1;.    REFIN
9320: 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61  FO(pPg);.    pPa
9330: 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ger->nRef++;.   
9340: 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
9350: 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pgno);.    pPg->
9360: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
9370: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
9380: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
9390: 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  h] = pPg;.    if
93a0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
93b0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
93c0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
93d0: 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
93e0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
93f0: 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
9400: 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  h = pPg;.    }. 
9410: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
9420: 62 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74 65  bSize<0 ) sqlite
9430: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
9440: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
9450: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
9460: 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20  (int)pgno ){.   
9470: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
9480: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
9490: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
94a0: 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  E);.    }else{. 
94b0: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
94c0: 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28     sqliteOsSeek(
94d0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
94e0: 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
94f0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
9500: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9510: 65 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d  eOsRead(&pPager-
9520: 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
9530: 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45 5f  TA(pPg), SQLITE_
9540: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
9550: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9560: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  _OK ){.        o
9570: 66 66 5f 74 20 66 69 6c 65 53 69 7a 65 3b 0a 20  ff_t fileSize;. 
9580: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
9590: 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  eOsFileSize(&pPa
95a0: 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a  ger->fd,&fileSiz
95b0: 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  e)!=SQLITE_OK.  
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
95d0: 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 53  fileSize>=pgno*S
95e0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20  QLITE_PAGE_SIZE 
95f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
9600: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
9610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9620: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
9630: 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53  _DATA(pPg), 0, S
9640: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
9650: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9660: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9670: 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
9680: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
9690: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
96a0: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
96b0: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
96c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
96d0: 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
96e0: 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
96f0: 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
9700: 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b    pPager->nHit++
9710: 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  ;.    page_ref(p
9720: 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  Pg);.  }.  *ppPa
9730: 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ge = PGHDR_TO_DA
9740: 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  TA(pPg);.  retur
9750: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9760: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
9770: 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
9780: 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
9790: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
97a0: 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
97b0: 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
97c0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
97d0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
97e0: 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
97f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
9800: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
9810: 61 6c 73 6f 20 73 71 6c 69 74 65 70 61 67 65 72  also sqlitepager
9820: 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  _get().  The dif
9830: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
9840: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
9850: 61 6e 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f  and sqlitepager_
9860: 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  get() is that _g
9870: 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
9880: 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
9890: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
98a0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
98b0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
98c0: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
98d0: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
98e0: 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
98f0: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
9900: 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
9910: 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
9920: 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
9930: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 70 61 67  .void *sqlitepag
9940: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
9950: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
9960: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
9970: 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
9980: 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
9990: 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
99a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
99b0: 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f  rMask & ~(PAGER_
99c0: 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20  ERR_FULL) ){.   
99d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
99e0: 20 2f 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   /* if( pPager->
99f0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 2a 2a 20  nRef==0 ){.  ** 
9a00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a 2a 20   return 0;.  ** 
9a10: 7d 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  }.  */.  pPg = p
9a20: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
9a30: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
9a40: 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
9a50: 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
9a60: 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg);.  return PG
9a70: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
9a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
9a90: 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
9aa0: 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
9ab0: 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
9ac0: 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
9ad0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
9ae0: 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
9af0: 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
9b00: 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
9b10: 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
9b20: 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
9b30: 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
9b40: 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
9b50: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
9b60: 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
9b70: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
9b80: 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64  pager_unref(void
9b90: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
9ba0: 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65  r *pPg;..  /* De
9bb0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
9bc0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
9bd0: 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20  this page.  */. 
9be0: 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50   pPg = DATA_TO_P
9bf0: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61  GHDR(pData);.  a
9c00: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
9c10: 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  >0 );.  pPg->nRe
9c20: 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f--;.  REFINFO(p
9c30: 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  Pg);..  /* When 
9c40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
9c50: 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61  ferences to a pa
9c60: 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c  ge reach 0, call
9c70: 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75   the.  ** destru
9c80: 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65  ctor and add the
9c90: 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
9ca0: 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elist..  */.  if
9cb0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
9cc0: 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
9cd0: 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ger;.    pPager 
9ce0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
9cf0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
9d00: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  e = 0;.    pPg->
9d10: 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67  pPrevFree = pPag
9d20: 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70  er->pLast;.    p
9d30: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
9d40: 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
9d50: 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
9d60: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
9d70: 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
9d80: 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pPg;.    }else{.
9d90: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
9da0: 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  irst = pPg;.    
9db0: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
9dc0: 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50  eedSync==0 && pP
9dd0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
9de0: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ed==0 ){.      p
9df0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
9e00: 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ced = pPg;.    }
9e10: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
9e20: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
9e30: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
9e40: 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 29  estructor(pData)
9e50: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
9e60: 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
9e70: 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
9e80: 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
9e90: 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
9ea0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
9eb0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
9ec0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
9ed0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
9ee0: 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
9ef0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
9f00: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
9f10: 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
9f20: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
9f30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9f40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
9f50: 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
9f60: 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
9f70: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
9f80: 72 65 61 64 79 20 62 65 20 61 20 77 72 69 74 65  ready be a write
9f90: 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
9fa0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
9fb0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
9fc0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
9fd0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
9fe0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
9ff0: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
a000: 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
a010: 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
a020: 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
a030: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
a040: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a050: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
a060: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a070: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
a080: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
a090: 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  =SQLITE_WRITELOC
a0a0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
a0b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
a0c0: 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  en==0 );.  asser
a0d0: 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
a0e0: 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65  urnal );.  pPage
a0f0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
a100: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
a110: 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
a120: 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
a130: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
a140: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f  0 ){.    sqliteO
a150: 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65  sReadLock(&pPage
a160: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50 61 67  r->fd);.    pPag
a170: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
a180: 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 20  TE_READLOCK;.   
a190: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
a1a0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
a1b0: 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78 63   sqliteOsOpenExc
a1c0: 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a  lusive(pPager->z
a1d0: 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
a1e0: 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74 65  ->jfd,pPager->te
a1f0: 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  mpFile);.  if( r
a200: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a210: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
a220: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
a230: 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
a240: 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
a250: 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61 64      sqliteOsRead
a260: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
a270: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
a280: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45  tate = SQLITE_RE
a290: 41 44 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  ADLOCK;.    retu
a2a0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
a2b0: 45 4e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EN;.  }.  pPager
a2c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
a2d0: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
a2e0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
a2f0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
a300: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
a310: 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
a320: 6b 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 70  k = 0;.  sqlitep
a330: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
a340: 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
a350: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
a360: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
a370: 20 69 66 28 20 70 61 67 65 72 5f 6f 6c 64 5f 66   if( pager_old_f
a380: 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 72 63 20  ormat ){.    rc 
a390: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28  = sqliteOsWrite(
a3a0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4f  &pPager->jfd, aO
a3b0: 6c 64 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 0a  ldJournalMagic,.
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 61 4f         sizeof(aO
a3e0: 6c 64 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  ldJournalMagic))
a3f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
a400: 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74  c = sqliteOsWrit
a410: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
a420: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
a430: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
a440: 67 69 63 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gic));.  }.  if(
a450: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
a460: 7b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  {.    rc = write
a470: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
a480: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  jfd, pPager->dbS
a490: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ize);.  }.  if( 
a4a0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f  pPager->ckptAuto
a4b0: 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
a4c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
a4d0: 3d 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b  = sqlitepager_ck
a4e0: 70 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29  pt_begin(pPager)
a4f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
a500: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a510: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
a520: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
a530: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
a540: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a550: 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
a560: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 6e  ;.    }.  }.#ifn
a570: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 70 50 61  def NDEBUG.  pPa
a580: 67 65 72 2d 3e 73 79 6e 63 4a 53 69 7a 65 20 3d  ger->syncJSize =
a590: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
a5a0: 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a  urn rc;  .}../*.
a5b0: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
a5c0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
a5d0: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
a5e0: 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
a5f0: 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
a600: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
a610: 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
a620: 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6f    sqlitepager_co
a630: 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64  mmit() is called
a640: 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
a650: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
a660: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
a670: 20 2a 20 20 73 71 6c 69 74 65 70 61 67 65 72 5f   *  sqlitepager_
a680: 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  close() is calle
a690: 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
a6a0: 65 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69  epager_unref() i
a6b0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
a6c0: 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
a6d0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
a6e0: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
a6f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
a700: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
a710: 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
a720: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
a730: 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
a740: 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
a750: 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
a760: 65 72 65 6c 79 0a 2a 2a 20 74 6f 20 61 63 71 75  erely.** to acqu
a770: 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
a780: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
a790: 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
a7a0: 66 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20  f that there.** 
a7b0: 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
a7c0: 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
a7d0: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  tabase..**.** A 
a7e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
a7f0: 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
a800: 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
a810: 79 20 66 69 6c 65 2e 20 20 46 6f 72 0a 2a 2a 20  y file.  For.** 
a820: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
a830: 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
a840: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a850: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
a860: 69 6c 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  il.** there is a
a870: 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  n actual need to
a880: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
a890: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
a8a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
a8b0: 61 6c 72 65 61 64 79 20 77 72 69 74 65 2d 6c 6f  already write-lo
a8c0: 63 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  cked, this routi
a8d0: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
a8e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67 65  /.int sqlitepage
a8f0: 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44  r_begin(void *pD
a900: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
a910: 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
a920: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
a930: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
a940: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
a950: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a960: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
a970: 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
a980: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
a990: 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20  !=SQLITE_UNLOCK 
a9a0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
a9b0: 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 52  >state==SQLITE_R
a9c0: 45 41 44 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  EADLOCK ){.    a
a9d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
a9e0: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
a9f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
aa00: 73 57 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67  sWriteLock(&pPag
aa10: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66 28  er->fd);.    if(
aa20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
aa30: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
aa40: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
aa50: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
aa60: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20  ITE_WRITELOCK;. 
aa70: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
aa80: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 54 52  File = 0;.    TR
aa90: 41 43 45 31 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE1("TRANSACTIO
aaa0: 4e 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  N\n");.    if( p
aab0: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
aac0: 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
aad0: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
aae0: 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
aaf0: 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
ab00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
ab10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ab20: 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
ab30: 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
ab40: 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
ab50: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
ab60: 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
ab70: 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
ab80: 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
ab90: 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
aba0: 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
abb0: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
abc0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
abd0: 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
abe0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
abf0: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
ac00: 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
ac10: 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
ac20: 72 65 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  res a write lock
ac30: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
ac40: 2e 20 20 49 66 20 74 68 65 20 77 72 69 74 65 0a  .  If the write.
ac50: 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
ac60: 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
ac70: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
ac80: 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
ac90: 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
aca0: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
acb0: 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
acc0: 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
acd0: 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
ace0: 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
acf0: 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
ad00: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
ad10: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
ad20: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
ad30: 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
ad40: 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
ad50: 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
ad60: 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
ad70: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
ad80: 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
ad90: 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
ada0: 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
adb0: 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
adc0: 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
add0: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
ade0: 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
adf0: 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
ae00: 6c 20 74 6f 20 73 71 6c 69 74 65 70 61 67 65 72  l to sqlitepager
ae10: 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
ae20: 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  itepager_rollbac
ae30: 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
ae40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
ae50: 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a  ger_write(void *
ae60: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
ae70: 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
ae80: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
ae90: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
aea0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
aeb0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
aec0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
aed0: 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
aee0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
aef0: 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ask ){ .    retu
af00: 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
af10: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
af20: 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
af30: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
af40: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
af50: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
af60: 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
af70: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
af80: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
af90: 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
afa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
afb0: 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
afc0: 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
afd0: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
afe0: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
aff0: 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
b000: 69 6e 43 6b 70 74 20 7c 7c 20 70 50 61 67 65 72  inCkpt || pPager
b010: 2d 3e 63 6b 70 74 49 6e 55 73 65 3d 3d 30 29 20  ->ckptInUse==0) 
b020: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
b030: 69 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a 20 20  irtyFile = 1;.  
b040: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b050: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
b060: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
b070: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
b080: 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
b090: 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74 74 65  o be.  ** writte
b0a0: 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
b0b0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
b0c0: 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
b0d0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62  ournal.  ** or b
b0e0: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  oth..  **.  ** F
b0f0: 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
b100: 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
b110: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
b120: 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63  xists and.  ** c
b130: 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
b140: 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  oes not..  */.  
b150: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b160: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e  state!=SQLITE_UN
b170: 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73  LOCK );.  rc = s
b180: 71 6c 69 74 65 70 61 67 65 72 5f 62 65 67 69 6e  qlitepager_begin
b190: 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 72  (pData);.  if( r
b1a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b1b0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
b1c0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
b1d0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49  ger->state==SQLI
b1e0: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a  TE_WRITELOCK );.
b1f0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
b200: 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
b210: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
b220: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
b230: 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
b240: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
b250: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b260: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
b270: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
b280: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
b290: 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
b2a0: 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65 72  rnal );.  pPager
b2b0: 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d 20 31 3b  ->dirtyFile = 1;
b2c0: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  ..  /* The trans
b2d0: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
b2e0: 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
b2f0: 20 68 61 76 65 20 61 20 77 72 69 74 65 20 6c 6f   have a write lo
b300: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6d  ck on the.  ** m
b310: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
b320: 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
b330: 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
b340: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
b350: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69   ** journal if i
b360: 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
b370: 6c 72 65 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69  lready..  */.  i
b380: 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
b390: 61 6c 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  al && pPager->us
b3a0: 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
b3b0: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
b3c0: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
b3d0: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
b3e0: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
b3f0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
b400: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
b410: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b420: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b430: 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69  rc = sqliteOsWri
b440: 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
b450: 20 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50   pData, SQLITE_P
b460: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
b470: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
b480: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b490: 20 20 20 20 20 20 73 71 6c 69 74 65 70 61 67 65        sqlitepage
b4a0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
b4b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
b4c0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
b4d0: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20  AGER_ERR_FULL;. 
b4e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
b4f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b500: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b510: 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
b520: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
b530: 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
b540: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
b550: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
b560: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
b570: 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
b580: 63 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  c;.      pPg->in
b590: 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
b5a0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63     if( pPager->c
b5b0: 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  kptInUse ){.    
b5c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43      pPager->aInC
b5d0: 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  kpt[pPg->pgno/8]
b5e0: 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
b5f0: 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70 61  o&7);.        pa
b600: 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70 74 5f 6c  ge_add_to_ckpt_l
b610: 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
b620: 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  }.      TRACE3("
b630: 4a 4f 55 52 4e 41 4c 20 25 64 20 25 64 5c 6e 22  JOURNAL %d %d\n"
b640: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
b650: 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
b660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
b670: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
b680: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
b690: 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
b6a0: 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
b6b0: 54 52 41 43 45 33 28 22 41 50 50 45 4e 44 20 25  TRACE3("APPEND %
b6c0: 64 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  d %d\n", pPg->pg
b6d0: 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
b6e0: 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  c);.    }.    if
b6f0: 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
b700: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
b710: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
b720: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
b730: 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  f the checkpoint
b740: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
b750: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
b760: 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a   not in it,.  **
b770: 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
b780: 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
b790: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
b7a0: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69  ournal..  */.  i
b7b0: 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  f( pPager->ckptI
b7c0: 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
b7d0: 43 6b 70 74 20 26 26 20 28 69 6e 74 29 70 50 67  Ckpt && (int)pPg
b7e0: 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
b7f0: 63 6b 70 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  ckptSize ){.    
b800: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
b810: 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
b820: 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
b830: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
b840: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
b850: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 63 70 66  its(&pPager->cpf
b860: 64 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  d, pPg->pgno);. 
b870: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b880: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
b890: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
b8a0: 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20  (&pPager->cpfd, 
b8b0: 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41  pData, SQLITE_PA
b8c0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  GE_SIZE);.    }.
b8d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b8e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
b8f0: 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c 62  qlitepager_rollb
b900: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
b910: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
b920: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
b930: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 72 65 74 75  FULL;.      retu
b940: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
b950: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65   pPager->ckptNRe
b960: 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
b970: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
b980: 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
b990: 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e  r->aInCkpt[pPg->
b9a0: 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
b9b0: 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
b9c0: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b 70   page_add_to_ckp
b9d0: 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  t_list(pPg);.  }
b9e0: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
b9f0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
ba00: 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
ba10: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
ba20: 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e  bSize<(int)pPg->
ba30: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
ba40: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
ba50: 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
ba60: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ba70: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
ba80: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
ba90: 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
baa0: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
bab0: 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
bac0: 74 65 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e  tepager_write().
bad0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
bae0: 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
baf0: 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
bb00: 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
bb10: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
bb20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61 67  */.int sqlitepag
bb30: 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76  er_iswriteable(v
bb40: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
bb50: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
bb60: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
bb70: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  ;.  return pPg->
bb80: 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dirty;.}../*.** 
bb90: 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
bba0: 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
bbb0: 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
bbc0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
bbd0: 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
bbe0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
bbf0: 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20  age "pgno" back 
bc00: 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
bc10: 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
bc20: 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
bc30: 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
bc40: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
bc50: 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
bc60: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
bc70: 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
bc80: 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
bc90: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
bca0: 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
bcb0: 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
bcc0: 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
bcd0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
bce0: 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
bcf0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
bd00: 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
bd10: 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
bd20: 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
bd30: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 70 61   the.** sqlitepa
bd40: 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
bd50: 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20  k() below, more 
bd60: 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20  than double the 
bd70: 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67  speed.** of larg
bd80: 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  e INSERT operati
bd90: 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c  ons and quadrupl
bda0: 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
bdb0: 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a  arge DELETEs..**
bdc0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
bdd0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
bde0: 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52   set the alwaysR
bdf0: 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20  ollback flag to 
be00: 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75  true..** Subsequ
be10: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
be20: 69 74 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  itepager_dont_ro
be30: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
be40: 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
be50: 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
be60: 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
be70: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
be80: 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
be90: 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
bea0: 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
beb0: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
bec0: 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
bed0: 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
bee0: 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
bef0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
bf00: 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
bf10: 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
bf20: 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
bf30: 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
bf40: 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
bf50: 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
bf60: 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
bf70: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
bf80: 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
bf90: 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
bfa0: 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
bfb0: 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
bfc0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
bfd0: 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
bfe0: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
bff0: 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64  ns.** critical d
c000: 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
c010: 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
c020: 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63   gets rolled bac
c030: 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66  k in spite.** of
c040: 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
c050: 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f  ck() call..*/.vo
c060: 69 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 64  id sqlitepager_d
c070: 6f 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72 20  ont_write(Pager 
c080: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
c090: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
c0a0: 67 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  g;..  pPg = page
c0b0: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
c0c0: 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61   pgno);.  pPg->a
c0d0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
c0e0: 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26 20  1;.  if( pPg && 
c0f0: 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
c100: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
c110: 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e  Size==(int)pPg->
c120: 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e  pgno && pPager->
c130: 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65  origDbSize<pPage
c140: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
c150: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61     /* If this pa
c160: 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  ges is the last 
c170: 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
c180: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
c190: 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a  s grown.      **
c1a0: 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
c1b0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
c1c0: 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72   then do NOT mar
c1d0: 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
c1e0: 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68  ean..      ** Wh
c1f0: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
c200: 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d  file grows, we m
c210: 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ust make sure th
c220: 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
c230: 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77  .      ** gets w
c240: 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20  ritten at least 
c250: 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65  once so that the
c260: 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20   disk file will 
c270: 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  be the correct. 
c280: 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66       ** size. If
c290: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74   you do not writ
c2a0: 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20  e this page and 
c2b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
c2c0: 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  file.      ** on
c2d0: 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75   the disk ends u
c2e0: 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c  p being too smal
c2f0: 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64  l, that can lead
c300: 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20   to database.   
c310: 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e     ** corruption
c320: 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74   during the next
c330: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
c340: 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65      */.    }else
c350: 7b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  {.      TRACE2("
c360: 44 4f 4e 54 5f 57 52 49 54 45 20 25 64 5c 6e 22  DONT_WRITE %d\n"
c370: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70  , pgno);.      p
c380: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
c390: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
c3a0: 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
c3b0: 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
c3c0: 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
c3d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
c3e0: 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
c3f0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
c400: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
c410: 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
c420: 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
c430: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
c440: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
c450: 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
c460: 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
c470: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
c480: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
c490: 65 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  epager_dont_roll
c4a0: 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
c4b0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
c4c0: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
c4d0: 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
c4e0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
c4f0: 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50  Pager;..  if( pP
c500: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c  ager->state!=SQL
c510: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c  ITE_WRITELOCK ||
c520: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c530: 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  Open==0 ) return
c540: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  ;.  if( pPg->alw
c550: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70  aysRollback || p
c560: 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
c570: 6c 62 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 0a  lback ) return;.
c580: 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
c590: 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
c5a0: 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
c5b0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
c5c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
c5d0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
c5e0: 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
c5f0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
c600: 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
c610: 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
c620: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
c630: 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  l = 1;.    if( p
c640: 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
c650: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
c660: 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70  ->aInCkpt[pPg->p
c670: 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
c680: 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
c690: 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63 6b    page_add_to_ck
c6a0: 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  pt_list(pPg);.  
c6b0: 20 20 7d 0a 20 20 20 20 54 52 41 43 45 32 28 22    }.    TRACE2("
c6c0: 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 25 64  DONT_ROLLBACK %d
c6d0: 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  \n", pPg->pgno);
c6e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
c6f0: 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20  r->ckptInUse && 
c700: 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20  !pPg->inCkpt && 
c710: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
c720: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
c730: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c740: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
c750: 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
c760: 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
c770: 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
c780: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b  t( pPager->aInCk
c790: 70 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  pt!=0 );.    pPa
c7a0: 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67  ger->aInCkpt[pPg
c7b0: 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
c7c0: 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
c7d0: 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 63     page_add_to_c
c7e0: 6b 70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  kpt_list(pPg);. 
c7f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d   }.}../*.** Comm
c800: 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
c810: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
c820: 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
c830: 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
c840: 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
c850: 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
c860: 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
c870: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
c880: 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
c890: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
c8a0: 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
c8b0: 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
c8c0: 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
c8d0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
c8e0: 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67  pager_commit(Pag
c8f0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
c900: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
c910: 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 43 68 61  pPg;.  int dbCha
c920: 6e 67 65 64 3b 0a 0a 20 20 69 66 28 20 70 50 61  nged;..  if( pPa
c930: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41  ger->errMask==PA
c940: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
c950: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 70      rc = sqlitep
c960: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
c970: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
c980: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c990: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c9a0: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
c9b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
c9c0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
c9d0: 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
c9e0: 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
c9f0: 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
ca00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
ca10: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
ca20: 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate!=SQLITE_WRIT
ca30: 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  ELOCK ){.    ret
ca40: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
ca50: 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 31 28 22  ;.  }.  TRACE1("
ca60: 43 4f 4d 4d 49 54 5c 6e 22 29 3b 0a 20 20 69 66  COMMIT\n");.  if
ca70: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46  ( pPager->dirtyF
ca80: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ile==0 ){.    /*
ca90: 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74   Exit early (wit
caa0: 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74  hout doing the t
cab0: 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71  ime-consuming sq
cac0: 6c 69 74 65 4f 73 53 79 6e 63 28 29 20 63 61 6c  liteOsSync() cal
cad0: 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  ls).    ** if th
cae0: 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
caf0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
cb00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
cb10: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
cb20: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d  ager->needSync==
cb30: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 );.    rc = pa
cb40: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
cb50: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
cb60: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
cb70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
cb80: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
cb90: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
cba0: 65 6e 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  en );.  if( pPag
cbb0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 26 26 20  er->needSync && 
cbc0: 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70 50  sqliteOsSync(&pP
cbd0: 61 67 65 72 2d 3e 6a 66 64 29 21 3d 53 51 4c 49  ager->jfd)!=SQLI
cbe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
cbf0: 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a  o commit_abort;.
cc00: 20 20 7d 0a 20 20 64 62 43 68 61 6e 67 65 64 20    }.  dbChanged 
cc10: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  = 0;.  for(pPg=p
cc20: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
cc30: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
cc40: 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50  All){.    if( pP
cc50: 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 20 63 6f  g->dirty==0 ) co
cc60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 54 52 41 43  ntinue;.    TRAC
cc70: 45 32 28 22 43 4f 4d 4d 49 54 2d 50 41 47 45 20  E2("COMMIT-PAGE 
cc80: 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
cc90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 53  );.    sqliteOsS
cca0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
ccb0: 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 28   (pPg->pgno-1)*(
ccc0: 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47  off_t)SQLITE_PAG
ccd0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 72 63 20  E_SIZE);.    rc 
cce0: 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28  = sqliteOsWrite(
ccf0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
cd00: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
cd10: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
cd20: 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  E);.    if( rc!=
cd30: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
cd40: 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
cd50: 20 20 20 64 62 43 68 61 6e 67 65 64 20 3d 20 31     dbChanged = 1
cd60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 43 68  ;.  }.  if( dbCh
cd70: 61 6e 67 65 64 20 26 26 20 21 70 50 61 67 65 72  anged && !pPager
cd80: 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71 6c 69  ->noSync && sqli
cd90: 74 65 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72  teOsSync(&pPager
cda0: 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ->fd)!=SQLITE_OK
cdb0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d   ){.    goto com
cdc0: 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
cdd0: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
cde0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
cdf0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
ce00: 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
ce10: 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20   rc;..  /* Jump 
ce20: 68 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67  here if anything
ce30: 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69   goes wrong duri
ce40: 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
ce50: 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d  ocess..  */.comm
ce60: 69 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d  it_abort:.  rc =
ce70: 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c   sqlitepager_rol
ce80: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
ce90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cea0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
ceb0: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
cec0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ced0: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
cee0: 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65  ll changes.  The
cef0: 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
cf00: 62 61 63 6b 20 74 6f 20 72 65 61 64 2d 6f 6e 6c  back to read-onl
cf10: 79 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  y mode..** All i
cf20: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
cf30: 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
cf40: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
cf50: 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
cf60: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
cf70: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
cf80: 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
cf90: 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
cfa0: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
cfb0: 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
cfc0: 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
cfd0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
cfe0: 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  l (SQLITE_PROTOC
cff0: 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  OL) or unless so
d000: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
d010: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
d020: 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
d030: 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
d040: 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
d050: 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
d060: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
d070: 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
d080: 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
d090: 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
d0a0: 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
d0b0: 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
d0c0: 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
d0d0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
d0e0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
d0f0: 73 71 6c 69 74 65 70 61 67 65 72 5f 72 6f 6c 6c  sqlitepager_roll
d100: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
d110: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
d120: 20 54 52 41 43 45 31 28 22 52 4f 4c 4c 42 41 43   TRACE1("ROLLBAC
d130: 4b 5c 6e 22 29 3b 0a 20 20 69 66 28 20 21 70 50  K\n");.  if( !pP
d140: 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20  ager->dirtyFile 
d150: 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
d160: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
d170: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
d180: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
d190: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
d1a0: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75  e = -1;.    retu
d1b0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 23 69 66 20  rn rc;.  }..#if 
d1c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
d1d0: 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
d1e0: 28 4e 44 45 42 55 47 29 0a 20 20 2f 2a 20 54 72  (NDEBUG).  /* Tr
d1f0: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
d200: 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 69  al to the size i
d210: 74 20 77 61 73 20 61 74 20 74 68 65 20 63 6f 6e  t was at the con
d220: 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 0a 20  clusion of the. 
d230: 20 2a 2a 20 6c 61 73 74 20 73 71 6c 69 74 65 4f   ** last sqliteO
d240: 73 53 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54  sSync() call.  T
d250: 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  his is really an
d260: 20 65 72 72 6f 72 20 63 68 65 63 6b 2e 20 20 49   error check.  I
d270: 66 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62  f the.  ** rollb
d280: 61 63 6b 20 73 74 69 6c 6c 20 77 6f 72 6b 73 2c  ack still works,
d290: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
d2a0: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 77 6f 75 6c  he rollback woul
d2b0: 64 20 68 61 76 65 20 61 6c 73 6f 0a 20 20 2a 2a  d have also.  **
d2c0: 20 77 6f 72 6b 65 64 20 69 66 20 69 74 20 68 61   worked if it ha
d2d0: 64 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72  d occurred after
d2e0: 20 61 6e 20 4f 53 20 63 72 61 73 68 20 6f 72 20   an OS crash or 
d2f0: 75 6e 65 78 70 65 63 74 65 64 20 70 6f 77 65 72  unexpected power
d300: 0a 20 20 2a 2a 20 6c 6f 73 73 2e 0a 20 20 2a 2f  .  ** loss..  */
d310: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
d320: 79 6e 63 4a 53 69 7a 65 3c 73 69 7a 65 6f 66 28  yncJSize<sizeof(
d330: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 73  aJournalMagic)+s
d340: 69 7a 65 6f 66 28 50 67 6e 6f 29 20 29 7b 0a 20  izeof(Pgno) ){. 
d350: 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 4a     pPager->syncJ
d360: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 61 4a  Size = sizeof(aJ
d370: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 73 69 7a  ournalMagic)+siz
d380: 65 6f 66 28 50 67 6e 6f 29 3b 0a 20 20 7d 0a 20  eof(Pgno);.  }. 
d390: 20 54 52 41 43 45 32 28 22 54 52 55 4e 43 41 54   TRACE2("TRUNCAT
d3a0: 45 20 4a 4f 55 52 4e 41 4c 20 25 6c 6c 64 5c 6e  E JOURNAL %lld\n
d3b0: 22 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 4a  ", pPager->syncJ
d3c0: 53 69 7a 65 29 3b 0a 20 20 72 63 20 3d 20 20 73  Size);.  rc =  s
d3d0: 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28  qliteOsTruncate(
d3e0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
d3f0: 61 67 65 72 2d 3e 73 79 6e 63 4a 53 69 7a 65 29  ager->syncJSize)
d400: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
d410: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a  urn rc;.#endif..
d420: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
d430: 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67  rMask!=0 && pPag
d440: 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47  er->errMask!=PAG
d450: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
d460: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
d470: 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49  tate>=SQLITE_WRI
d480: 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  TELOCK ){.      
d490: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
d4a0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
d4b0: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
d4c0: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
d4d0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
d4e0: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
d4f0: 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20  WRITELOCK ){.   
d500: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d510: 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61  K;.  }.  rc = pa
d520: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
d530: 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
d540: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d550: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
d560: 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72  RUPT;.    pPager
d570: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
d580: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
d590: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
d5a0: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
d5b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d5c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
d5d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d5e0: 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
d5f0: 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
d600: 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
d610: 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
d620: 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
d630: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 70 61  .*/.int sqlitepa
d640: 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50  ger_isreadonly(P
d650: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
d660: 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
d670: 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
d680: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d690: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
d6a0: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
d6b0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
d6c0: 71 6c 69 74 65 70 61 67 65 72 5f 73 74 61 74 73  qlitepager_stats
d6d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
d6e0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
d6f0: 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61  9];.  a[0] = pPa
d700: 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31  ger->nRef;.  a[1
d710: 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ] = pPager->nPag
d720: 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67  e;.  a[2] = pPag
d730: 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b  er->mxPage;.  a[
d740: 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
d750: 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50  ize;.  a[4] = pP
d760: 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
d770: 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
d780: 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20  rMask;.  a[6] = 
d790: 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20  pPager->nHit;.  
d7a0: 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[7] = pPager->n
d7b0: 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70  Miss;.  a[8] = p
d7c0: 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20  Pager->nOvfl;.  
d7d0: 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a  return a;.}../*.
d7e0: 2a 2a 20 53 65 74 20 74 68 65 20 63 68 65 63 6b  ** Set the check
d7f0: 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
d800: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
d810: 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
d820: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
d830: 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
d840: 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
d850: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
d860: 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
d870: 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
d880: 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
d890: 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
d8a0: 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69  e SQL command wi
d8b0: 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72  thin a larger tr
d8c0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
d8d0: 74 20 73 71 6c 69 74 65 70 61 67 65 72 5f 63 6b  t sqlitepager_ck
d8e0: 70 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  pt_begin(Pager *
d8f0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
d900: 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  c;.  char zTemp[
d910: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
d920: 53 49 5a 45 5d 3b 0a 20 20 69 66 28 20 21 70 50  SIZE];.  if( !pP
d930: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
d940: 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
d950: 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >ckptAutoopen = 
d960: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
d970: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
d980: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
d990: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
d9a0: 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
d9b0: 3e 63 6b 70 74 49 6e 55 73 65 20 29 3b 0a 20 20  >ckptInUse );.  
d9c0: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20  pPager->aInCkpt 
d9d0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
d9e0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
d9f0: 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
da00: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 3d 3d 30  ager->aInCkpt==0
da10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73   ){.    sqliteOs
da20: 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  ReadLock(&pPager
da30: 2d 3e 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ->fd);.    retur
da40: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
da50: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
da60: 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  eOsFileSize(&pPa
da70: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
da80: 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20  r->ckptJSize);. 
da90: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
daa0: 6b 70 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  kpt_begin_failed
dab0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  ;.  pPager->ckpt
dac0: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
dad0: 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50  bSize;.  if( !pP
dae0: 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 29  ager->ckptOpen )
daf0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
db00: 65 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  epager_opentemp(
db10: 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e  zTemp, &pPager->
db20: 63 70 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cpfd);.    if( r
db30: 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f 62 65  c ) goto ckpt_be
db40: 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
db50: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e  pPager->ckptOpen
db60: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
db70: 2d 3e 63 6b 70 74 4e 52 65 63 20 3d 20 30 3b 0a  ->ckptNRec = 0;.
db80: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b    }.  pPager->ck
db90: 70 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  ptInUse = 1;.  r
dba0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dbb0: 0a 20 0a 63 6b 70 74 5f 62 65 67 69 6e 5f 66 61  . .ckpt_begin_fa
dbc0: 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
dbd0: 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 7b 0a 20  er->aInCkpt ){. 
dbe0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
dbf0: 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 29 3b 0a  ager->aInCkpt);.
dc00: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43      pPager->aInC
dc10: 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  kpt = 0;.  }.  r
dc20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
dc30: 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 63 68 65 63  ** Commit a chec
dc40: 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  kpoint..*/.int s
dc50: 71 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f  qlitepager_ckpt_
dc60: 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
dc70: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
dc80: 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29  ger->ckptInUse )
dc90: 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
dca0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  , *pNext;.    sq
dcb0: 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67  liteOsSeek(&pPag
dcc0: 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b 0a 20 20  er->cpfd, 0);.  
dcd0: 20 20 2f 2a 20 73 71 6c 69 74 65 4f 73 54 72 75    /* sqliteOsTru
dce0: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 63  ncate(&pPager->c
dcf0: 70 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  pfd, 0); */.    
dd00: 70 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63  pPager->ckptNRec
dd10: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
dd20: 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20 30 3b  ->ckptInUse = 0;
dd30: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
dd40: 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74   pPager->aInCkpt
dd50: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
dd60: 61 49 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20  aInCkpt = 0;.   
dd70: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
dd80: 3e 70 43 6b 70 74 3b 20 70 50 67 3b 20 70 50 67  >pCkpt; pPg; pPg
dd90: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70  =pNext){.      p
dda0: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
ddb0: 74 43 6b 70 74 3b 0a 20 20 20 20 20 20 61 73 73  tCkpt;.      ass
ddc0: 65 72 74 28 20 70 50 67 2d 3e 69 6e 43 6b 70 74  ert( pPg->inCkpt
ddd0: 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
dde0: 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20  nCkpt = 0;.     
ddf0: 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20   pPg->pPrevCkpt 
de00: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74  = pPg->pNextCkpt
de10: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
de20: 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d 20  pPager->pCkpt = 
de30: 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
de40: 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >ckptAutoopen = 
de50: 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
de60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
de70: 52 6f 6c 6c 62 61 63 6b 20 61 20 63 68 65 63 6b  Rollback a check
de80: 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  point..*/.int sq
de90: 6c 69 74 65 70 61 67 65 72 5f 63 6b 70 74 5f 72  litepager_ckpt_r
dea0: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
deb0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
dec0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
ded0: 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  ckptInUse ){.   
dee0: 20 72 63 20 3d 20 70 61 67 65 72 5f 63 6b 70 74   rc = pager_ckpt
def0: 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
df00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 70 61 67  );.    sqlitepag
df10: 65 72 5f 63 6b 70 74 5f 63 6f 6d 6d 69 74 28 70  er_ckpt_commit(p
df20: 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
df30: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
df40: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
df50: 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20  r->ckptAutoopen 
df60: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
df70: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
df80: 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72  TE_TEST./*.** Pr
df90: 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66  int a listing of
dfa0: 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20   all referenced 
dfb0: 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72 20  pages and their 
dfc0: 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f  ref count..*/.vo
dfd0: 69 64 20 73 71 6c 69 74 65 70 61 67 65 72 5f 72  id sqlitepager_r
dfe0: 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50  efdump(Pager *pP
dff0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
e000: 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  pPg;.  for(pPg=p
e010: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
e020: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
e030: 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50  All){.    if( pP
e040: 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e  g->nRef<=0 ) con
e050: 74 69 6e 75 65 3b 0a 20 20 20 20 70 72 69 6e 74  tinue;.    print
e060: 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72  f("PAGE %3d addr
e070: 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c  =0x%08x nRef=%d\
e080: 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
e090: 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44  >pgno, (int)PGHD
e0a0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
e0b0: 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a  pPg->nRef);.  }.
e0c0: 7d 0a 23 65 6e 64 69 66 0a                       }.#endif.