提交 e19fdafd 编写于 作者: H Hongze Cheng

more TDB

上级 49edc62e
......@@ -27,13 +27,19 @@ typedef struct {
} SBtIdx;
// Btree page header definition
typedef struct {
typedef struct __attribute__((__packed__)) {
uint8_t flags;
uint16_t ncells;
pgsz_t pldOffset; // payload offset
/* TODO */
} SBtPgHdr;
typedef int (*BtreeCmprFn)(const void *, const void *);
#define BTREE_PAGE_HDR(pPage) NULL /* TODO */
#define BTREE_PAGE_PAYLOAD_AT(pPage, idx) NULL /*TODO*/
#define BTREE_PAGE_IS_LEAF(pPage) 0 /* TODO */
static int btreeCreate(SBTree **pBt);
static int btreeDestroy(SBTree *pBt);
static int btreeCursorMoveToChild(SBtCursor *pBtCur, pgno_t pgno);
......@@ -78,23 +84,63 @@ int btreeCursorClose(SBtCursor *pBtCur) {
int btreeCursorMoveTo(SBtCursor *pBtCur, int kLen, const void *pKey) {
SPage * pPage;
SBtPgHdr *pBtPgHdr;
SBtPgHdr * pBtPgHdr;
SPgFile * pPgFile;
pgno_t childPgno;
int idx;
pgno_t rootPgno;
int nPayload;
void * pPayload;
BtreeCmprFn cmpFn;
// 1. Move the cursor to the root page
if (rootPgno == TDB_IVLD_PGNO) {
// No any data in this btree, just return not found (TODO)
return 0;
} else {
// Load the page from the file by the SPgFile handle
pPage = pgFileFetch(pPgFile, rootPgno);
pBtCur->pPage = pPage;
}
// 2. Loop to search over the whole tree
for (;;) {
int lidx, ridx, midx, cret;
pPage = pBtCur->pPage;
pBtPgHdr = BTREE_PAGE_HDR(pPage);
nPayload = pBtPgHdr->ncells;
// Loop to search in current page
// Binary search the page
lidx = 0;
ridx = nPayload - 1;
midx = (lidx + ridx) >> 1;
for (;;) {
/* code */
// get the payload ptr at midx
pPayload = BTREE_PAGE_PAYLOAD_AT(pPage, midx);
// the payload and the key
cret = cmpFn(pKey, pPayload);
if (cret < 0) {
/* TODO */
} else if (cret > 0) {
/* TODO */
} else {
/* TODO */
}
if (lidx > ridx) break;
midx = (lidx + ridx) >> 1;
}
if (BTREE_PAGE_IS_LEAF(pPage)) {
/* TODO */
break;
} else {
/* TODO */
btreeCursorMoveToChild(pBtCur, childPgno);
}
}
return 0;
}
......
......@@ -30,7 +30,7 @@ typedef struct __attribute__((__packed__)) {
#define TDB_PG_FILE_HDR_SIZE 128
TD_STATIC_ASSERT(sizeof(SPgFileHdr) == TDB_PG_FILE_HDR_SIZE, "Page file header size if not 128");
TDB_STATIC_ASSERT(sizeof(SPgFileHdr) == TDB_PG_FILE_HDR_SIZE, "Page file header size if not 128");
struct SPgFile {
char * fname; // backend file name
......
......@@ -29,7 +29,7 @@ typedef struct SPgFile SPgFile;
// pgno_t
typedef int32_t pgno_t;
#define TDB_IVLD_PGNO ((pgno_t)-1)
#define TDB_IVLD_PGNO ((pgno_t)0)
// fileid
#define TDB_FILE_ID_LEN 24
......
......@@ -21,9 +21,9 @@ extern "C" {
#endif
#if __STDC_VERSION__ >= 201112L
#define TD_STATIC_ASSERT(op, info) static_assert(op, info)
#define TDB_STATIC_ASSERT(op, info) static_assert(op, info)
#else
#define TD_STATIC_ASSERT(op, info)
#define TDB_STATIC_ASSERT(op, info)
#endif
#define TDB_ROUND8(x) (((x) + 7) & ~7)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册