1960e8c63Sdrh /* 2b19a2bc6Sdrh ** 2001 September 15 3960e8c63Sdrh ** 4b19a2bc6Sdrh ** The author disclaims copyright to this source code. In place of 5b19a2bc6Sdrh ** a legal notice, here is a blessing: 6960e8c63Sdrh ** 7b19a2bc6Sdrh ** May you do good and not evil. 8b19a2bc6Sdrh ** May you find forgiveness for yourself and forgive others. 9b19a2bc6Sdrh ** May you share freely, never taking more than you give. 10960e8c63Sdrh ** 11960e8c63Sdrh ************************************************************************* 12960e8c63Sdrh ** This header file defines the interface that the sqlite page cache 13960e8c63Sdrh ** subsystem. The page cache subsystem reads and writes a file a page 14960e8c63Sdrh ** at a time and provides a journal for rollback. 15960e8c63Sdrh */ 16960e8c63Sdrh 1743f58d6aSdrh #ifndef SQLITE_PAGER_H 1843f58d6aSdrh #define SQLITE_PAGER_H 1913f7299bSdanielk1977 20960e8c63Sdrh /* 21bea2a948Sdanielk1977 ** Default maximum size for persistent journal files. A negative 22bea2a948Sdanielk1977 ** value means no limit. This value may be overridden using the 23bea2a948Sdanielk1977 ** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit". 24b53e4960Sdanielk1977 */ 25b53e4960Sdanielk1977 #ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT 26b53e4960Sdanielk1977 #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1 27b53e4960Sdanielk1977 #endif 28b53e4960Sdanielk1977 29b53e4960Sdanielk1977 /* 30960e8c63Sdrh ** The type used to represent a page number. The first page in a file 31960e8c63Sdrh ** is called page 1. 0 is used to represent "not a page". 32960e8c63Sdrh */ 333615b533Sshane typedef u32 Pgno; 34960e8c63Sdrh 35960e8c63Sdrh /* 36960e8c63Sdrh ** Each open file is managed by a separate instance of the "Pager" structure. 37960e8c63Sdrh */ 38960e8c63Sdrh typedef struct Pager Pager; 39960e8c63Sdrh 407bec505eSdrh /* 413b8a05f6Sdanielk1977 ** Handle type for pages. 423b8a05f6Sdanielk1977 */ 433b8a05f6Sdanielk1977 typedef struct PgHdr DbPage; 443b8a05f6Sdanielk1977 453b8a05f6Sdanielk1977 /* 46*584bfcaeSdrh ** Page number PAGER_SJ_PGNO is never used in an SQLite database (it is 47bea2a948Sdanielk1977 ** reserved for working around a windows/posix incompatibility). It is 48bea2a948Sdanielk1977 ** used in the journal to signify that the remainder of the journal file 49067b92baSdrh ** is devoted to storing a super-journal name - there are no more pages to 50067b92baSdrh ** roll back. See comments for function writeSuperJournal() in pager.c 51bea2a948Sdanielk1977 ** for details. 52bea2a948Sdanielk1977 */ 53*584bfcaeSdrh #define PAGER_SJ_PGNO_COMPUTED(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) 54*584bfcaeSdrh #define PAGER_SJ_PGNO(x) ((x)->lckPgno) 55bea2a948Sdanielk1977 56bea2a948Sdanielk1977 /* 573b8a05f6Sdanielk1977 ** Allowed values for the flags parameter to sqlite3PagerOpen(). 587bec505eSdrh ** 59bea2a948Sdanielk1977 ** NOTE: These values must match the corresponding BTREE_ values in btree.h. 607bec505eSdrh */ 617bec505eSdrh #define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */ 6233f111dcSdrh #define PAGER_MEMORY 0x0002 /* In-memory database */ 637bec505eSdrh 6441483468Sdanielk1977 /* 6541483468Sdanielk1977 ** Valid values for the second argument to sqlite3PagerLockingMode(). 6641483468Sdanielk1977 */ 6741483468Sdanielk1977 #define PAGER_LOCKINGMODE_QUERY -1 6841483468Sdanielk1977 #define PAGER_LOCKINGMODE_NORMAL 0 6941483468Sdanielk1977 #define PAGER_LOCKINGMODE_EXCLUSIVE 1 7090f5ecb3Sdrh 716446c4dcSdrh /* 720b9b4301Sdrh ** Numeric constants that encode the journalmode. 7349711600Sdrh ** 7449711600Sdrh ** The numeric values encoded here (other than PAGER_JOURNALMODE_QUERY) 7549711600Sdrh ** are exposed in the API via the "PRAGMA journal_mode" command and 7649711600Sdrh ** therefore cannot be changed without a compatibility break. 773b02013eSdrh */ 780b9b4301Sdrh #define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */ 793b02013eSdrh #define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */ 803b02013eSdrh #define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */ 813b02013eSdrh #define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */ 8204335886Sdrh #define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */ 83b3175389Sdanielk1977 #define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */ 847c24610eSdan #define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */ 853b02013eSdrh 863b02013eSdrh /* 879584f58cSdrh ** Flags that make up the mask passed to sqlite3PagerGet(). 8811dcd119Sdan */ 89b00fc3b1Sdrh #define PAGER_GET_NOCONTENT 0x01 /* Do not load data from disk */ 90b00fc3b1Sdrh #define PAGER_GET_READONLY 0x02 /* Read-only page is acceptable */ 9111dcd119Sdan 9211dcd119Sdan /* 9340c3941cSdrh ** Flags for sqlite3PagerSetFlags() 9449711600Sdrh ** 9549711600Sdrh ** Value constraints (enforced via assert()): 9649711600Sdrh ** PAGER_FULLFSYNC == SQLITE_FullFSync 9749711600Sdrh ** PAGER_CKPT_FULLFSYNC == SQLITE_CkptFullFSync 9849711600Sdrh ** PAGER_CACHE_SPILL == SQLITE_CacheSpill 9940c3941cSdrh */ 10040c3941cSdrh #define PAGER_SYNCHRONOUS_OFF 0x01 /* PRAGMA synchronous=OFF */ 10140c3941cSdrh #define PAGER_SYNCHRONOUS_NORMAL 0x02 /* PRAGMA synchronous=NORMAL */ 10240c3941cSdrh #define PAGER_SYNCHRONOUS_FULL 0x03 /* PRAGMA synchronous=FULL */ 1036841b1cbSdrh #define PAGER_SYNCHRONOUS_EXTRA 0x04 /* PRAGMA synchronous=EXTRA */ 1046841b1cbSdrh #define PAGER_SYNCHRONOUS_MASK 0x07 /* Mask for four values above */ 1056841b1cbSdrh #define PAGER_FULLFSYNC 0x08 /* PRAGMA fullfsync=ON */ 1066841b1cbSdrh #define PAGER_CKPT_FULLFSYNC 0x10 /* PRAGMA checkpoint_fullfsync=ON */ 1076841b1cbSdrh #define PAGER_CACHESPILL 0x20 /* PRAGMA cache_spill=ON */ 1086841b1cbSdrh #define PAGER_FLAGS_MASK 0x38 /* All above except SYNCHRONOUS */ 10940c3941cSdrh 11040c3941cSdrh /* 111bea2a948Sdanielk1977 ** The remainder of this file contains the declarations of the functions 112bea2a948Sdanielk1977 ** that make up the Pager sub-system API. See source code comments for 113bea2a948Sdanielk1977 ** a detailed description of each routine. 1146446c4dcSdrh */ 115bea2a948Sdanielk1977 116bea2a948Sdanielk1977 /* Open and close a Pager connection. */ 1174775ecd0Sdrh int sqlite3PagerOpen( 1184775ecd0Sdrh sqlite3_vfs*, 1194775ecd0Sdrh Pager **ppPager, 1204775ecd0Sdrh const char*, 1214775ecd0Sdrh int, 1224775ecd0Sdrh int, 1234775ecd0Sdrh int, 1244775ecd0Sdrh void(*)(DbPage*) 1254775ecd0Sdrh ); 1267fb89906Sdan int sqlite3PagerClose(Pager *pPager, sqlite3*); 127e1fd508aSdanielk1977 int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); 128bea2a948Sdanielk1977 129bea2a948Sdanielk1977 /* Functions used to configure a Pager object. */ 13080262896Sdrh void sqlite3PagerSetBusyHandler(Pager*, int(*)(void *), void *); 131b2eced5dSdrh int sqlite3PagerSetPagesize(Pager*, u32*, int); 132e9261dbdSdrh Pgno sqlite3PagerMaxPageCount(Pager*, Pgno); 1333b8a05f6Sdanielk1977 void sqlite3PagerSetCachesize(Pager*, int); 1349b0cf34fSdrh int sqlite3PagerSetSpillsize(Pager*, int); 1350d0614bdSdrh void sqlite3PagerSetMmapLimit(Pager *, sqlite3_int64); 13609419b4bSdrh void sqlite3PagerShrink(Pager*); 13740c3941cSdrh void sqlite3PagerSetFlags(Pager*,unsigned); 138bea2a948Sdanielk1977 int sqlite3PagerLockingMode(Pager *, int); 1390b9b4301Sdrh int sqlite3PagerSetJournalMode(Pager *, int); 1400b9b4301Sdrh int sqlite3PagerGetJournalMode(Pager*); 1410b9b4301Sdrh int sqlite3PagerOkToChangeJournalMode(Pager*); 142bea2a948Sdanielk1977 i64 sqlite3PagerJournalSizeLimit(Pager *, i64); 1430410302eSdanielk1977 sqlite3_backup **sqlite3PagerBackupPtr(Pager*); 1446fa255fdSdan int sqlite3PagerFlush(Pager*); 145bea2a948Sdanielk1977 146bea2a948Sdanielk1977 /* Functions used to obtain and release page references. */ 1479584f58cSdrh int sqlite3PagerGet(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); 1483b8a05f6Sdanielk1977 DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); 149bea2a948Sdanielk1977 void sqlite3PagerRef(DbPage*); 150bea2a948Sdanielk1977 void sqlite3PagerUnref(DbPage*); 151da8a330aSdrh void sqlite3PagerUnrefNotNull(DbPage*); 1523908fe90Sdrh void sqlite3PagerUnrefPageOne(DbPage*); 153bea2a948Sdanielk1977 154bea2a948Sdanielk1977 /* Operations on page references. */ 15545d6882fSdanielk1977 int sqlite3PagerWrite(DbPage*); 156bea2a948Sdanielk1977 void sqlite3PagerDontWrite(DbPage*); 157bea2a948Sdanielk1977 int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); 158bea2a948Sdanielk1977 int sqlite3PagerPageRefcount(DbPage*); 159bea2a948Sdanielk1977 void *sqlite3PagerGetData(DbPage *); 160bea2a948Sdanielk1977 void *sqlite3PagerGetExtra(DbPage *); 161bea2a948Sdanielk1977 162bea2a948Sdanielk1977 /* Functions used to manage pager transactions and savepoints. */ 1638fb8b537Sdrh void sqlite3PagerPagecount(Pager*, int*); 164d829335eSdanielk1977 int sqlite3PagerBegin(Pager*, int exFlag, int); 165067b92baSdrh int sqlite3PagerCommitPhaseOne(Pager*,const char *zSuper, int); 166abfb62f9Sdrh int sqlite3PagerExclusiveLock(Pager*); 167067b92baSdrh int sqlite3PagerSync(Pager *pPager, const char *zSuper); 16880e35f46Sdrh int sqlite3PagerCommitPhaseTwo(Pager*); 1693b8a05f6Sdanielk1977 int sqlite3PagerRollback(Pager*); 170bea2a948Sdanielk1977 int sqlite3PagerOpenSavepoint(Pager *pPager, int n); 171bea2a948Sdanielk1977 int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); 17289bc4bc6Sdanielk1977 int sqlite3PagerSharedLock(Pager *pPager); 1738d22a174Sdan 17406a2d825Sdan #ifndef SQLITE_OMIT_WAL 1757fb89906Sdan int sqlite3PagerCheckpoint(Pager *pPager, sqlite3*, int, int*, int*); 176d9e5c4f6Sdrh int sqlite3PagerWalSupported(Pager *pPager); 1777ed91f23Sdrh int sqlite3PagerWalCallback(Pager *pPager); 1787ed91f23Sdrh int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); 1797fb89906Sdan int sqlite3PagerCloseWal(Pager *pPager, sqlite3*); 180fc1acf33Sdan # ifdef SQLITE_ENABLE_SNAPSHOT 1818714de97Sdan int sqlite3PagerSnapshotGet(Pager*, sqlite3_snapshot **ppSnapshot); 182861fb1e9Sdan int sqlite3PagerSnapshotOpen(Pager*, sqlite3_snapshot *pSnapshot); 1831158498dSdan int sqlite3PagerSnapshotRecover(Pager *pPager); 184fa3d4c19Sdan int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot); 185fa3d4c19Sdan void sqlite3PagerSnapshotUnlock(Pager *pPager); 186fc1acf33Sdan # endif 18706a2d825Sdan #endif 18806a2d825Sdan 18958021b23Sdan #if !defined(SQLITE_OMIT_WAL) && defined(SQLITE_ENABLE_SETLK_TIMEOUT) 190861fb1e9Sdan int sqlite3PagerWalWriteLock(Pager*, int); 191861fb1e9Sdan void sqlite3PagerWalDb(Pager*, sqlite3*); 19258021b23Sdan #else 193861fb1e9Sdan # define sqlite3PagerWalWriteLock(y,z) SQLITE_OK 194861fb1e9Sdan # define sqlite3PagerWalDb(x,y) 19558021b23Sdan #endif 19658021b23Sdan 19709236755Sdan #ifdef SQLITE_DIRECT_OVERFLOW_READ 19809236755Sdan int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno); 19909236755Sdan #endif 20009236755Sdan 20170708600Sdrh #ifdef SQLITE_ENABLE_ZIPVFS 202b3bdc72dSdan int sqlite3PagerWalFramesize(Pager *pPager); 20370708600Sdrh #endif 204b3bdc72dSdan 205bea2a948Sdanielk1977 /* Functions used to query pager state and configuration. */ 206f49661a4Sdrh u8 sqlite3PagerIsreadonly(Pager*); 20791618564Sdrh u32 sqlite3PagerDataVersion(Pager*); 208e05b3f8fSdrh #ifdef SQLITE_DEBUG 2093b8a05f6Sdanielk1977 int sqlite3PagerRefcount(Pager*); 210e05b3f8fSdrh #endif 21163da0893Sdrh int sqlite3PagerMemUsed(Pager*); 2128875b9e7Sdrh const char *sqlite3PagerFilename(const Pager*, int); 213790f287cSdrh sqlite3_vfs *sqlite3PagerVfs(Pager*); 214cc6bb3eaSdrh sqlite3_file *sqlite3PagerFile(Pager*); 21521d61853Sdrh sqlite3_file *sqlite3PagerJrnlFile(Pager*); 2163b8a05f6Sdanielk1977 const char *sqlite3PagerJournalname(Pager*); 21726b7994aSdrh void *sqlite3PagerTempSpace(Pager*); 2180410302eSdanielk1977 int sqlite3PagerIsMemdb(Pager*); 21958ca31c9Sdan void sqlite3PagerCacheStat(Pager *, int, int, int *); 22043c1ce39Sdan void sqlite3PagerClearCache(Pager*); 221c9a53269Sdan int sqlite3SectorSize(sqlite3_file *); 222dd79342eSdrh 22364beba43Sdanielk1977 /* Functions used to truncate the database file. */ 2243460d19cSdanielk1977 void sqlite3PagerTruncateImage(Pager*,Pgno); 22599bd1097Sdan 226e6593d8eSdan void sqlite3PagerRekey(DbPage*, Pgno, u16); 22733ea4866Sdan 228bea2a948Sdanielk1977 /* Functions to support testing and debugging. */ 22987cc3b31Sdrh #if !defined(NDEBUG) || defined(SQLITE_TEST) 23087cc3b31Sdrh Pgno sqlite3PagerPagenumber(DbPage*); 23187cc3b31Sdrh int sqlite3PagerIswriteable(DbPage*); 23287cc3b31Sdrh #endif 233dd79342eSdrh #ifdef SQLITE_TEST 23487cc3b31Sdrh int *sqlite3PagerStats(Pager*); 2353b8a05f6Sdanielk1977 void sqlite3PagerRefdump(Pager*); 236979f38e5Sdanielk1977 void disable_simulated_io_errors(void); 237979f38e5Sdanielk1977 void enable_simulated_io_errors(void); 238979f38e5Sdanielk1977 #else 239979f38e5Sdanielk1977 # define disable_simulated_io_errors() 240979f38e5Sdanielk1977 # define enable_simulated_io_errors() 241979f38e5Sdanielk1977 #endif 242979f38e5Sdanielk1977 24343f58d6aSdrh #endif /* SQLITE_PAGER_H */ 244