blob: ae57468e3fd5fec513515d97f842029ec9f9aa7c [file] [log] [blame]
drha059ad02001-04-17 20:09:11 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drha059ad02001-04-17 20:09:11 +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:
drha059ad02001-04-17 20:09:11 +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.
drha059ad02001-04-17 20:09:11 +000010**
11*************************************************************************
12** This header file defines the interface that the sqlite B-Tree file
drh6446c4d2001-12-15 14:22:18 +000013** subsystem. See comments in the source code for a detailed description
14** of what each interface routine does.
drha059ad02001-04-17 20:09:11 +000015*/
drh43f58d62016-07-09 16:14:45 +000016#ifndef SQLITE_BTREE_H
17#define SQLITE_BTREE_H
drha059ad02001-04-17 20:09:11 +000018
danielk19774adee202004-05-08 08:23:19 +000019/* TODO: This definition is just included so other modules compile. It
20** needs to be revisited.
21*/
drh91618562014-12-19 19:28:02 +000022#define SQLITE_N_BTREE_META 16
danielk19774adee202004-05-08 08:23:19 +000023
drh73509ee2003-04-06 20:44:45 +000024/*
danielk1977951af802004-11-05 15:45:09 +000025** If defined as non-zero, auto-vacuum is enabled by default. Otherwise
26** it must be turned on for each database using "PRAGMA auto_vacuum = 1".
27*/
28#ifndef SQLITE_DEFAULT_AUTOVACUUM
29 #define SQLITE_DEFAULT_AUTOVACUUM 0
30#endif
31
danielk1977dddbcdc2007-04-26 14:42:34 +000032#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */
33#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */
34#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */
35
danielk1977951af802004-11-05 15:45:09 +000036/*
drh73509ee2003-04-06 20:44:45 +000037** Forward declarations of structure
38*/
drha059ad02001-04-17 20:09:11 +000039typedef struct Btree Btree;
40typedef struct BtCursor BtCursor;
danielk1977aef0bf62005-12-30 16:28:01 +000041typedef struct BtShared BtShared;
drh8eeb4462016-05-21 20:03:42 +000042typedef struct BtreePayload BtreePayload;
paulb95a8862003-04-01 21:16:41 +000043
drh73509ee2003-04-06 20:44:45 +000044
danielk197724162fe2004-06-04 06:22:00 +000045int sqlite3BtreeOpen(
dan3a6d8ae2011-04-23 15:54:54 +000046 sqlite3_vfs *pVfs, /* VFS to use with this b-tree */
drh90f5ecb2004-07-22 01:19:35 +000047 const char *zFilename, /* Name of database file to open */
danielk1977aef0bf62005-12-30 16:28:01 +000048 sqlite3 *db, /* Associated database connection */
danielk19770d19f7a2009-06-03 11:25:07 +000049 Btree **ppBtree, /* Return open Btree* here */
drh33f4e022007-09-03 15:19:34 +000050 int flags, /* Flags */
51 int vfsFlags /* Flags passed through to VFS open */
danielk197724162fe2004-06-04 06:22:00 +000052);
drh3aac2dd2004-04-26 14:10:20 +000053
54/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the
55** following values.
drh7bec5052005-02-06 02:45:41 +000056**
57** NOTE: These values must match the corresponding PAGER_ values in
58** pager.h.
drh73509ee2003-04-06 20:44:45 +000059*/
drhd4187c72010-08-30 22:15:45 +000060#define BTREE_OMIT_JOURNAL 1 /* Do not create or use a rollback journal */
drh33f111d2012-01-17 15:29:14 +000061#define BTREE_MEMORY 2 /* This is an in-memory DB */
62#define BTREE_SINGLE 4 /* The file contains at most 1 b-tree */
63#define BTREE_UNORDERED 8 /* Use of a hash implementation is OK */
drhe53831d2007-08-17 01:14:38 +000064
drh3aac2dd2004-04-26 14:10:20 +000065int sqlite3BtreeClose(Btree*);
66int sqlite3BtreeSetCacheSize(Btree*,int);
drh9b0cf342015-11-12 14:57:19 +000067int sqlite3BtreeSetSpillSize(Btree*,int);
drh18c7e402014-03-14 11:46:10 +000068#if SQLITE_MAX_MMAP_SIZE>0
69 int sqlite3BtreeSetMmapLimit(Btree*,sqlite3_int64);
70#endif
drh40c39412013-08-16 20:42:20 +000071int sqlite3BtreeSetPagerFlags(Btree*,unsigned);
danielk19770d19f7a2009-06-03 11:25:07 +000072int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix);
drh90f5ecb2004-07-22 01:19:35 +000073int sqlite3BtreeGetPageSize(Btree*);
drhf8e632b2007-05-08 14:51:36 +000074int sqlite3BtreeMaxPageCount(Btree*,int);
drhb1299152010-03-30 22:58:33 +000075u32 sqlite3BtreeLastPage(Btree*);
drh5b47efa2010-02-12 18:18:39 +000076int sqlite3BtreeSecureDelete(Btree*,int);
drhad0961b2015-02-21 00:19:25 +000077int sqlite3BtreeGetOptimalReserve(Btree*);
dan0094f372012-09-28 20:23:42 +000078int sqlite3BtreeGetReserveNoMutex(Btree *p);
danielk1977951af802004-11-05 15:45:09 +000079int sqlite3BtreeSetAutoVacuum(Btree *, int);
80int sqlite3BtreeGetAutoVacuum(Btree *);
danielk197740b38dc2004-06-26 08:38:24 +000081int sqlite3BtreeBeginTrans(Btree*,int);
drh80e35f42007-03-30 14:06:34 +000082int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster);
dan60939d02011-03-29 15:40:55 +000083int sqlite3BtreeCommitPhaseTwo(Btree*, int);
drh3aac2dd2004-04-26 14:10:20 +000084int sqlite3BtreeCommit(Btree*);
drh47b7fc72014-11-11 01:33:57 +000085int sqlite3BtreeRollback(Btree*,int,int);
danielk1977bd434552009-03-18 10:33:00 +000086int sqlite3BtreeBeginStmt(Btree*,int);
drh3aac2dd2004-04-26 14:10:20 +000087int sqlite3BtreeCreateTable(Btree*, int*, int flags);
danielk19771d850a72004-05-31 08:26:49 +000088int sqlite3BtreeIsInTrans(Btree*);
danielk19772372c2b2006-06-27 16:34:56 +000089int sqlite3BtreeIsInReadTrans(Btree*);
danielk197704103022009-02-03 16:51:24 +000090int sqlite3BtreeIsInBackup(Btree*);
danielk1977da184232006-01-05 11:34:32 +000091void *sqlite3BtreeSchema(Btree *, int, void(*)(void *));
danielk1977602b4662009-07-02 07:47:33 +000092int sqlite3BtreeSchemaLocked(Btree *pBtree);
drh2eb22af2016-09-10 19:51:40 +000093#ifndef SQLITE_OMIT_SHARED_CACHE
danielk1977602b4662009-07-02 07:47:33 +000094int sqlite3BtreeLockTable(Btree *pBtree, int iTab, u8 isWriteLock);
drh2eb22af2016-09-10 19:51:40 +000095#endif
danielk1977fd7f0452008-12-17 17:30:26 +000096int sqlite3BtreeSavepoint(Btree *, int, int);
drh3aac2dd2004-04-26 14:10:20 +000097
danielk19774adee202004-05-08 08:23:19 +000098const char *sqlite3BtreeGetFilename(Btree *);
danielk19775865e3d2004-06-14 06:03:57 +000099const char *sqlite3BtreeGetJournalname(Btree *);
danielk19774adee202004-05-08 08:23:19 +0000100int sqlite3BtreeCopyFile(Btree *, Btree *);
101
danielk1977dddbcdc2007-04-26 14:42:34 +0000102int sqlite3BtreeIncrVacuum(Btree *);
103
drh3aac2dd2004-04-26 14:10:20 +0000104/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR
drhd4187c72010-08-30 22:15:45 +0000105** of the flags shown below.
106**
107** Every SQLite table must have either BTREE_INTKEY or BTREE_BLOBKEY set.
108** With BTREE_INTKEY, the table key is a 64-bit integer and arbitrary data
109** is stored in the leaves. (BTREE_INTKEY is used for SQL tables.) With
110** BTREE_BLOBKEY, the key is an arbitrary BLOB and no content is stored
111** anywhere - the key is the content. (BTREE_BLOBKEY is used for SQL
112** indices.)
drh73509ee2003-04-06 20:44:45 +0000113*/
drh8b18dd42004-05-12 19:18:15 +0000114#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */
drhd4187c72010-08-30 22:15:45 +0000115#define BTREE_BLOBKEY 2 /* Table has keys only - no data */
drh73509ee2003-04-06 20:44:45 +0000116
danielk1977a0bf2652004-11-04 14:30:04 +0000117int sqlite3BtreeDropTable(Btree*, int, int*);
danielk1977c7af4842008-10-27 13:59:33 +0000118int sqlite3BtreeClearTable(Btree*, int, int*);
drh079a3072014-03-19 14:10:55 +0000119int sqlite3BtreeClearTableOfCursor(BtCursor*);
dan80231042014-11-12 14:56:02 +0000120int sqlite3BtreeTripAllCursors(Btree*, int, int);
danielk19770d19f7a2009-06-03 11:25:07 +0000121
danielk1977602b4662009-07-02 07:47:33 +0000122void sqlite3BtreeGetMeta(Btree *pBtree, int idx, u32 *pValue);
drh3aac2dd2004-04-26 14:10:20 +0000123int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value);
danielk19770d19f7a2009-06-03 11:25:07 +0000124
danb483eba2012-10-13 19:58:11 +0000125int sqlite3BtreeNewDb(Btree *p);
126
danielk19770d19f7a2009-06-03 11:25:07 +0000127/*
128** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta
129** should be one of the following values. The integer values are assigned
130** to constants so that the offset of the corresponding field in an
131** SQLite database header may be found using the following formula:
132**
133** offset = 36 + (idx * 4)
134**
135** For example, the free-page-count field is located at byte offset 36 of
136** the database file header. The incr-vacuum-flag field is located at
137** byte offset 64 (== 36+4*7).
drh91618562014-12-19 19:28:02 +0000138**
139** The BTREE_DATA_VERSION value is not really a value stored in the header.
140** It is a read-only number computed by the pager. But we merge it with
141** the header value access routines since its access pattern is the same.
142** Call it a "virtual meta value".
danielk19770d19f7a2009-06-03 11:25:07 +0000143*/
144#define BTREE_FREE_PAGE_COUNT 0
145#define BTREE_SCHEMA_VERSION 1
146#define BTREE_FILE_FORMAT 2
147#define BTREE_DEFAULT_CACHE_SIZE 3
148#define BTREE_LARGEST_ROOT_PAGE 4
149#define BTREE_TEXT_ENCODING 5
150#define BTREE_USER_VERSION 6
151#define BTREE_INCR_VACUUM 7
drh4ee09b42013-05-01 19:49:27 +0000152#define BTREE_APPLICATION_ID 8
drh91618562014-12-19 19:28:02 +0000153#define BTREE_DATA_VERSION 15 /* A virtual meta-value */
paulb95a8862003-04-01 21:16:41 +0000154
dan428c2182012-08-06 18:50:11 +0000155/*
drh0df57012015-08-14 15:05:55 +0000156** Kinds of hints that can be passed into the sqlite3BtreeCursorHint()
157** interface.
158**
drh0df57012015-08-14 15:05:55 +0000159** BTREE_HINT_RANGE (arguments: Expr*, Mem*)
160**
161** The first argument is an Expr* (which is guaranteed to be constant for
162** the lifetime of the cursor) that defines constraints on which rows
163** might be fetched with this cursor. The Expr* tree may contain
164** TK_REGISTER nodes that refer to values stored in the array of registers
165** passed as the second parameter. In other words, if Expr.op==TK_REGISTER
166** then the value of the node is the value in Mem[pExpr.iTable]. Any
167** TK_COLUMN node in the expression tree refers to the Expr.iColumn-th
168** column of the b-tree of the cursor. The Expr tree will not contain
169** any function calls nor subqueries nor references to b-trees other than
170** the cursor being hinted.
171**
172** The design of the _RANGE hint is aid b-tree implementations that try
173** to prefetch content from remote machines - to provide those
174** implementations with limits on what needs to be prefetched and thereby
175** reduce network bandwidth.
drh0403cb32015-08-14 23:57:04 +0000176**
177** Note that BTREE_HINT_FLAGS with BTREE_BULKLOAD is the only hint used by
178** standard SQLite. The other hints are provided for extentions that use
179** the SQLite parser and code generator but substitute their own storage
180** engine.
drh0df57012015-08-14 15:05:55 +0000181*/
drhf7854c72015-10-27 13:24:37 +0000182#define BTREE_HINT_RANGE 0 /* Range constraints on queries */
drh0df57012015-08-14 15:05:55 +0000183
184/*
185** Values that may be OR'd together to form the argument to the
186** BTREE_HINT_FLAGS hint for sqlite3BtreeCursorHint():
drhe0997b32015-03-20 14:57:50 +0000187**
188** The BTREE_BULKLOAD flag is set on index cursors when the index is going
189** to be filled with content that is already in sorted order.
190**
191** The BTREE_SEEK_EQ flag is set on cursors that will get OP_SeekGE or
192** OP_SeekLE opcodes for a range search, but where the range of entries
193** selected will all have the same key. In other words, the cursor will
194** be used only for equality key searches.
195**
dan428c2182012-08-06 18:50:11 +0000196*/
drhe0997b32015-03-20 14:57:50 +0000197#define BTREE_BULKLOAD 0x00000001 /* Used to full index in sorted order */
198#define BTREE_SEEK_EQ 0x00000002 /* EQ seeks only - no range seeks */
dan428c2182012-08-06 18:50:11 +0000199
danfd261ec2015-10-22 20:54:33 +0000200/*
201** Flags passed as the third argument to sqlite3BtreeCursor().
dan2b4e9522015-10-23 11:50:23 +0000202**
203** For read-only cursors the wrFlag argument is always zero. For read-write
drh9c0c57a2016-01-21 15:55:37 +0000204** cursors it may be set to either (BTREE_WRCSR|BTREE_FORDELETE) or just
205** (BTREE_WRCSR). If the BTREE_FORDELETE bit is set, then the cursor will
dan2b4e9522015-10-23 11:50:23 +0000206** only be used by SQLite for the following:
207**
drh9c0c57a2016-01-21 15:55:37 +0000208** * to seek to and then delete specific entries, and/or
dan2b4e9522015-10-23 11:50:23 +0000209**
210** * to read values that will be used to create keys that other
211** BTREE_FORDELETE cursors will seek to and delete.
drh9c0c57a2016-01-21 15:55:37 +0000212**
213** The BTREE_FORDELETE flag is an optimization hint. It is not used by
214** by this, the native b-tree engine of SQLite, but it is available to
215** alternative storage engines that might be substituted in place of this
216** b-tree system. For alternative storage engines in which a delete of
217** the main table row automatically deletes corresponding index rows,
218** the FORDELETE flag hint allows those alternative storage engines to
219** skip a lot of work. Namely: FORDELETE cursors may treat all SEEK
220** and DELETE operations as no-ops, and any READ operation against a
221** FORDELETE cursor may return a null row: 0x01 0x00.
danfd261ec2015-10-22 20:54:33 +0000222*/
dan2b4e9522015-10-23 11:50:23 +0000223#define BTREE_WRCSR 0x00000004 /* read-write cursor */
224#define BTREE_FORDELETE 0x00000008 /* Cursor is for seek/delete only */
danfd261ec2015-10-22 20:54:33 +0000225
drh3aac2dd2004-04-26 14:10:20 +0000226int sqlite3BtreeCursor(
danielk1977cd3e8f72008-03-25 09:47:35 +0000227 Btree*, /* BTree containing table to open */
228 int iTable, /* Index of root page */
229 int wrFlag, /* 1 for writing. 0 for read-only */
230 struct KeyInfo*, /* First argument to compare function */
231 BtCursor *pCursor /* Space to write cursor structure */
drh3aac2dd2004-04-26 14:10:20 +0000232);
drh59020f32008-04-26 13:39:46 +0000233int sqlite3BtreeCursorSize(void);
drhf25a5072009-11-18 23:01:25 +0000234void sqlite3BtreeCursorZero(BtCursor*);
drhf7854c72015-10-27 13:24:37 +0000235void sqlite3BtreeCursorHintFlags(BtCursor*, unsigned);
236#ifdef SQLITE_ENABLE_CURSOR_HINTS
drh0403cb32015-08-14 23:57:04 +0000237void sqlite3BtreeCursorHint(BtCursor*, int, ...);
drhf7854c72015-10-27 13:24:37 +0000238#endif
paulb95a8862003-04-01 21:16:41 +0000239
drha34b6762004-05-07 13:30:42 +0000240int sqlite3BtreeCloseCursor(BtCursor*);
drhe63d9992008-08-13 19:11:48 +0000241int sqlite3BtreeMovetoUnpacked(
242 BtCursor*,
243 UnpackedRecord *pUnKey,
244 i64 intKey,
245 int bias,
246 int *pRes
247);
drh6848dad2014-08-22 23:33:03 +0000248int sqlite3BtreeCursorHasMoved(BtCursor*);
249int sqlite3BtreeCursorRestore(BtCursor*, int*);
drhe807bdb2016-01-21 17:06:33 +0000250int sqlite3BtreeDelete(BtCursor*, u8 flags);
251
danf91c1312017-01-10 20:04:38 +0000252/* Allowed flags for sqlite3BtreeDelete() and sqlite3BtreeInsert() */
drhe807bdb2016-01-21 17:06:33 +0000253#define BTREE_SAVEPOSITION 0x02 /* Leave cursor pointing at NEXT or PREV */
drhdef19e32016-01-27 16:26:25 +0000254#define BTREE_AUXDELETE 0x04 /* not the primary delete operation */
danf91c1312017-01-10 20:04:38 +0000255#define BTREE_APPEND 0x08 /* Insert is likely an append */
drhe807bdb2016-01-21 17:06:33 +0000256
drh8eeb4462016-05-21 20:03:42 +0000257/* An instance of the BtreePayload object describes the content of a single
258** entry in either an index or table btree.
259**
260** Index btrees (used for indexes and also WITHOUT ROWID tables) contain
261** an arbitrary key and no data. These btrees have pKey,nKey set to their
262** key and pData,nData,nZero set to zero.
263**
264** Table btrees (used for rowid tables) contain an integer rowid used as
265** the key and passed in the nKey field. The pKey field is zero.
266** pData,nData hold the content of the new entry. nZero extra zero bytes
267** are appended to the end of the content when constructing the entry.
268**
269** This object is used to pass information into sqlite3BtreeInsert(). The
270** same information used to be passed as five separate parameters. But placing
271** the information into this object helps to keep the interface more
272** organized and understandable, and it also helps the resulting code to
273** run a little faster by using fewer registers for parameter passing.
274*/
275struct BtreePayload {
276 const void *pKey; /* Key content for indexes. NULL for tables */
277 sqlite3_int64 nKey; /* Size of pKey for indexes. PRIMARY KEY for tabs */
278 const void *pData; /* Data for tables. NULL for indexes */
drh9b4eaeb2016-11-09 00:10:33 +0000279 struct Mem *aMem; /* First of nMem value in the unpacked pKey */
280 u16 nMem; /* Number of aMem[] value. Might be zero */
drh8eeb4462016-05-21 20:03:42 +0000281 int nData; /* Size of pData. 0 if none. */
282 int nZero; /* Extra zero data appended after pData,nData */
283};
284
285int sqlite3BtreeInsert(BtCursor*, const BtreePayload *pPayload,
danf91c1312017-01-10 20:04:38 +0000286 int flags, int seekResult);
drh3aac2dd2004-04-26 14:10:20 +0000287int sqlite3BtreeFirst(BtCursor*, int *pRes);
288int sqlite3BtreeLast(BtCursor*, int *pRes);
289int sqlite3BtreeNext(BtCursor*, int *pRes);
drhc39e0002004-05-07 23:50:57 +0000290int sqlite3BtreeEof(BtCursor*);
drh3aac2dd2004-04-26 14:10:20 +0000291int sqlite3BtreePrevious(BtCursor*, int *pRes);
drha7c90c42016-06-04 20:37:10 +0000292i64 sqlite3BtreeIntegerKey(BtCursor*);
drhcb3cabd2016-11-25 19:18:28 +0000293int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*);
drha7c90c42016-06-04 20:37:10 +0000294const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt);
295u32 sqlite3BtreePayloadSize(BtCursor*);
drh144f9ea2003-04-16 01:28:16 +0000296
drh1dcdbc02007-01-27 02:24:54 +0000297char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*);
drha34b6762004-05-07 13:30:42 +0000298struct Pager *sqlite3BtreePager(Btree*);
299
drh2eb22af2016-09-10 19:51:40 +0000300#ifndef SQLITE_OMIT_INCRBLOB
drhcb3cabd2016-11-25 19:18:28 +0000301int sqlite3BtreePayloadChecked(BtCursor*, u32 offset, u32 amt, void*);
danielk1977dcbb5d32007-05-04 18:36:44 +0000302int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*);
dan5a500af2014-03-11 20:33:04 +0000303void sqlite3BtreeIncrblobCursor(BtCursor *);
drh2eb22af2016-09-10 19:51:40 +0000304#endif
danielk1977be51a652008-10-08 17:58:48 +0000305void sqlite3BtreeClearCursor(BtCursor *);
dane04dc882010-04-20 18:53:15 +0000306int sqlite3BtreeSetVersion(Btree *pBt, int iVersion);
drhe0997b32015-03-20 14:57:50 +0000307int sqlite3BtreeCursorHasHint(BtCursor*, unsigned int mask);
drh781597f2014-05-21 08:21:07 +0000308int sqlite3BtreeIsReadonly(Btree *pBt);
drhdef68892014-11-04 12:11:23 +0000309int sqlite3HeaderSizeBtree(void);
dane04dc882010-04-20 18:53:15 +0000310
drhea8ffdf2009-07-22 00:35:23 +0000311#ifndef NDEBUG
312int sqlite3BtreeCursorIsValid(BtCursor*);
313#endif
drhd6ef5af2016-11-15 04:00:24 +0000314int sqlite3BtreeCursorIsValidNN(BtCursor*);
drhea8ffdf2009-07-22 00:35:23 +0000315
danielk1977a5533162009-02-24 10:01:51 +0000316#ifndef SQLITE_OMIT_BTREECOUNT
317int sqlite3BtreeCount(BtCursor *, i64 *);
318#endif
319
drha34b6762004-05-07 13:30:42 +0000320#ifdef SQLITE_TEST
drh3e27c022004-07-23 00:01:38 +0000321int sqlite3BtreeCursorInfo(BtCursor*, int*, int);
drhc8629a12004-05-08 20:07:40 +0000322void sqlite3BtreeCursorList(Btree*);
danielk1977b5402fb2005-01-12 07:15:04 +0000323#endif
drhbe0072d2001-09-13 14:46:09 +0000324
dana550f2d2010-08-02 10:47:05 +0000325#ifndef SQLITE_OMIT_WAL
dancdc1f042010-11-18 12:11:05 +0000326 int sqlite3BtreeCheckpoint(Btree*, int, int *, int *);
dana550f2d2010-08-02 10:47:05 +0000327#endif
328
drhb1ab8ea2007-08-29 00:33:07 +0000329/*
330** If we are not using shared cache, then there is no need to
331** use mutexes to access the BtShared structures. So make the
332** Enter and Leave procedures no-ops.
333*/
danielk1977f7590db2009-04-10 12:55:16 +0000334#ifndef SQLITE_OMIT_SHARED_CACHE
drhb1ab8ea2007-08-29 00:33:07 +0000335 void sqlite3BtreeEnter(Btree*);
danielk1977f7590db2009-04-10 12:55:16 +0000336 void sqlite3BtreeEnterAll(sqlite3*);
dan20d876f2016-01-07 16:06:22 +0000337 int sqlite3BtreeSharable(Btree*);
338 void sqlite3BtreeEnterCursor(BtCursor*);
dan272989b2016-07-06 10:12:02 +0000339 int sqlite3BtreeConnectionCount(Btree*);
danielk1977f7590db2009-04-10 12:55:16 +0000340#else
341# define sqlite3BtreeEnter(X)
342# define sqlite3BtreeEnterAll(X)
dan20d876f2016-01-07 16:06:22 +0000343# define sqlite3BtreeSharable(X) 0
344# define sqlite3BtreeEnterCursor(X)
dan272989b2016-07-06 10:12:02 +0000345# define sqlite3BtreeConnectionCount(X) 1
shanea6f6d202008-05-29 03:01:23 +0000346#endif
danielk1977f7590db2009-04-10 12:55:16 +0000347
348#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE
349 void sqlite3BtreeLeave(Btree*);
drhff0587c2007-08-29 17:43:19 +0000350 void sqlite3BtreeLeaveCursor(BtCursor*);
drhb1ab8ea2007-08-29 00:33:07 +0000351 void sqlite3BtreeLeaveAll(sqlite3*);
shanea6f6d202008-05-29 03:01:23 +0000352#ifndef NDEBUG
danielk1977f7590db2009-04-10 12:55:16 +0000353 /* These routines are used inside assert() statements only. */
354 int sqlite3BtreeHoldsMutex(Btree*);
355 int sqlite3BtreeHoldsAllMutexes(sqlite3*);
drh21206082011-04-04 18:22:02 +0000356 int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*);
shanea6f6d202008-05-29 03:01:23 +0000357#endif
danielk1977f7590db2009-04-10 12:55:16 +0000358#else
359
360# define sqlite3BtreeLeave(X)
drhff0587c2007-08-29 17:43:19 +0000361# define sqlite3BtreeLeaveCursor(X)
drhb1ab8ea2007-08-29 00:33:07 +0000362# define sqlite3BtreeLeaveAll(X)
danielk1977f7590db2009-04-10 12:55:16 +0000363
364# define sqlite3BtreeHoldsMutex(X) 1
365# define sqlite3BtreeHoldsAllMutexes(X) 1
drhe54e0512011-04-05 17:31:56 +0000366# define sqlite3SchemaMutexHeld(X,Y,Z) 1
drh900b31e2007-08-28 02:27:51 +0000367#endif
368
369
drh43f58d62016-07-09 16:14:45 +0000370#endif /* SQLITE_BTREE_H */