xref: /sqlite-3.40.0/src/pager.h (revision 584bfcae)
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