more TDB
This commit is contained in:
parent
13b7ba3edb
commit
cde7a7c6a1
|
@ -381,19 +381,20 @@ static int tdbBtreeInitPage(SPage *pPage, void *arg) {
|
||||||
SBTree *pBt;
|
SBTree *pBt;
|
||||||
u16 flags;
|
u16 flags;
|
||||||
u8 isLeaf;
|
u8 isLeaf;
|
||||||
|
u8 szAmHdr;
|
||||||
|
|
||||||
pBt = (SBTree *)arg;
|
pBt = (SBTree *)arg;
|
||||||
|
|
||||||
flags = TDB_PAGE_FLAGS(pPage);
|
flags = TDB_PAGE_FLAGS(pPage);
|
||||||
isLeaf = TDB_BTREE_PAGE_IS_LEAF(flags);
|
isLeaf = TDB_BTREE_PAGE_IS_LEAF(flags);
|
||||||
if (isLeaf) {
|
if (isLeaf) {
|
||||||
pPage->szAmHdr = 0;
|
szAmHdr = 0;
|
||||||
} else {
|
} else {
|
||||||
pPage->szAmHdr = sizeof(SBtPageHdr);
|
szAmHdr = sizeof(SBtPageHdr);
|
||||||
}
|
}
|
||||||
pPage->xCellSize = NULL; // TODO
|
pPage->xCellSize = NULL; // TODO
|
||||||
|
|
||||||
tdbPageInit(pPage);
|
tdbPageInit(pPage, szAmHdr);
|
||||||
|
|
||||||
TDB_BTREE_ASSERT_FLAG(flags);
|
TDB_BTREE_ASSERT_FLAG(flags);
|
||||||
|
|
||||||
|
@ -416,6 +417,7 @@ static int tdbBtreeZeroPage(SPage *pPage, void *arg) {
|
||||||
u16 flags;
|
u16 flags;
|
||||||
SBTree *pBt;
|
SBTree *pBt;
|
||||||
u8 isLeaf;
|
u8 isLeaf;
|
||||||
|
u8 szAmHdr;
|
||||||
|
|
||||||
flags = ((SBtreeZeroPageArg *)arg)->flags;
|
flags = ((SBtreeZeroPageArg *)arg)->flags;
|
||||||
pBt = ((SBtreeZeroPageArg *)arg)->pBt;
|
pBt = ((SBtreeZeroPageArg *)arg)->pBt;
|
||||||
|
@ -425,13 +427,13 @@ static int tdbBtreeZeroPage(SPage *pPage, void *arg) {
|
||||||
TDB_PAGE_FLAGS_SET(pPage, flags);
|
TDB_PAGE_FLAGS_SET(pPage, flags);
|
||||||
// Set szAmHdr
|
// Set szAmHdr
|
||||||
if (isLeaf) {
|
if (isLeaf) {
|
||||||
pPage->szAmHdr = 0;
|
szAmHdr = 0;
|
||||||
} else {
|
} else {
|
||||||
pPage->szAmHdr = sizeof(SBtPageHdr);
|
szAmHdr = sizeof(SBtPageHdr);
|
||||||
}
|
}
|
||||||
pPage->xCellSize = NULL; // TODO
|
pPage->xCellSize = NULL; // TODO
|
||||||
|
|
||||||
tdbPageZero(pPage);
|
tdbPageZero(pPage, szAmHdr);
|
||||||
|
|
||||||
if (isLeaf) {
|
if (isLeaf) {
|
||||||
pPage->kLen = pBt->keyLen;
|
pPage->kLen = pBt->keyLen;
|
||||||
|
|
|
@ -61,7 +61,6 @@ struct SPage {
|
||||||
u8 *pData;
|
u8 *pData;
|
||||||
SPageMethods *pPageMethods;
|
SPageMethods *pPageMethods;
|
||||||
// Fields below used by pager and am
|
// Fields below used by pager and am
|
||||||
u8 szAmHdr;
|
|
||||||
u8 *pAmHdr;
|
u8 *pAmHdr;
|
||||||
u8 *pPageHdr;
|
u8 *pPageHdr;
|
||||||
u8 *pCellIdx;
|
u8 *pCellIdx;
|
||||||
|
@ -111,8 +110,8 @@ struct SPage {
|
||||||
|
|
||||||
int tdbPageCreate(int pageSize, SPage **ppPage, void *(*xMalloc)(void *, size_t), void *arg);
|
int tdbPageCreate(int pageSize, SPage **ppPage, void *(*xMalloc)(void *, size_t), void *arg);
|
||||||
int tdbPageDestroy(SPage *pPage, void (*xFree)(void *arg, void *ptr), void *arg);
|
int tdbPageDestroy(SPage *pPage, void (*xFree)(void *arg, void *ptr), void *arg);
|
||||||
void tdbPageZero(SPage *pPage);
|
void tdbPageZero(SPage *pPage, u8 szAmHdr);
|
||||||
void tdbPageInit(SPage *pPage);
|
void tdbPageInit(SPage *pPage, u8 szAmHdr);
|
||||||
int tdbPageInsertCell(SPage *pPage, int idx, SCell *pCell, int szCell);
|
int tdbPageInsertCell(SPage *pPage, int idx, SCell *pCell, int szCell);
|
||||||
int tdbPageDropCell(SPage *pPage, int idx);
|
int tdbPageDropCell(SPage *pPage, int idx);
|
||||||
|
|
||||||
|
@ -134,6 +133,7 @@ static inline SCell *tdbPageGetCell(SPage *pPage, int idx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
lidx = idx - iOvfl;
|
lidx = idx - iOvfl;
|
||||||
|
ASSERT(lidx >= 0 && lidx < pPage->pPageMethods->getCellNum(pPage));
|
||||||
pCell = pPage->pData + pPage->pPageMethods->getCellOffset(pPage, lidx);
|
pCell = pPage->pData + pPage->pPageMethods->getCellOffset(pPage, lidx);
|
||||||
|
|
||||||
return pCell;
|
return pCell;
|
||||||
|
|
|
@ -32,8 +32,8 @@ extern SPageMethods pageLargeMethods;
|
||||||
#define TDB_PAGE_NFREE_SET(pPage, NFREE) (*(pPage)->pPageMethods->setFreeBytes)(pPage, NFREE)
|
#define TDB_PAGE_NFREE_SET(pPage, NFREE) (*(pPage)->pPageMethods->setFreeBytes)(pPage, NFREE)
|
||||||
#define TDB_PAGE_CELL_OFFSET_AT_SET(pPage, idx, OFFSET) (*(pPage)->pPageMethods->setCellOffset)(pPage, idx, OFFSET)
|
#define TDB_PAGE_CELL_OFFSET_AT_SET(pPage, idx, OFFSET) (*(pPage)->pPageMethods->setCellOffset)(pPage, idx, OFFSET)
|
||||||
#define TDB_PAGE_CELL_AT(pPage, idx) ((pPage)->pData + TDB_PAGE_CELL_OFFSET_AT(pPage, idx))
|
#define TDB_PAGE_CELL_AT(pPage, idx) ((pPage)->pData + TDB_PAGE_CELL_OFFSET_AT(pPage, idx))
|
||||||
#define TDB_PAGE_MAX_FREE_BLOCK(pPage) \
|
#define TDB_PAGE_MAX_FREE_BLOCK(pPage, szAmHdr) \
|
||||||
((pPage)->pageSize - (pPage)->szAmHdr - TDB_PAGE_HDR_SIZE(pPage) - sizeof(SPageFtr))
|
((pPage)->pageSize - (szAmHdr)-TDB_PAGE_HDR_SIZE(pPage) - sizeof(SPageFtr))
|
||||||
|
|
||||||
static int tdbPageAllocate(SPage *pPage, int size, SCell **ppCell);
|
static int tdbPageAllocate(SPage *pPage, int size, SCell **ppCell);
|
||||||
static int tdbPageDefragment(SPage *pPage);
|
static int tdbPageDefragment(SPage *pPage);
|
||||||
|
@ -79,17 +79,25 @@ int tdbPageDestroy(SPage *pPage, void (*xFree)(void *arg, void *ptr), void *arg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tdbPageZero(SPage *pPage) {
|
void tdbPageZero(SPage *pPage, u8 szAmHdr) {
|
||||||
|
pPage->pAmHdr = pPage->pData;
|
||||||
|
pPage->pPageHdr = pPage->pAmHdr + szAmHdr;
|
||||||
TDB_PAGE_NCELLS_SET(pPage, 0);
|
TDB_PAGE_NCELLS_SET(pPage, 0);
|
||||||
TDB_PAGE_CCELLS_SET(pPage, pPage->pageSize - sizeof(SPageFtr));
|
TDB_PAGE_CCELLS_SET(pPage, pPage->pageSize - sizeof(SPageFtr));
|
||||||
TDB_PAGE_FCELL_SET(pPage, 0);
|
TDB_PAGE_FCELL_SET(pPage, 0);
|
||||||
TDB_PAGE_NFREE_SET(pPage, TDB_PAGE_MAX_FREE_BLOCK(pPage));
|
TDB_PAGE_NFREE_SET(pPage, TDB_PAGE_MAX_FREE_BLOCK(pPage, szAmHdr));
|
||||||
tdbPageInit(pPage);
|
pPage->pCellIdx = pPage->pPageHdr + TDB_PAGE_HDR_SIZE(pPage);
|
||||||
|
pPage->pFreeStart = pPage->pCellIdx;
|
||||||
|
pPage->pFreeEnd = pPage->pData + TDB_PAGE_CCELLS(pPage);
|
||||||
|
pPage->pPageFtr = (SPageFtr *)(pPage->pData + pPage->pageSize - sizeof(SPageFtr));
|
||||||
|
pPage->nOverflow = 0;
|
||||||
|
|
||||||
|
ASSERT((u8 *)pPage->pPageFtr == pPage->pFreeEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tdbPageInit(SPage *pPage) {
|
void tdbPageInit(SPage *pPage, u8 szAmHdr) {
|
||||||
pPage->pAmHdr = pPage->pData;
|
pPage->pAmHdr = pPage->pData;
|
||||||
pPage->pPageHdr = pPage->pAmHdr + pPage->szAmHdr;
|
pPage->pPageHdr = pPage->pAmHdr + szAmHdr;
|
||||||
pPage->pCellIdx = pPage->pPageHdr + TDB_PAGE_HDR_SIZE(pPage);
|
pPage->pCellIdx = pPage->pPageHdr + TDB_PAGE_HDR_SIZE(pPage);
|
||||||
pPage->pFreeStart = pPage->pCellIdx + TDB_PAGE_OFFSET_SIZE(pPage) * TDB_PAGE_NCELLS(pPage);
|
pPage->pFreeStart = pPage->pCellIdx + TDB_PAGE_OFFSET_SIZE(pPage) * TDB_PAGE_NCELLS(pPage);
|
||||||
pPage->pFreeEnd = pPage->pData + TDB_PAGE_CCELLS(pPage);
|
pPage->pFreeEnd = pPage->pData + TDB_PAGE_CCELLS(pPage);
|
||||||
|
@ -107,7 +115,7 @@ int tdbPageInsertCell(SPage *pPage, int idx, SCell *pCell, int szCell) {
|
||||||
int lidx; // local idx
|
int lidx; // local idx
|
||||||
SCell *pNewCell;
|
SCell *pNewCell;
|
||||||
|
|
||||||
ASSERT(szCell <= TDB_PAGE_MAX_FREE_BLOCK(pPage));
|
ASSERT(szCell <= TDB_PAGE_MAX_FREE_BLOCK(pPage, pPage->pPageHdr - pPage->pAmHdr));
|
||||||
|
|
||||||
nFree = TDB_PAGE_NFREE(pPage);
|
nFree = TDB_PAGE_NFREE(pPage);
|
||||||
nCells = TDB_PAGE_NCELLS(pPage);
|
nCells = TDB_PAGE_NCELLS(pPage);
|
||||||
|
|
Loading…
Reference in New Issue