提交 1e5c2688 编写于 作者: H Hongze Cheng

refact

上级 68cc3d4f
...@@ -8,6 +8,7 @@ add_library(tdb "") ...@@ -8,6 +8,7 @@ add_library(tdb "")
target_sources(tdb target_sources(tdb
PRIVATE PRIVATE
"src/db/tdbPCache.c" "src/db/tdbPCache.c"
"src/db/tdbPFile.c"
) )
target_include_directories( target_include_directories(
......
...@@ -15,207 +15,207 @@ ...@@ -15,207 +15,207 @@
#include "tdbInt.h" #include "tdbInt.h"
typedef struct SPage1 { // typedef struct SPage1 {
char magic[64]; // char magic[64];
SPgno mdbRootPgno; // master DB root page number // SPgno mdbRootPgno; // master DB root page number
SPgno freePgno; // free list page number // SPgno freePgno; // free list page number
uint32_t nFree; // number of free pages // uint32_t nFree; // number of free pages
} SPage1; // } SPage1;
typedef struct SFreePage { // typedef struct SFreePage {
/* TODO */ // /* TODO */
} SFreePage; // } SFreePage;
TDB_STATIC_ASSERT(sizeof(SPage1) <= TDB_MIN_PGSIZE, "TDB Page1 definition too large"); // TDB_STATIC_ASSERT(sizeof(SPage1) <= TDB_MIN_PGSIZE, "TDB Page1 definition too large");
static int pgFileRead(SPgFile *pPgFile, SPgno pgno, uint8_t *pData); // static int pgFileRead(SPgFile *pPgFile, SPgno pgno, uint8_t *pData);
int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv) { // int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv) {
SPgFile * pPgFile; // SPgFile * pPgFile;
SPgCache *pPgCache; // SPgCache *pPgCache;
size_t fnameLen; // size_t fnameLen;
SPgno fsize; // SPgno fsize;
*ppPgFile = NULL; // *ppPgFile = NULL;
// create the handle // // create the handle
fnameLen = strlen(fname); // fnameLen = strlen(fname);
pPgFile = (SPgFile *)calloc(1, sizeof(*pPgFile) + fnameLen + 1); // pPgFile = (SPgFile *)calloc(1, sizeof(*pPgFile) + fnameLen + 1);
if (pPgFile == NULL) { // if (pPgFile == NULL) {
return -1; // return -1;
} // }
ASSERT(pEnv != NULL); // ASSERT(pEnv != NULL);
// init the handle // // init the handle
pPgFile->fname = (char *)(&(pPgFile[1])); // pPgFile->fname = (char *)(&(pPgFile[1]));
memcpy(pPgFile->fname, fname, fnameLen); // memcpy(pPgFile->fname, fname, fnameLen);
pPgFile->fname[fnameLen] = '\0'; // pPgFile->fname[fnameLen] = '\0';
pPgFile->fd = -1; // pPgFile->fd = -1;
pPgFile->fd = open(fname, O_CREAT | O_RDWR, 0755); // pPgFile->fd = open(fname, O_CREAT | O_RDWR, 0755);
if (pPgFile->fd < 0) { // if (pPgFile->fd < 0) {
// TODO: handle error // // TODO: handle error
return -1; // return -1;
} // }
tdbGnrtFileID(fname, pPgFile->fileid, false); // tdbGnrtFileID(fname, pPgFile->fileid, false);
tdbGetFileSize(fname, tdbEnvGetPageSize(pEnv), &fsize); // tdbGetFileSize(fname, tdbEnvGetPageSize(pEnv), &fsize);
pPgFile->fsize = fsize; // pPgFile->fsize = fsize;
pPgFile->lsize = fsize; // pPgFile->lsize = fsize;
if (pPgFile->fsize == 0) { // if (pPgFile->fsize == 0) {
// A created file // // A created file
SPgno pgno; // SPgno pgno;
pgid_t pgid; // pgid_t pgid;
pgFileAllocatePage(pPgFile, &pgno); // pgFileAllocatePage(pPgFile, &pgno);
ASSERT(pgno == 1); // ASSERT(pgno == 1);
memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN); // memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN);
pgid.pgno = pgno; // pgid.pgno = pgno;
pgCacheFetch(pPgCache, pgid); // pgCacheFetch(pPgCache, pgid);
// Need to allocate the first page as a description page // // Need to allocate the first page as a description page
} else { // } else {
// An existing file // // An existing file
} // }
/* TODO: other open operations */ // /* TODO: other open operations */
// add the page file to the environment // // add the page file to the environment
tdbEnvRgstPageFile(pEnv, pPgFile); // tdbEnvRgstPageFile(pEnv, pPgFile);
pPgFile->pEnv = pEnv; // pPgFile->pEnv = pEnv;
*ppPgFile = pPgFile; // *ppPgFile = pPgFile;
return 0; // return 0;
} // }
int pgFileClose(SPgFile *pPgFile) { // int pgFileClose(SPgFile *pPgFile) {
if (pPgFile) { // if (pPgFile) {
if (pPgFile->fd >= 0) { // if (pPgFile->fd >= 0) {
close(pPgFile->fd); // close(pPgFile->fd);
} // }
tfree(pPgFile->fname); // tfree(pPgFile->fname);
free(pPgFile); // free(pPgFile);
} // }
return 0; // return 0;
} // }
SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno) { // SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno) {
SPgCache *pPgCache; // SPgCache *pPgCache;
SPage * pPage; // SPage * pPage;
pgid_t pgid; // pgid_t pgid;
// 1. Fetch from the page cache // // 1. Fetch from the page cache
// pgCacheFetch(pPgCache, pgid); // // pgCacheFetch(pPgCache, pgid);
// 2. If only get a page frame, no content, maybe // // 2. If only get a page frame, no content, maybe
// need to load from the file // // need to load from the file
if (1 /*page not initialized*/) { // if (1 /*page not initialized*/) {
if (pgno < pPgFile->fsize) { // if (pgno < pPgFile->fsize) {
// load the page content from the disk // // load the page content from the disk
// ?? How about the freed pages ?? // // ?? How about the freed pages ??
} else { // } else {
// zero the page, make the page as a empty // // zero the page, make the page as a empty
// page with zero records. // // page with zero records.
} // }
} // }
#if 0 // #if 0
pPgCache = pPgFile->pPgCache; // pPgCache = pPgFile->pPgCache;
pPage = NULL; // pPage = NULL;
memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN); // memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN);
pgid.pgno = pgno; // pgid.pgno = pgno;
if (pgno > pPgFile->pgFileSize) { // if (pgno > pPgFile->pgFileSize) {
// TODO // // TODO
} else { // } else {
pPage = pgCacheFetch(pPgCache, pgid); // pPage = pgCacheFetch(pPgCache, pgid);
if (1 /*Page is cached, no need to load from file*/) { // if (1 /*Page is cached, no need to load from file*/) {
return pPage; // return pPage;
} else { // } else {
// TODO: handle error // // TODO: handle error
if (pgFileRead(pPgFile, pgno, (void *)pPage) < 0) { // if (pgFileRead(pPgFile, pgno, (void *)pPage) < 0) {
// todoerr // // todoerr
} // }
return pPage; // return pPage;
} // }
} // }
#endif // #endif
return pPage; // return pPage;
} // }
int pgFileRelease(SPage *pPage) { // int pgFileRelease(SPage *pPage) {
pgCacheRelease(pPage); // pgCacheRelease(pPage);
return 0; // return 0;
} // }
int pgFileWrite(SPage *pPage) { // int pgFileWrite(SPage *pPage) {
// TODO // // TODO
return 0; // return 0;
} // }
int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno) { // int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno) {
SPgno pgno; // SPgno pgno;
SPage1 * pPage1; // SPage1 * pPage1;
SPgCache *pPgCache; // SPgCache *pPgCache;
pgid_t pgid; // pgid_t pgid;
SPage * pPage; // SPage * pPage;
if (pPgFile->lsize == 0) { // if (pPgFile->lsize == 0) {
pgno = ++(pPgFile->lsize); // pgno = ++(pPgFile->lsize);
} else { // } else {
if (0) { // if (0) {
// TODO: allocate from the free list // // TODO: allocate from the free list
pPage = pgCacheFetch(pPgCache, pgid); // pPage = pgCacheFetch(pPgCache, pgid);
if (pPage1->nFree > 0) { // if (pPage1->nFree > 0) {
// TODO // // TODO
} else { // } else {
pgno = ++(pPgFile->lsize); // pgno = ++(pPgFile->lsize);
} // }
} else { // } else {
pgno = ++(pPgFile->lsize); // pgno = ++(pPgFile->lsize);
} // }
} // }
*pPgno = pgno; // *pPgno = pgno;
return 0; // return 0;
} // }
static int pgFileRead(SPgFile *pPgFile, SPgno pgno, uint8_t *pData) { // static int pgFileRead(SPgFile *pPgFile, SPgno pgno, uint8_t *pData) {
pgsz_t pgSize; // pgsz_t pgSize;
ssize_t rsize; // ssize_t rsize;
uint8_t *pTData; // uint8_t *pTData;
size_t szToRead; // size_t szToRead;
#if 0 // #if 0
// pgSize = ; (TODO) // // pgSize = ; (TODO)
pTData = pData; // pTData = pData;
szToRead = pgSize; // szToRead = pgSize;
for (; szToRead > 0;) { // for (; szToRead > 0;) {
rsize = pread(pPgFile->fd, pTData, szToRead, pgno * pgSize); // rsize = pread(pPgFile->fd, pTData, szToRead, pgno * pgSize);
if (rsize < 0) { // if (rsize < 0) {
if (errno == EINTR) { // if (errno == EINTR) {
continue; // continue;
} else { // } else {
return -1; // return -1;
} // }
} else if (rsize == 0) { // } else if (rsize == 0) {
return -1; // return -1;
} // }
szToRead -= rsize; // szToRead -= rsize;
pTData += rsize; // pTData += rsize;
} // }
#endif // #endif
return 0; // return 0;
} // }
\ No newline at end of file \ No newline at end of file
...@@ -123,7 +123,7 @@ typedef TD_DLIST_NODE(SPgFile) SPgFileListNode; ...@@ -123,7 +123,7 @@ typedef TD_DLIST_NODE(SPgFile) SPgFileListNode;
#include "tdbPCache.h" #include "tdbPCache.h"
// #include "tdbPFile.h" #include "tdbPFile.h"
// #include "tdbEnv.h" // #include "tdbEnv.h"
......
...@@ -20,37 +20,37 @@ ...@@ -20,37 +20,37 @@
extern "C" { extern "C" {
#endif #endif
typedef struct __attribute__((__packed__)) { // typedef struct __attribute__((__packed__)) {
char hdrInfo[16]; // info string // char hdrInfo[16]; // info string
pgsz_t szPage; // page size of current file // pgsz_t szPage; // page size of current file
int32_t cno; // commit number counter // int32_t cno; // commit number counter
SPgno freePgno; // freelist page number // SPgno freePgno; // freelist page number
uint8_t resv[100]; // reserved space // uint8_t resv[100]; // reserved space
} SPgFileHdr; // } SPgFileHdr;
#define TDB_PG_FILE_HDR_SIZE 128 // #define TDB_PG_FILE_HDR_SIZE 128
TDB_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 {
TENV * pEnv; // env containing this page file // TENV * pEnv; // env containing this page file
char * fname; // backend file name // char * fname; // backend file name
uint8_t fileid[TDB_FILE_ID_LEN]; // file id // uint8_t fileid[TDB_FILE_ID_LEN]; // file id
SPgno lsize; // page file logical size (for count) // SPgno lsize; // page file logical size (for count)
SPgno fsize; // real file size on disk (for rollback) // SPgno fsize; // real file size on disk (for rollback)
int fd; // int fd;
SPgFileListNode envHash; // SPgFileListNode envHash;
SPgFileListNode envPgfList; // SPgFileListNode envPgfList;
}; // };
int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv); // int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv);
int pgFileClose(SPgFile *pPgFile); // int pgFileClose(SPgFile *pPgFile);
SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno); // SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno);
int pgFileRelease(SPage *pPage); // int pgFileRelease(SPage *pPage);
int pgFileWrite(SPage *pPage); // int pgFileWrite(SPage *pPage);
int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno); // int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno);
#ifdef __cplusplus #ifdef __cplusplus
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册