xref: /illumos-gate/usr/src/lib/libsqlite/src/btree.h (revision 1da57d55)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate ** 2001 September 15
37c478bd9Sstevel@tonic-gate **
47c478bd9Sstevel@tonic-gate ** The author disclaims copyright to this source code.  In place of
57c478bd9Sstevel@tonic-gate ** a legal notice, here is a blessing:
67c478bd9Sstevel@tonic-gate **
77c478bd9Sstevel@tonic-gate **    May you do good and not evil.
87c478bd9Sstevel@tonic-gate **    May you find forgiveness for yourself and forgive others.
97c478bd9Sstevel@tonic-gate **    May you share freely, never taking more than you give.
107c478bd9Sstevel@tonic-gate **
117c478bd9Sstevel@tonic-gate *************************************************************************
127c478bd9Sstevel@tonic-gate ** This header file defines the interface that the sqlite B-Tree file
137c478bd9Sstevel@tonic-gate ** subsystem.  See comments in the source code for a detailed description
147c478bd9Sstevel@tonic-gate ** of what each interface routine does.
157c478bd9Sstevel@tonic-gate **
167c478bd9Sstevel@tonic-gate ** @(#) $Id: btree.h,v 1.36 2004/02/10 02:57:59 drh Exp $
177c478bd9Sstevel@tonic-gate */
187c478bd9Sstevel@tonic-gate #ifndef _BTREE_H_
197c478bd9Sstevel@tonic-gate #define _BTREE_H_
207c478bd9Sstevel@tonic-gate 
217c478bd9Sstevel@tonic-gate /*
227c478bd9Sstevel@tonic-gate ** Forward declarations of structure
237c478bd9Sstevel@tonic-gate */
247c478bd9Sstevel@tonic-gate typedef struct Btree Btree;
257c478bd9Sstevel@tonic-gate typedef struct BtCursor BtCursor;
267c478bd9Sstevel@tonic-gate typedef struct BtOps BtOps;
277c478bd9Sstevel@tonic-gate typedef struct BtCursorOps BtCursorOps;
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate 
307c478bd9Sstevel@tonic-gate /*
317c478bd9Sstevel@tonic-gate ** An instance of the following structure contains pointers to all
327c478bd9Sstevel@tonic-gate ** methods against an open BTree.  Alternative BTree implementations
337c478bd9Sstevel@tonic-gate ** (examples: file based versus in-memory) can be created by substituting
347c478bd9Sstevel@tonic-gate ** different methods.  Users of the BTree cannot tell the difference.
357c478bd9Sstevel@tonic-gate **
367c478bd9Sstevel@tonic-gate ** In C++ we could do this by defining a virtual base class and then
377c478bd9Sstevel@tonic-gate ** creating subclasses for each different implementation.  But this is
387c478bd9Sstevel@tonic-gate ** C not C++ so we have to be a little more explicit.
397c478bd9Sstevel@tonic-gate */
407c478bd9Sstevel@tonic-gate struct BtOps {
417c478bd9Sstevel@tonic-gate     int (*Close)(Btree*);
427c478bd9Sstevel@tonic-gate     int (*SetCacheSize)(Btree*, int);
437c478bd9Sstevel@tonic-gate     int (*SetSafetyLevel)(Btree*, int);
447c478bd9Sstevel@tonic-gate     int (*BeginTrans)(Btree*);
457c478bd9Sstevel@tonic-gate     int (*Commit)(Btree*);
467c478bd9Sstevel@tonic-gate     int (*Rollback)(Btree*);
477c478bd9Sstevel@tonic-gate     int (*BeginCkpt)(Btree*);
487c478bd9Sstevel@tonic-gate     int (*CommitCkpt)(Btree*);
497c478bd9Sstevel@tonic-gate     int (*RollbackCkpt)(Btree*);
507c478bd9Sstevel@tonic-gate     int (*CreateTable)(Btree*, int*);
517c478bd9Sstevel@tonic-gate     int (*CreateIndex)(Btree*, int*);
527c478bd9Sstevel@tonic-gate     int (*DropTable)(Btree*, int);
537c478bd9Sstevel@tonic-gate     int (*ClearTable)(Btree*, int);
547c478bd9Sstevel@tonic-gate     int (*Cursor)(Btree*, int iTable, int wrFlag, BtCursor **ppCur);
557c478bd9Sstevel@tonic-gate     int (*GetMeta)(Btree*, int*);
567c478bd9Sstevel@tonic-gate     int (*UpdateMeta)(Btree*, int*);
577c478bd9Sstevel@tonic-gate     char *(*IntegrityCheck)(Btree*, int*, int);
587c478bd9Sstevel@tonic-gate     const char *(*GetFilename)(Btree*);
597c478bd9Sstevel@tonic-gate     int (*Copyfile)(Btree*,Btree*);
607c478bd9Sstevel@tonic-gate     struct Pager *(*Pager)(Btree*);
617c478bd9Sstevel@tonic-gate #ifdef SQLITE_TEST
627c478bd9Sstevel@tonic-gate     int (*PageDump)(Btree*, int, int);
637c478bd9Sstevel@tonic-gate #endif
647c478bd9Sstevel@tonic-gate };
657c478bd9Sstevel@tonic-gate 
667c478bd9Sstevel@tonic-gate /*
677c478bd9Sstevel@tonic-gate ** An instance of this structure defines all of the methods that can
687c478bd9Sstevel@tonic-gate ** be executed against a cursor.
697c478bd9Sstevel@tonic-gate */
707c478bd9Sstevel@tonic-gate struct BtCursorOps {
717c478bd9Sstevel@tonic-gate     int (*Moveto)(BtCursor*, const void *pKey, int nKey, int *pRes);
727c478bd9Sstevel@tonic-gate     int (*Delete)(BtCursor*);
737c478bd9Sstevel@tonic-gate     int (*Insert)(BtCursor*, const void *pKey, int nKey,
747c478bd9Sstevel@tonic-gate                              const void *pData, int nData);
757c478bd9Sstevel@tonic-gate     int (*First)(BtCursor*, int *pRes);
767c478bd9Sstevel@tonic-gate     int (*Last)(BtCursor*, int *pRes);
777c478bd9Sstevel@tonic-gate     int (*Next)(BtCursor*, int *pRes);
787c478bd9Sstevel@tonic-gate     int (*Previous)(BtCursor*, int *pRes);
797c478bd9Sstevel@tonic-gate     int (*KeySize)(BtCursor*, int *pSize);
807c478bd9Sstevel@tonic-gate     int (*Key)(BtCursor*, int offset, int amt, char *zBuf);
817c478bd9Sstevel@tonic-gate     int (*KeyCompare)(BtCursor*, const void *pKey, int nKey,
827c478bd9Sstevel@tonic-gate                                  int nIgnore, int *pRes);
837c478bd9Sstevel@tonic-gate     int (*DataSize)(BtCursor*, int *pSize);
847c478bd9Sstevel@tonic-gate     int (*Data)(BtCursor*, int offset, int amt, char *zBuf);
857c478bd9Sstevel@tonic-gate     int (*CloseCursor)(BtCursor*);
867c478bd9Sstevel@tonic-gate #ifdef SQLITE_TEST
877c478bd9Sstevel@tonic-gate     int (*CursorDump)(BtCursor*, int*);
887c478bd9Sstevel@tonic-gate #endif
897c478bd9Sstevel@tonic-gate };
907c478bd9Sstevel@tonic-gate 
917c478bd9Sstevel@tonic-gate /*
927c478bd9Sstevel@tonic-gate ** The number of 4-byte "meta" values contained on the first page of each
937c478bd9Sstevel@tonic-gate ** database file.
947c478bd9Sstevel@tonic-gate */
957c478bd9Sstevel@tonic-gate #define SQLITE_N_BTREE_META 10
967c478bd9Sstevel@tonic-gate 
977c478bd9Sstevel@tonic-gate int sqliteBtreeOpen(const char *zFilename, int mode, int nPg, Btree **ppBtree);
987c478bd9Sstevel@tonic-gate int sqliteRbtreeOpen(const char *zFilename, int mode, int nPg, Btree **ppBtree);
997c478bd9Sstevel@tonic-gate 
1007c478bd9Sstevel@tonic-gate #define btOps(pBt) (*((BtOps **)(pBt)))
1017c478bd9Sstevel@tonic-gate #define btCOps(pCur) (*((BtCursorOps **)(pCur)))
1027c478bd9Sstevel@tonic-gate 
1037c478bd9Sstevel@tonic-gate #define sqliteBtreeClose(pBt)              (btOps(pBt)->Close(pBt))
1047c478bd9Sstevel@tonic-gate #define sqliteBtreeSetCacheSize(pBt, sz)   (btOps(pBt)->SetCacheSize(pBt, sz))
1057c478bd9Sstevel@tonic-gate #define sqliteBtreeSetSafetyLevel(pBt, sl) (btOps(pBt)->SetSafetyLevel(pBt, sl))
1067c478bd9Sstevel@tonic-gate #define sqliteBtreeBeginTrans(pBt)         (btOps(pBt)->BeginTrans(pBt))
1077c478bd9Sstevel@tonic-gate #define sqliteBtreeCommit(pBt)             (btOps(pBt)->Commit(pBt))
1087c478bd9Sstevel@tonic-gate #define sqliteBtreeRollback(pBt)           (btOps(pBt)->Rollback(pBt))
1097c478bd9Sstevel@tonic-gate #define sqliteBtreeBeginCkpt(pBt)          (btOps(pBt)->BeginCkpt(pBt))
1107c478bd9Sstevel@tonic-gate #define sqliteBtreeCommitCkpt(pBt)         (btOps(pBt)->CommitCkpt(pBt))
1117c478bd9Sstevel@tonic-gate #define sqliteBtreeRollbackCkpt(pBt)       (btOps(pBt)->RollbackCkpt(pBt))
1127c478bd9Sstevel@tonic-gate #define sqliteBtreeCreateTable(pBt,piTable)\
1137c478bd9Sstevel@tonic-gate                 (btOps(pBt)->CreateTable(pBt,piTable))
1147c478bd9Sstevel@tonic-gate #define sqliteBtreeCreateIndex(pBt, piIndex)\
1157c478bd9Sstevel@tonic-gate                 (btOps(pBt)->CreateIndex(pBt, piIndex))
1167c478bd9Sstevel@tonic-gate #define sqliteBtreeDropTable(pBt, iTable) (btOps(pBt)->DropTable(pBt, iTable))
1177c478bd9Sstevel@tonic-gate #define sqliteBtreeClearTable(pBt, iTable)\
1187c478bd9Sstevel@tonic-gate                 (btOps(pBt)->ClearTable(pBt, iTable))
1197c478bd9Sstevel@tonic-gate #define sqliteBtreeCursor(pBt, iTable, wrFlag, ppCur)\
1207c478bd9Sstevel@tonic-gate                 (btOps(pBt)->Cursor(pBt, iTable, wrFlag, ppCur))
1217c478bd9Sstevel@tonic-gate #define sqliteBtreeMoveto(pCur, pKey, nKey, pRes)\
1227c478bd9Sstevel@tonic-gate                 (btCOps(pCur)->Moveto(pCur, pKey, nKey, pRes))
1237c478bd9Sstevel@tonic-gate #define sqliteBtreeDelete(pCur)           (btCOps(pCur)->Delete(pCur))
1247c478bd9Sstevel@tonic-gate #define sqliteBtreeInsert(pCur, pKey, nKey, pData, nData) \
1257c478bd9Sstevel@tonic-gate                 (btCOps(pCur)->Insert(pCur, pKey, nKey, pData, nData))
1267c478bd9Sstevel@tonic-gate #define sqliteBtreeFirst(pCur, pRes)      (btCOps(pCur)->First(pCur, pRes))
1277c478bd9Sstevel@tonic-gate #define sqliteBtreeLast(pCur, pRes)       (btCOps(pCur)->Last(pCur, pRes))
1287c478bd9Sstevel@tonic-gate #define sqliteBtreeNext(pCur, pRes)       (btCOps(pCur)->Next(pCur, pRes))
1297c478bd9Sstevel@tonic-gate #define sqliteBtreePrevious(pCur, pRes)   (btCOps(pCur)->Previous(pCur, pRes))
1307c478bd9Sstevel@tonic-gate #define sqliteBtreeKeySize(pCur, pSize)   (btCOps(pCur)->KeySize(pCur, pSize) )
1317c478bd9Sstevel@tonic-gate #define sqliteBtreeKey(pCur, offset, amt, zBuf)\
1327c478bd9Sstevel@tonic-gate                 (btCOps(pCur)->Key(pCur, offset, amt, zBuf))
1337c478bd9Sstevel@tonic-gate #define sqliteBtreeKeyCompare(pCur, pKey, nKey, nIgnore, pRes)\
1347c478bd9Sstevel@tonic-gate                 (btCOps(pCur)->KeyCompare(pCur, pKey, nKey, nIgnore, pRes))
1357c478bd9Sstevel@tonic-gate #define sqliteBtreeDataSize(pCur, pSize)  (btCOps(pCur)->DataSize(pCur, pSize))
1367c478bd9Sstevel@tonic-gate #define sqliteBtreeData(pCur, offset, amt, zBuf)\
1377c478bd9Sstevel@tonic-gate                 (btCOps(pCur)->Data(pCur, offset, amt, zBuf))
1387c478bd9Sstevel@tonic-gate #define sqliteBtreeCloseCursor(pCur)      (btCOps(pCur)->CloseCursor(pCur))
1397c478bd9Sstevel@tonic-gate #define sqliteBtreeGetMeta(pBt, aMeta)    (btOps(pBt)->GetMeta(pBt, aMeta))
1407c478bd9Sstevel@tonic-gate #define sqliteBtreeUpdateMeta(pBt, aMeta) (btOps(pBt)->UpdateMeta(pBt, aMeta))
1417c478bd9Sstevel@tonic-gate #define sqliteBtreeIntegrityCheck(pBt, aRoot, nRoot)\
1427c478bd9Sstevel@tonic-gate                 (btOps(pBt)->IntegrityCheck(pBt, aRoot, nRoot))
1437c478bd9Sstevel@tonic-gate #define sqliteBtreeGetFilename(pBt)       (btOps(pBt)->GetFilename(pBt))
1447c478bd9Sstevel@tonic-gate #define sqliteBtreeCopyFile(pBt1, pBt2)   (btOps(pBt1)->Copyfile(pBt1, pBt2))
1457c478bd9Sstevel@tonic-gate #define sqliteBtreePager(pBt)             (btOps(pBt)->Pager(pBt))
1467c478bd9Sstevel@tonic-gate 
1477c478bd9Sstevel@tonic-gate #ifdef SQLITE_TEST
1487c478bd9Sstevel@tonic-gate #define sqliteBtreePageDump(pBt, pgno, recursive)\
1497c478bd9Sstevel@tonic-gate                 (btOps(pBt)->PageDump(pBt, pgno, recursive))
1507c478bd9Sstevel@tonic-gate #define sqliteBtreeCursorDump(pCur, aResult)\
1517c478bd9Sstevel@tonic-gate                 (btCOps(pCur)->CursorDump(pCur, aResult))
1527c478bd9Sstevel@tonic-gate int btree_native_byte_order;
1537c478bd9Sstevel@tonic-gate #endif /* SQLITE_TEST */
1547c478bd9Sstevel@tonic-gate 
1557c478bd9Sstevel@tonic-gate 
1567c478bd9Sstevel@tonic-gate #endif /* _BTREE_H_ */
157