blob: eb1306096c928049173f076d0e1a1d77abd7ad3e [file] [log] [blame]
drh960e8c62001-04-03 16:53:21 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh960e8c62001-04-03 16:53:21 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh960e8c62001-04-03 16:53:21 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh960e8c62001-04-03 16:53:21 +000010**
11*************************************************************************
12** This header file defines the interface that the sqlite page cache
13** subsystem. The page cache subsystem reads and writes a file a page
14** at a time and provides a journal for rollback.
drh960e8c62001-04-03 16:53:21 +000015*/
drh960e8c62001-04-03 16:53:21 +000016
drh43f58d62016-07-09 16:14:45 +000017#ifndef SQLITE_PAGER_H
18#define SQLITE_PAGER_H
danielk197713f72992005-12-18 08:51:22 +000019
drh960e8c62001-04-03 16:53:21 +000020/*
danielk1977bea2a942009-01-20 17:06:27 +000021** Default maximum size for persistent journal files. A negative
22** value means no limit. This value may be overridden using the
23** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit".
danielk1977b53e4962008-06-04 06:45:59 +000024*/
25#ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT
26 #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1
27#endif
28
29/*
drh960e8c62001-04-03 16:53:21 +000030** The type used to represent a page number. The first page in a file
31** is called page 1. 0 is used to represent "not a page".
32*/
shane3615b532008-05-27 18:11:44 +000033typedef u32 Pgno;
drh960e8c62001-04-03 16:53:21 +000034
35/*
36** Each open file is managed by a separate instance of the "Pager" structure.
37*/
38typedef struct Pager Pager;
39
drh7bec5052005-02-06 02:45:41 +000040/*
danielk19773b8a05f2007-03-19 17:44:26 +000041** Handle type for pages.
42*/
43typedef struct PgHdr DbPage;
44
45/*
drh584bfca2022-02-23 17:00:44 +000046** Page number PAGER_SJ_PGNO is never used in an SQLite database (it is
danielk1977bea2a942009-01-20 17:06:27 +000047** reserved for working around a windows/posix incompatibility). It is
48** used in the journal to signify that the remainder of the journal file
drh067b92b2020-06-19 15:24:12 +000049** is devoted to storing a super-journal name - there are no more pages to
50** roll back. See comments for function writeSuperJournal() in pager.c
danielk1977bea2a942009-01-20 17:06:27 +000051** for details.
52*/
drh584bfca2022-02-23 17:00:44 +000053#define PAGER_SJ_PGNO_COMPUTED(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1))
54#define PAGER_SJ_PGNO(x) ((x)->lckPgno)
danielk1977bea2a942009-01-20 17:06:27 +000055
56/*
danielk19773b8a05f2007-03-19 17:44:26 +000057** Allowed values for the flags parameter to sqlite3PagerOpen().
drh7bec5052005-02-06 02:45:41 +000058**
danielk1977bea2a942009-01-20 17:06:27 +000059** NOTE: These values must match the corresponding BTREE_ values in btree.h.
drh7bec5052005-02-06 02:45:41 +000060*/
61#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */
drh33f111d2012-01-17 15:29:14 +000062#define PAGER_MEMORY 0x0002 /* In-memory database */
drh7bec5052005-02-06 02:45:41 +000063
danielk197741483462007-03-24 16:45:04 +000064/*
65** Valid values for the second argument to sqlite3PagerLockingMode().
66*/
67#define PAGER_LOCKINGMODE_QUERY -1
68#define PAGER_LOCKINGMODE_NORMAL 0
69#define PAGER_LOCKINGMODE_EXCLUSIVE 1
drh90f5ecb2004-07-22 01:19:35 +000070
drh6446c4d2001-12-15 14:22:18 +000071/*
drh49711602016-04-14 16:40:13 +000072** Numeric constants that encode the journalmode.
73**
74** The numeric values encoded here (other than PAGER_JOURNALMODE_QUERY)
75** are exposed in the API via the "PRAGMA journal_mode" command and
76** therefore cannot be changed without a compatibility break.
drh3b020132008-04-17 17:02:01 +000077*/
drh0b9b4302010-06-11 17:01:24 +000078#define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */
drh3b020132008-04-17 17:02:01 +000079#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */
80#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */
81#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */
drh04335882008-09-26 21:08:08 +000082#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */
danielk1977b3175382008-10-17 18:51:52 +000083#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */
dan7c246102010-04-12 19:00:29 +000084#define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */
drh3b020132008-04-17 17:02:01 +000085
86/*
drh9584f582015-11-04 20:22:37 +000087** Flags that make up the mask passed to sqlite3PagerGet().
dan11dcd112013-03-15 18:29:18 +000088*/
drhb00fc3b2013-08-21 23:42:32 +000089#define PAGER_GET_NOCONTENT 0x01 /* Do not load data from disk */
90#define PAGER_GET_READONLY 0x02 /* Read-only page is acceptable */
dan11dcd112013-03-15 18:29:18 +000091
92/*
drh40c39412013-08-16 20:42:20 +000093** Flags for sqlite3PagerSetFlags()
drh49711602016-04-14 16:40:13 +000094**
95** Value constraints (enforced via assert()):
96** PAGER_FULLFSYNC == SQLITE_FullFSync
97** PAGER_CKPT_FULLFSYNC == SQLITE_CkptFullFSync
98** PAGER_CACHE_SPILL == SQLITE_CacheSpill
drh40c39412013-08-16 20:42:20 +000099*/
100#define PAGER_SYNCHRONOUS_OFF 0x01 /* PRAGMA synchronous=OFF */
101#define PAGER_SYNCHRONOUS_NORMAL 0x02 /* PRAGMA synchronous=NORMAL */
102#define PAGER_SYNCHRONOUS_FULL 0x03 /* PRAGMA synchronous=FULL */
drh6841b1c2016-02-03 19:20:15 +0000103#define PAGER_SYNCHRONOUS_EXTRA 0x04 /* PRAGMA synchronous=EXTRA */
104#define PAGER_SYNCHRONOUS_MASK 0x07 /* Mask for four values above */
105#define PAGER_FULLFSYNC 0x08 /* PRAGMA fullfsync=ON */
106#define PAGER_CKPT_FULLFSYNC 0x10 /* PRAGMA checkpoint_fullfsync=ON */
107#define PAGER_CACHESPILL 0x20 /* PRAGMA cache_spill=ON */
108#define PAGER_FLAGS_MASK 0x38 /* All above except SYNCHRONOUS */
drh40c39412013-08-16 20:42:20 +0000109
110/*
danielk1977bea2a942009-01-20 17:06:27 +0000111** The remainder of this file contains the declarations of the functions
112** that make up the Pager sub-system API. See source code comments for
113** a detailed description of each routine.
drh6446c4d2001-12-15 14:22:18 +0000114*/
danielk1977bea2a942009-01-20 17:06:27 +0000115
116/* Open and close a Pager connection. */
drh4775ecd2009-07-24 19:01:19 +0000117int sqlite3PagerOpen(
118 sqlite3_vfs*,
119 Pager **ppPager,
120 const char*,
121 int,
122 int,
123 int,
124 void(*)(DbPage*)
125);
dan7fb89902016-08-12 16:21:15 +0000126int sqlite3PagerClose(Pager *pPager, sqlite3*);
danielk1977e1fd5082009-01-23 16:45:00 +0000127int sqlite3PagerReadFileheader(Pager*, int, unsigned char*);
danielk1977bea2a942009-01-20 17:06:27 +0000128
129/* Functions used to configure a Pager object. */
drh80262892018-03-26 16:37:53 +0000130void sqlite3PagerSetBusyHandler(Pager*, int(*)(void *), void *);
drhb2eced52010-08-12 02:41:12 +0000131int sqlite3PagerSetPagesize(Pager*, u32*, int);
drhe9261db2020-07-20 12:47:32 +0000132Pgno sqlite3PagerMaxPageCount(Pager*, Pgno);
danielk19773b8a05f2007-03-19 17:44:26 +0000133void sqlite3PagerSetCachesize(Pager*, int);
drh9b0cf342015-11-12 14:57:19 +0000134int sqlite3PagerSetSpillsize(Pager*, int);
drh0d0614b2013-03-25 23:09:28 +0000135void sqlite3PagerSetMmapLimit(Pager *, sqlite3_int64);
drh09419b42011-11-16 19:29:17 +0000136void sqlite3PagerShrink(Pager*);
drh40c39412013-08-16 20:42:20 +0000137void sqlite3PagerSetFlags(Pager*,unsigned);
danielk1977bea2a942009-01-20 17:06:27 +0000138int sqlite3PagerLockingMode(Pager *, int);
drh0b9b4302010-06-11 17:01:24 +0000139int sqlite3PagerSetJournalMode(Pager *, int);
140int sqlite3PagerGetJournalMode(Pager*);
141int sqlite3PagerOkToChangeJournalMode(Pager*);
danielk1977bea2a942009-01-20 17:06:27 +0000142i64 sqlite3PagerJournalSizeLimit(Pager *, i64);
danielk197704103022009-02-03 16:51:24 +0000143sqlite3_backup **sqlite3PagerBackupPtr(Pager*);
dan6fa255f2015-10-28 19:46:57 +0000144int sqlite3PagerFlush(Pager*);
danielk1977bea2a942009-01-20 17:06:27 +0000145
146/* Functions used to obtain and release page references. */
drh9584f582015-11-04 20:22:37 +0000147int sqlite3PagerGet(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag);
danielk19773b8a05f2007-03-19 17:44:26 +0000148DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno);
danielk1977bea2a942009-01-20 17:06:27 +0000149void sqlite3PagerRef(DbPage*);
150void sqlite3PagerUnref(DbPage*);
drhda8a3302013-12-13 19:35:21 +0000151void sqlite3PagerUnrefNotNull(DbPage*);
drh3908fe92017-09-01 14:50:19 +0000152void sqlite3PagerUnrefPageOne(DbPage*);
danielk1977bea2a942009-01-20 17:06:27 +0000153
154/* Operations on page references. */
danielk197745d68822009-01-16 16:23:38 +0000155int sqlite3PagerWrite(DbPage*);
danielk1977bea2a942009-01-20 17:06:27 +0000156void sqlite3PagerDontWrite(DbPage*);
157int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int);
158int sqlite3PagerPageRefcount(DbPage*);
159void *sqlite3PagerGetData(DbPage *);
160void *sqlite3PagerGetExtra(DbPage *);
161
162/* Functions used to manage pager transactions and savepoints. */
drh8fb8b532010-08-14 17:12:04 +0000163void sqlite3PagerPagecount(Pager*, int*);
danielk1977d8293352009-04-30 09:10:37 +0000164int sqlite3PagerBegin(Pager*, int exFlag, int);
drh067b92b2020-06-19 15:24:12 +0000165int sqlite3PagerCommitPhaseOne(Pager*,const char *zSuper, int);
drhabfb62f2010-07-30 11:20:35 +0000166int sqlite3PagerExclusiveLock(Pager*);
drh067b92b2020-06-19 15:24:12 +0000167int sqlite3PagerSync(Pager *pPager, const char *zSuper);
drh80e35f42007-03-30 14:06:34 +0000168int sqlite3PagerCommitPhaseTwo(Pager*);
danielk19773b8a05f2007-03-19 17:44:26 +0000169int sqlite3PagerRollback(Pager*);
danielk1977bea2a942009-01-20 17:06:27 +0000170int sqlite3PagerOpenSavepoint(Pager *pPager, int n);
171int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint);
danielk197789bc4bc2009-07-21 19:25:24 +0000172int sqlite3PagerSharedLock(Pager *pPager);
dan8d22a172010-04-19 18:03:51 +0000173
dan06a2d822012-10-10 09:46:29 +0000174#ifndef SQLITE_OMIT_WAL
dan7fb89902016-08-12 16:21:15 +0000175 int sqlite3PagerCheckpoint(Pager *pPager, sqlite3*, int, int*, int*);
dan06a2d822012-10-10 09:46:29 +0000176 int sqlite3PagerWalSupported(Pager *pPager);
177 int sqlite3PagerWalCallback(Pager *pPager);
178 int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen);
dan7fb89902016-08-12 16:21:15 +0000179 int sqlite3PagerCloseWal(Pager *pPager, sqlite3*);
danfc1acf32015-12-05 20:51:54 +0000180# ifdef SQLITE_ENABLE_SNAPSHOT
dan8714de92020-05-04 19:42:35 +0000181 int sqlite3PagerSnapshotGet(Pager*, sqlite3_snapshot **ppSnapshot);
dan861fb1e2020-05-06 19:14:41 +0000182 int sqlite3PagerSnapshotOpen(Pager*, sqlite3_snapshot *pSnapshot);
dan11584982016-11-18 20:49:43 +0000183 int sqlite3PagerSnapshotRecover(Pager *pPager);
danfa3d4c12018-08-06 17:12:36 +0000184 int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot);
185 void sqlite3PagerSnapshotUnlock(Pager *pPager);
danfc1acf32015-12-05 20:51:54 +0000186# endif
dan06a2d822012-10-10 09:46:29 +0000187#endif
188
dan58021b22020-05-05 20:30:07 +0000189#if !defined(SQLITE_OMIT_WAL) && defined(SQLITE_ENABLE_SETLK_TIMEOUT)
dan861fb1e2020-05-06 19:14:41 +0000190 int sqlite3PagerWalWriteLock(Pager*, int);
191 void sqlite3PagerWalDb(Pager*, sqlite3*);
dan58021b22020-05-05 20:30:07 +0000192#else
dan861fb1e2020-05-06 19:14:41 +0000193# define sqlite3PagerWalWriteLock(y,z) SQLITE_OK
194# define sqlite3PagerWalDb(x,y)
dan58021b22020-05-05 20:30:07 +0000195#endif
196
dan09236752018-11-22 19:10:14 +0000197#ifdef SQLITE_DIRECT_OVERFLOW_READ
198 int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno);
199#endif
200
drh70708602012-02-24 14:33:28 +0000201#ifdef SQLITE_ENABLE_ZIPVFS
202 int sqlite3PagerWalFramesize(Pager *pPager);
203#endif
danb3bdc722012-02-23 15:35:49 +0000204
danielk1977bea2a942009-01-20 17:06:27 +0000205/* Functions used to query pager state and configuration. */
drhf49661a2008-12-10 16:45:50 +0000206u8 sqlite3PagerIsreadonly(Pager*);
drh91618562014-12-19 19:28:02 +0000207u32 sqlite3PagerDataVersion(Pager*);
drhe05b3f82015-07-01 17:53:49 +0000208#ifdef SQLITE_DEBUG
209 int sqlite3PagerRefcount(Pager*);
210#endif
drh63da0892010-03-10 21:42:07 +0000211int sqlite3PagerMemUsed(Pager*);
drh8875b9e2020-01-10 18:05:55 +0000212const char *sqlite3PagerFilename(const Pager*, int);
drh790f2872015-11-28 18:06:36 +0000213sqlite3_vfs *sqlite3PagerVfs(Pager*);
drhcc6bb3e2007-08-31 16:11:35 +0000214sqlite3_file *sqlite3PagerFile(Pager*);
drh21d61852016-01-08 02:27:01 +0000215sqlite3_file *sqlite3PagerJrnlFile(Pager*);
danielk19773b8a05f2007-03-19 17:44:26 +0000216const char *sqlite3PagerJournalname(Pager*);
drh26b79942007-11-28 16:19:56 +0000217void *sqlite3PagerTempSpace(Pager*);
danielk197704103022009-02-03 16:51:24 +0000218int sqlite3PagerIsMemdb(Pager*);
dan58ca31c2011-09-22 14:41:16 +0000219void sqlite3PagerCacheStat(Pager *, int, int, int *);
dan43c1ce32016-08-05 16:16:26 +0000220void sqlite3PagerClearCache(Pager*);
danc9a53262012-10-01 06:50:55 +0000221int sqlite3SectorSize(sqlite3_file *);
drhdd793422001-06-28 01:54:48 +0000222
danielk197764beba42009-01-31 14:54:06 +0000223/* Functions used to truncate the database file. */
224void sqlite3PagerTruncateImage(Pager*,Pgno);
dan99bd1092013-03-22 18:20:14 +0000225
dane6593d82014-10-24 16:40:49 +0000226void sqlite3PagerRekey(DbPage*, Pgno, u16);
dan33ea4862014-10-09 19:35:37 +0000227
danielk1977bea2a942009-01-20 17:06:27 +0000228/* Functions to support testing and debugging. */
drh87cc3b32007-05-08 21:45:27 +0000229#if !defined(NDEBUG) || defined(SQLITE_TEST)
230 Pgno sqlite3PagerPagenumber(DbPage*);
231 int sqlite3PagerIswriteable(DbPage*);
232#endif
drhdd793422001-06-28 01:54:48 +0000233#ifdef SQLITE_TEST
drh87cc3b32007-05-08 21:45:27 +0000234 int *sqlite3PagerStats(Pager*);
235 void sqlite3PagerRefdump(Pager*);
danielk1977bea2a942009-01-20 17:06:27 +0000236 void disable_simulated_io_errors(void);
237 void enable_simulated_io_errors(void);
danielk1977979f38e2007-03-27 16:19:51 +0000238#else
239# define disable_simulated_io_errors()
240# define enable_simulated_io_errors()
241#endif
242
drh43f58d62016-07-09 16:14:45 +0000243#endif /* SQLITE_PAGER_H */