提交 0b62ccf5 编写于 作者: H Hongze Cheng

more TDB

上级 c479c85a
...@@ -50,7 +50,6 @@ typedef struct { ...@@ -50,7 +50,6 @@ typedef struct {
static int tdbBtCursorMoveTo(SBtCursor *pCur, const void *pKey, int kLen); static int tdbBtCursorMoveTo(SBtCursor *pCur, const void *pKey, int kLen);
static int tdbEncodeLength(u8 *pBuf, uint32_t len); static int tdbEncodeLength(u8 *pBuf, uint32_t len);
static int tdbBtCursorMoveToRoot(SBtCursor *pCur);
static int tdbCompareKeyAndCell(const void *pKey, int kLen, const void *pCell); static int tdbCompareKeyAndCell(const void *pKey, int kLen, const void *pCell);
static int tdbDefaultKeyCmprFn(const void *pKey1, int keyLen1, const void *pKey2, int keyLen2); static int tdbDefaultKeyCmprFn(const void *pKey1, int keyLen1, const void *pKey2, int keyLen2);
static int tdbBtreeOpenImpl(SBTree *pBt); static int tdbBtreeOpenImpl(SBTree *pBt);
...@@ -114,7 +113,7 @@ int tdbBtreeCursor(SBtCursor *pCur, SBTree *pBt) { ...@@ -114,7 +113,7 @@ int tdbBtreeCursor(SBtCursor *pCur, SBTree *pBt) {
pCur->pBt = pBt; pCur->pBt = pBt;
pCur->iPage = -1; pCur->iPage = -1;
pCur->pPage = NULL; pCur->pPage = NULL;
pCur->idx = 0; pCur->idx = -1;
return 0; return 0;
} }
...@@ -129,44 +128,81 @@ int tdbBtCursorInsert(SBtCursor *pCur, const void *pKey, int kLen, const void *p ...@@ -129,44 +128,81 @@ int tdbBtCursorInsert(SBtCursor *pCur, const void *pKey, int kLen, const void *p
return -1; return -1;
} }
if (pCur->idx == -1) {
ASSERT(pCur->pPage->pPageHdr->nCells == 0);
// TODO: insert the K-V pair to idx 0
}
return 0; return 0;
} }
static int tdbBtCursorMoveTo(SBtCursor *pCur, const void *pKey, int kLen) { static int tdbBtCursorMoveTo(SBtCursor *pCur, const void *pKey, int kLen) {
int ret; int ret;
void *pCell; SBTree *pBt;
SPager *pPager;
// ret = tdbBtCursorMoveToRoot(pCur); pBt = pCur->pBt;
// if (ret < 0) { pPager = pBt->pPager;
// return -1;
// }
// if (pCur->pPage->pHdr->nCells == 0) { if (pCur->iPage < 0) {
// // Tree is empty ASSERT(pCur->iPage == -1);
// } else { ASSERT(pCur->idx == -1);
// for (;;) {
// int lidx, ridx, midx, c; // Move from the root
ret = tdbPagerFetchPage(pPager, pBt->root, &(pCur->pPage), tdbBtreeInitPage, pBt);
// pBtPage = pCur->pPage; if (ret < 0) {
// lidx = 0; ASSERT(0);
// ridx = pBtPage->pHdr->nCells - 1; return -1;
// while (lidx <= ridx) { }
// midx = (lidx + ridx) >> 1;
// pCell = (void *)(pBtPage->aData + pBtPage->aCellIdx[midx]); pCur->iPage = 0;
// c = tdbCompareKeyAndCell(pKey, kLen, pCell); if (pCur->pPage->pPageHdr->nCells == 0) {
// if (c == 0) { // Current page is empty
// break; ASSERT(TDB_FLAG_IS(pCur->pPage->pPageHdr->flags, TDB_BTREE_ROOT | TDB_BTREE_LEAF));
// } else if (c < 0) { return 0;
// lidx = lidx + 1; }
// } else {
// ridx = ridx - 1; // Search from root page down to leaf
// } {
// } // TODO
// } ASSERT(0);
// ret = tdbBtCursorMoveToRoot(pCur);
// /* code */ // if (ret < 0) {
// } // return -1;
// }
// if (pCur->pPage->pHdr->nCells == 0) {
// // Tree is empty
// } else {
// for (;;) {
// int lidx, ridx, midx, c;
// pBtPage = pCur->pPage;
// lidx = 0;
// ridx = pBtPage->pHdr->nCells - 1;
// while (lidx <= ridx) {
// midx = (lidx + ridx) >> 1;
// pCell = (void *)(pBtPage->aData + pBtPage->aCellIdx[midx]);
// c = tdbCompareKeyAndCell(pKey, kLen, pCell);
// if (c == 0) {
// break;
// } else if (c < 0) {
// lidx = lidx + 1;
// } else {
// ridx = ridx - 1;
// }
// }
// }
// /* code */
// }
}
} else {
// TODO: Move the cursor from a some position instead of a clear state
}
return 0; return 0;
} }
......
...@@ -130,45 +130,6 @@ int tdbPagerOpenDB(SPager *pPager, SPgno *ppgno, bool toCreate) { ...@@ -130,45 +130,6 @@ int tdbPagerOpenDB(SPager *pPager, SPgno *ppgno, bool toCreate) {
return 0; return 0;
} }
SPage *tdbPagerGet(SPager *pPager, SPgno pgno, bool toLoad) {
SPgid pgid;
SPage *pPage;
int ret;
memcpy(pgid.fileid, pPager->fid, TDB_FILE_ID_LEN);
pgid.pgno = pgno;
// Get page frame from the SPCache
pPage = tdbPCacheFetch(pPager->pCache, &pgid, 1);
if (pPage == NULL) {
// TODO: handle error
return NULL;
}
tdbPCacheFetchFinish(pPager->pCache, pPage);
// Zero the page or load page content from backend
// according to the options
if (pPage->pPager == NULL || !toLoad) {
if (!toLoad || pgno >= pPager->dbFileSize) {
memset(pPage->pData, 0, pPager->pageSize);
} else {
ret = tdbPagerReadPage(pPager, pPage);
if (ret < 0) {
// TODO: Need to drop the page
return NULL;
}
}
if (pPage->pPager) {
ASSERT(pPage->pPager == pPager);
} else {
pPage->pPager = pPager;
}
}
return pPage;
}
int tdbPagerWrite(SPager *pPager, SPage *pPage) { int tdbPagerWrite(SPager *pPager, SPage *pPage) {
int ret; int ret;
......
...@@ -27,7 +27,7 @@ struct SBtCursor { ...@@ -27,7 +27,7 @@ struct SBtCursor {
SBTree *pBt; SBTree *pBt;
i8 iPage; i8 iPage;
SPage * pPage; SPage * pPage;
u16 idx; int idx;
u16 idxStack[BTREE_MAX_DEPTH + 1]; u16 idxStack[BTREE_MAX_DEPTH + 1];
SPage * pgStack[BTREE_MAX_DEPTH + 1]; SPage * pgStack[BTREE_MAX_DEPTH + 1];
void * pBuf; void * pBuf;
......
...@@ -23,7 +23,6 @@ extern "C" { ...@@ -23,7 +23,6 @@ extern "C" {
int tdbPagerOpen(SPCache *pCache, const char *fileName, SPager **ppPager); int tdbPagerOpen(SPCache *pCache, const char *fileName, SPager **ppPager);
int tdbPagerClose(SPager *pPager); int tdbPagerClose(SPager *pPager);
int tdbPagerOpenDB(SPager *pPager, SPgno *ppgno, bool toCreate); int tdbPagerOpenDB(SPager *pPager, SPgno *ppgno, bool toCreate);
SPage *tdbPagerGet(SPager *pPager, SPgno pgno, bool toLoad);
int tdbPagerWrite(SPager *pPager, SPage *pPage); int tdbPagerWrite(SPager *pPager, SPage *pPage);
int tdbPagerBegin(SPager *pPager); int tdbPagerBegin(SPager *pPager);
int tdbPagerCommit(SPager *pPager); int tdbPagerCommit(SPager *pPager);
......
...@@ -16,7 +16,7 @@ TEST(tdb_test, simple_test) { ...@@ -16,7 +16,7 @@ TEST(tdb_test, simple_test) {
GTEST_ASSERT_EQ(ret, 0); GTEST_ASSERT_EQ(ret, 0);
// // Insert some data // // Insert some data
ret = tdbDbInsert(pDb, "1", 1, "world", 5); ret = tdbDbInsert(pDb, "key1", 4, "value1", 6);
GTEST_ASSERT_EQ(ret, 0); GTEST_ASSERT_EQ(ret, 0);
ret = tdbDbDrop(pDb); ret = tdbDbDrop(pDb);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册