xref: /sqlite-3.40.0/src/btree.h (revision 8a29dfde)
1 /*
2 ** 2001 September 15
3 **
4 ** The author disclaims copyright to this source code.  In place of
5 ** a legal notice, here is a blessing:
6 **
7 **    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.
10 **
11 *************************************************************************
12 ** This header file defines the interface that the sqlite B-Tree file
13 ** subsystem.  See comments in the source code for a detailed description
14 ** of what each interface routine does.
15 **
16 ** @(#) $Id: btree.h,v 1.97 2008/03/25 17:23:33 drh Exp $
17 */
18 #ifndef _BTREE_H_
19 #define _BTREE_H_
20 
21 /* TODO: This definition is just included so other modules compile. It
22 ** needs to be revisited.
23 */
24 #define SQLITE_N_BTREE_META 10
25 
26 /*
27 ** If defined as non-zero, auto-vacuum is enabled by default. Otherwise
28 ** it must be turned on for each database using "PRAGMA auto_vacuum = 1".
29 */
30 #ifndef SQLITE_DEFAULT_AUTOVACUUM
31   #define SQLITE_DEFAULT_AUTOVACUUM 0
32 #endif
33 
34 #define BTREE_AUTOVACUUM_NONE 0        /* Do not do auto-vacuum */
35 #define BTREE_AUTOVACUUM_FULL 1        /* Do full auto-vacuum */
36 #define BTREE_AUTOVACUUM_INCR 2        /* Incremental vacuum */
37 
38 /*
39 ** Forward declarations of structure
40 */
41 typedef struct Btree Btree;
42 typedef struct BtCursor BtCursor;
43 typedef struct BtShared BtShared;
44 typedef struct BtreeMutexArray BtreeMutexArray;
45 
46 /*
47 ** This structure records all of the Btrees that need to hold
48 ** a mutex before we enter sqlite3VdbeExec().  The Btrees are
49 ** are placed in aBtree[] in order of aBtree[]->pBt.  That way,
50 ** we can always lock and unlock them all quickly.
51 */
52 struct BtreeMutexArray {
53   int nMutex;
54   Btree *aBtree[SQLITE_MAX_ATTACHED+1];
55 };
56 
57 
58 int sqlite3BtreeOpen(
59   const char *zFilename,   /* Name of database file to open */
60   sqlite3 *db,             /* Associated database connection */
61   Btree **,                /* Return open Btree* here */
62   int flags,               /* Flags */
63   int vfsFlags             /* Flags passed through to VFS open */
64 );
65 
66 /* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the
67 ** following values.
68 **
69 ** NOTE:  These values must match the corresponding PAGER_ values in
70 ** pager.h.
71 */
72 #define BTREE_OMIT_JOURNAL  1  /* Do not use journal.  No argument */
73 #define BTREE_NO_READLOCK   2  /* Omit readlocks on readonly files */
74 #define BTREE_MEMORY        4  /* In-memory DB.  No argument */
75 #define BTREE_READONLY      8  /* Open the database in read-only mode */
76 #define BTREE_READWRITE    16  /* Open for both reading and writing */
77 #define BTREE_CREATE       32  /* Create the database if it does not exist */
78 
79 /* Additional values for the 4th argument of sqlite3BtreeOpen that
80 ** are not associated with PAGER_ values.
81 */
82 #define BTREE_PRIVATE      64  /* Never share with other connections */
83 
84 int sqlite3BtreeClose(Btree*);
85 int sqlite3BtreeSetCacheSize(Btree*,int);
86 int sqlite3BtreeSetSafetyLevel(Btree*,int,int);
87 int sqlite3BtreeSyncDisabled(Btree*);
88 int sqlite3BtreeSetPageSize(Btree*,int,int);
89 int sqlite3BtreeGetPageSize(Btree*);
90 int sqlite3BtreeMaxPageCount(Btree*,int);
91 int sqlite3BtreeGetReserve(Btree*);
92 int sqlite3BtreeSetAutoVacuum(Btree *, int);
93 int sqlite3BtreeGetAutoVacuum(Btree *);
94 int sqlite3BtreeBeginTrans(Btree*,int);
95 int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster);
96 int sqlite3BtreeCommitPhaseTwo(Btree*);
97 int sqlite3BtreeCommit(Btree*);
98 int sqlite3BtreeRollback(Btree*);
99 int sqlite3BtreeBeginStmt(Btree*);
100 int sqlite3BtreeCommitStmt(Btree*);
101 int sqlite3BtreeRollbackStmt(Btree*);
102 int sqlite3BtreeCreateTable(Btree*, int*, int flags);
103 int sqlite3BtreeIsInTrans(Btree*);
104 int sqlite3BtreeIsInStmt(Btree*);
105 int sqlite3BtreeIsInReadTrans(Btree*);
106 void *sqlite3BtreeSchema(Btree *, int, void(*)(void *));
107 int sqlite3BtreeSchemaLocked(Btree *);
108 int sqlite3BtreeLockTable(Btree *, int, u8);
109 
110 const char *sqlite3BtreeGetFilename(Btree *);
111 const char *sqlite3BtreeGetDirname(Btree *);
112 const char *sqlite3BtreeGetJournalname(Btree *);
113 int sqlite3BtreeCopyFile(Btree *, Btree *);
114 
115 int sqlite3BtreeIncrVacuum(Btree *);
116 
117 /* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR
118 ** of the following flags:
119 */
120 #define BTREE_INTKEY     1    /* Table has only 64-bit signed integer keys */
121 #define BTREE_ZERODATA   2    /* Table has keys only - no data */
122 #define BTREE_LEAFDATA   4    /* Data stored in leaves only.  Implies INTKEY */
123 
124 int sqlite3BtreeDropTable(Btree*, int, int*);
125 int sqlite3BtreeClearTable(Btree*, int);
126 int sqlite3BtreeGetMeta(Btree*, int idx, u32 *pValue);
127 int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value);
128 void sqlite3BtreeTripAllCursors(Btree*, int);
129 
130 struct UnpackedRecord;  /* Forward declaration.  Definition in vdbeaux.c. */
131 
132 int sqlite3BtreeCursor(
133   Btree*,                              /* BTree containing table to open */
134   int iTable,                          /* Index of root page */
135   int wrFlag,                          /* 1 for writing.  0 for read-only */
136   struct KeyInfo*,                     /* First argument to compare function */
137   BtCursor *pCursor                    /* Space to write cursor structure */
138 );
139 int sqlite3BtreeCursorSize();
140 
141 int sqlite3BtreeCloseCursor(BtCursor*);
142 int sqlite3BtreeMoveto(
143   BtCursor*,
144   const void *pKey,
145   struct UnpackedRecord *pUnKey,
146   i64 nKey,
147   int bias,
148   int *pRes
149 );
150 int sqlite3BtreeDelete(BtCursor*);
151 int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey,
152                                   const void *pData, int nData,
153                                   int nZero, int bias);
154 int sqlite3BtreeFirst(BtCursor*, int *pRes);
155 int sqlite3BtreeLast(BtCursor*, int *pRes);
156 int sqlite3BtreeNext(BtCursor*, int *pRes);
157 int sqlite3BtreeEof(BtCursor*);
158 int sqlite3BtreeFlags(BtCursor*);
159 int sqlite3BtreePrevious(BtCursor*, int *pRes);
160 int sqlite3BtreeKeySize(BtCursor*, i64 *pSize);
161 int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*);
162 sqlite3 *sqlite3BtreeCursorDb(const BtCursor*);
163 const void *sqlite3BtreeKeyFetch(BtCursor*, int *pAmt);
164 const void *sqlite3BtreeDataFetch(BtCursor*, int *pAmt);
165 int sqlite3BtreeDataSize(BtCursor*, u32 *pSize);
166 int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*);
167 
168 char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*);
169 struct Pager *sqlite3BtreePager(Btree*);
170 
171 int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*);
172 void sqlite3BtreeCacheOverflow(BtCursor *);
173 
174 #ifdef SQLITE_TEST
175 int sqlite3BtreeCursorInfo(BtCursor*, int*, int);
176 void sqlite3BtreeCursorList(Btree*);
177 int sqlite3BtreePageDump(Btree*, int, int recursive);
178 #endif
179 
180 /*
181 ** If we are not using shared cache, then there is no need to
182 ** use mutexes to access the BtShared structures.  So make the
183 ** Enter and Leave procedures no-ops.
184 */
185 #if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE
186   void sqlite3BtreeEnter(Btree*);
187   void sqlite3BtreeLeave(Btree*);
188   int sqlite3BtreeHoldsMutex(Btree*);
189   void sqlite3BtreeEnterCursor(BtCursor*);
190   void sqlite3BtreeLeaveCursor(BtCursor*);
191   void sqlite3BtreeEnterAll(sqlite3*);
192   void sqlite3BtreeLeaveAll(sqlite3*);
193   int sqlite3BtreeHoldsAllMutexes(sqlite3*);
194   void sqlite3BtreeMutexArrayEnter(BtreeMutexArray*);
195   void sqlite3BtreeMutexArrayLeave(BtreeMutexArray*);
196   void sqlite3BtreeMutexArrayInsert(BtreeMutexArray*, Btree*);
197 #else
198 # define sqlite3BtreeEnter(X)
199 # define sqlite3BtreeLeave(X)
200 # define sqlite3BtreeHoldsMutex(X) 1
201 # define sqlite3BtreeEnterCursor(X)
202 # define sqlite3BtreeLeaveCursor(X)
203 # define sqlite3BtreeEnterAll(X)
204 # define sqlite3BtreeLeaveAll(X)
205 # define sqlite3BtreeHoldsAllMutexes(X) 1
206 # define sqlite3BtreeMutexArrayEnter(X)
207 # define sqlite3BtreeMutexArrayLeave(X)
208 # define sqlite3BtreeMutexArrayInsert(X,Y)
209 #endif
210 
211 
212 #endif /* _BTREE_H_ */
213