more TDB
This commit is contained in:
parent
49edc62e6d
commit
e19fdafda7
|
@ -27,13 +27,19 @@ typedef struct {
|
||||||
} SBtIdx;
|
} SBtIdx;
|
||||||
|
|
||||||
// Btree page header definition
|
// Btree page header definition
|
||||||
typedef struct {
|
typedef struct __attribute__((__packed__)) {
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
uint16_t ncells;
|
uint16_t ncells;
|
||||||
pgsz_t pldOffset; // payload offset
|
pgsz_t pldOffset; // payload offset
|
||||||
/* TODO */
|
/* TODO */
|
||||||
} SBtPgHdr;
|
} 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 btreeCreate(SBTree **pBt);
|
||||||
static int btreeDestroy(SBTree *pBt);
|
static int btreeDestroy(SBTree *pBt);
|
||||||
static int btreeCursorMoveToChild(SBtCursor *pBtCur, pgno_t pgno);
|
static int btreeCursorMoveToChild(SBtCursor *pBtCur, pgno_t pgno);
|
||||||
|
@ -77,23 +83,63 @@ int btreeCursorClose(SBtCursor *pBtCur) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int btreeCursorMoveTo(SBtCursor *pBtCur, int kLen, const void *pKey) {
|
int btreeCursorMoveTo(SBtCursor *pBtCur, int kLen, const void *pKey) {
|
||||||
SPage * pPage;
|
SPage * pPage;
|
||||||
SBtPgHdr *pBtPgHdr;
|
SBtPgHdr * pBtPgHdr;
|
||||||
pgno_t childPgno;
|
SPgFile * pPgFile;
|
||||||
int idx;
|
pgno_t childPgno;
|
||||||
|
pgno_t rootPgno;
|
||||||
|
int nPayload;
|
||||||
|
void * pPayload;
|
||||||
|
BtreeCmprFn cmpFn;
|
||||||
|
|
||||||
// 1. Move the cursor to the root page
|
// 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
|
// 2. Loop to search over the whole tree
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
int lidx, ridx, midx, cret;
|
||||||
|
|
||||||
pPage = pBtCur->pPage;
|
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 (;;) {
|
for (;;) {
|
||||||
/* code */
|
// get the payload ptr at midx
|
||||||
}
|
pPayload = BTREE_PAGE_PAYLOAD_AT(pPage, midx);
|
||||||
|
|
||||||
btreeCursorMoveToChild(pBtCur, childPgno);
|
// 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;
|
return 0;
|
||||||
|
|
|
@ -30,7 +30,7 @@ typedef struct __attribute__((__packed__)) {
|
||||||
|
|
||||||
#define TDB_PG_FILE_HDR_SIZE 128
|
#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 {
|
struct SPgFile {
|
||||||
char * fname; // backend file name
|
char * fname; // backend file name
|
||||||
|
|
|
@ -29,7 +29,7 @@ typedef struct SPgFile SPgFile;
|
||||||
|
|
||||||
// pgno_t
|
// pgno_t
|
||||||
typedef int32_t pgno_t;
|
typedef int32_t pgno_t;
|
||||||
#define TDB_IVLD_PGNO ((pgno_t)-1)
|
#define TDB_IVLD_PGNO ((pgno_t)0)
|
||||||
|
|
||||||
// fileid
|
// fileid
|
||||||
#define TDB_FILE_ID_LEN 24
|
#define TDB_FILE_ID_LEN 24
|
||||||
|
|
|
@ -21,9 +21,9 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __STDC_VERSION__ >= 201112L
|
#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
|
#else
|
||||||
#define TD_STATIC_ASSERT(op, info)
|
#define TDB_STATIC_ASSERT(op, info)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TDB_ROUND8(x) (((x) + 7) & ~7)
|
#define TDB_ROUND8(x) (((x) + 7) & ~7)
|
||||||
|
|
Loading…
Reference in New Issue