diff options
Diffstat (limited to 'ext/sqlite/libsqlite/src/btree.h')
-rw-r--r-- | ext/sqlite/libsqlite/src/btree.h | 161 |
1 files changed, 123 insertions, 38 deletions
diff --git a/ext/sqlite/libsqlite/src/btree.h b/ext/sqlite/libsqlite/src/btree.h index 84c80c5eff..064b7f97dd 100644 --- a/ext/sqlite/libsqlite/src/btree.h +++ b/ext/sqlite/libsqlite/src/btree.h @@ -18,54 +18,139 @@ #ifndef _BTREE_H_ #define _BTREE_H_ +/* +** Forward declarations of structure +*/ typedef struct Btree Btree; typedef struct BtCursor BtCursor; +typedef struct BtOps BtOps; +typedef struct BtCursorOps BtCursorOps; -int sqliteBtreeOpen(const char *zFilename, int mode, int nPg, Btree **ppBtree); -int sqliteBtreeClose(Btree*); -int sqliteBtreeSetCacheSize(Btree*, int); -int sqliteBtreeSetSafetyLevel(Btree*, int); -int sqliteBtreeBeginTrans(Btree*); -int sqliteBtreeCommit(Btree*); -int sqliteBtreeRollback(Btree*); -int sqliteBtreeBeginCkpt(Btree*); -int sqliteBtreeCommitCkpt(Btree*); -int sqliteBtreeRollbackCkpt(Btree*); - -int sqliteBtreeCreateTable(Btree*, int*); -int sqliteBtreeCreateIndex(Btree*, int*); -int sqliteBtreeDropTable(Btree*, int); -int sqliteBtreeClearTable(Btree*, int); +/* +** An instance of the following structure contains pointers to all +** methods against an open BTree. Alternative BTree implementations +** (examples: file based versus in-memory) can be created by substituting +** different methods. Users of the BTree cannot tell the difference. +** +** In C++ we could do this by defining a virtual base class and then +** creating subclasses for each different implementation. But this is +** C not C++ so we have to be a little more explicit. +*/ +struct BtOps { + int (*Close)(Btree*); + int (*SetCacheSize)(Btree*, int); + int (*SetSafetyLevel)(Btree*, int); + int (*BeginTrans)(Btree*); + int (*Commit)(Btree*); + int (*Rollback)(Btree*); + int (*BeginCkpt)(Btree*); + int (*CommitCkpt)(Btree*); + int (*RollbackCkpt)(Btree*); + int (*CreateTable)(Btree*, int*); + int (*CreateIndex)(Btree*, int*); + int (*DropTable)(Btree*, int); + int (*ClearTable)(Btree*, int); + int (*Cursor)(Btree*, int iTable, int wrFlag, BtCursor **ppCur); + int (*GetMeta)(Btree*, int*); + int (*UpdateMeta)(Btree*, int*); + char *(*IntegrityCheck)(Btree*, int*, int); + const char *(*GetFilename)(Btree*); + int (*Copyfile)(Btree*,Btree*); +#ifdef SQLITE_TEST + int (*PageDump)(Btree*, int, int); + struct Pager *(*Pager)(Btree*); +#endif +}; -int sqliteBtreeCursor(Btree*, int iTable, int wrFlag, BtCursor **ppCur); -int sqliteBtreeMoveto(BtCursor*, const void *pKey, int nKey, int *pRes); -int sqliteBtreeDelete(BtCursor*); -int sqliteBtreeInsert(BtCursor*, const void *pKey, int nKey, - const void *pData, int nData); -int sqliteBtreeFirst(BtCursor*, int *pRes); -int sqliteBtreeLast(BtCursor*, int *pRes); -int sqliteBtreeNext(BtCursor*, int *pRes); -int sqliteBtreePrevious(BtCursor*, int *pRes); -int sqliteBtreeKeySize(BtCursor*, int *pSize); -int sqliteBtreeKey(BtCursor*, int offset, int amt, char *zBuf); -int sqliteBtreeKeyCompare(BtCursor*, const void *pKey, int nKey, - int nIgnore, int *pRes); -int sqliteBtreeDataSize(BtCursor*, int *pSize); -int sqliteBtreeData(BtCursor*, int offset, int amt, char *zBuf); -int sqliteBtreeCloseCursor(BtCursor*); +/* +** An instance of this structure defines all of the methods that can +** be executed against a cursor. +*/ +struct BtCursorOps { + int (*Moveto)(BtCursor*, const void *pKey, int nKey, int *pRes); + int (*Delete)(BtCursor*); + int (*Insert)(BtCursor*, const void *pKey, int nKey, + const void *pData, int nData); + int (*First)(BtCursor*, int *pRes); + int (*Last)(BtCursor*, int *pRes); + int (*Next)(BtCursor*, int *pRes); + int (*Previous)(BtCursor*, int *pRes); + int (*KeySize)(BtCursor*, int *pSize); + int (*Key)(BtCursor*, int offset, int amt, char *zBuf); + int (*KeyCompare)(BtCursor*, const void *pKey, int nKey, + int nIgnore, int *pRes); + int (*DataSize)(BtCursor*, int *pSize); + int (*Data)(BtCursor*, int offset, int amt, char *zBuf); + int (*CloseCursor)(BtCursor*); +#ifdef SQLITE_TEST + int (*CursorDump)(BtCursor*, int*); +#endif +}; +/* +** The number of 4-byte "meta" values contained on the first page of each +** database file. +*/ #define SQLITE_N_BTREE_META 10 -int sqliteBtreeGetMeta(Btree*, int*); -int sqliteBtreeUpdateMeta(Btree*, int*); -char *sqliteBtreeIntegrityCheck(Btree*, int*, int); +int sqliteBtreeOpen(const char *zFilename, int mode, int nPg, Btree **ppBtree); +int sqliteRBtreeOpen(const char *zFilename, int mode, int nPg, Btree **ppBtree); + +#define btOps(pBt) (*((BtOps **)(pBt))) +#define btCOps(pCur) (*((BtCursorOps **)(pCur))) + +#define sqliteBtreeClose(pBt) (btOps(pBt)->Close(pBt)) +#define sqliteBtreeSetCacheSize(pBt, sz) (btOps(pBt)->SetCacheSize(pBt, sz)) +#define sqliteBtreeSetSafetyLevel(pBt, sl) (btOps(pBt)->SetSafetyLevel(pBt, sl)) +#define sqliteBtreeBeginTrans(pBt) (btOps(pBt)->BeginTrans(pBt)) +#define sqliteBtreeCommit(pBt) (btOps(pBt)->Commit(pBt)) +#define sqliteBtreeRollback(pBt) (btOps(pBt)->Rollback(pBt)) +#define sqliteBtreeBeginCkpt(pBt) (btOps(pBt)->BeginCkpt(pBt)) +#define sqliteBtreeCommitCkpt(pBt) (btOps(pBt)->CommitCkpt(pBt)) +#define sqliteBtreeRollbackCkpt(pBt) (btOps(pBt)->RollbackCkpt(pBt)) +#define sqliteBtreeCreateTable(pBt,piTable)\ + (btOps(pBt)->CreateTable(pBt,piTable)) +#define sqliteBtreeCreateIndex(pBt, piIndex)\ + (btOps(pBt)->CreateIndex(pBt, piIndex)) +#define sqliteBtreeDropTable(pBt, iTable) (btOps(pBt)->DropTable(pBt, iTable)) +#define sqliteBtreeClearTable(pBt, iTable)\ + (btOps(pBt)->ClearTable(pBt, iTable)) +#define sqliteBtreeCursor(pBt, iTable, wrFlag, ppCur)\ + (btOps(pBt)->Cursor(pBt, iTable, wrFlag, ppCur)) +#define sqliteBtreeMoveto(pCur, pKey, nKey, pRes)\ + (btCOps(pCur)->Moveto(pCur, pKey, nKey, pRes)) +#define sqliteBtreeDelete(pCur) (btCOps(pCur)->Delete(pCur)) +#define sqliteBtreeInsert(pCur, pKey, nKey, pData, nData) \ + (btCOps(pCur)->Insert(pCur, pKey, nKey, pData, nData)) +#define sqliteBtreeFirst(pCur, pRes) (btCOps(pCur)->First(pCur, pRes)) +#define sqliteBtreeLast(pCur, pRes) (btCOps(pCur)->Last(pCur, pRes)) +#define sqliteBtreeNext(pCur, pRes) (btCOps(pCur)->Next(pCur, pRes)) +#define sqliteBtreePrevious(pCur, pRes) (btCOps(pCur)->Previous(pCur, pRes)) +#define sqliteBtreeKeySize(pCur, pSize) (btCOps(pCur)->KeySize(pCur, pSize) ) +#define sqliteBtreeKey(pCur, offset, amt, zBuf)\ + (btCOps(pCur)->Key(pCur, offset, amt, zBuf)) +#define sqliteBtreeKeyCompare(pCur, pKey, nKey, nIgnore, pRes)\ + (btCOps(pCur)->KeyCompare(pCur, pKey, nKey, nIgnore, pRes)) +#define sqliteBtreeDataSize(pCur, pSize) (btCOps(pCur)->DataSize(pCur, pSize)) +#define sqliteBtreeData(pCur, offset, amt, zBuf)\ + (btCOps(pCur)->Data(pCur, offset, amt, zBuf)) +#define sqliteBtreeCloseCursor(pCur) (btCOps(pCur)->CloseCursor(pCur)) +#define sqliteBtreeGetMeta(pBt, aMeta) (btOps(pBt)->GetMeta(pBt, aMeta)) +#define sqliteBtreeUpdateMeta(pBt, aMeta) (btOps(pBt)->UpdateMeta(pBt, aMeta)) +#define sqliteBtreeIntegrityCheck(pBt, aRoot, nRoot)\ + (btOps(pBt)->IntegrityCheck(pBt, aRoot, nRoot)) +#define sqliteBtreeGetFilename(pBt) (btOps(pBt)->GetFilename(pBt)) +#define sqliteBtreeCopyFile(pBt1, pBt2) (btOps(pBt1)->Copyfile(pBt1, pBt2)) #ifdef SQLITE_TEST -int sqliteBtreePageDump(Btree*, int, int); -int sqliteBtreeCursorDump(BtCursor*, int*); -struct Pager *sqliteBtreePager(Btree*); +#define sqliteBtreePageDump(pBt, pgno, recursive)\ + (btOps(pBt)->PageDump(pBt, pgno, recursive)) +#define sqliteBtreeCursorDump(pCur, aResult)\ + (btCOps(pCur)->CursorDump(pCur, aResult)) +#define sqliteBtreePager(pBt) (btOps(pBt)->Pager(pBt)) int btree_native_byte_order; -#endif +#endif /* SQLITE_TEST */ + #endif /* _BTREE_H_ */ |