diff --git a/source/libs/tdb/CMakeLists.txt b/source/libs/tdb/CMakeLists.txt index 7d09eecf89..9498b639e0 100644 --- a/source/libs/tdb/CMakeLists.txt +++ b/source/libs/tdb/CMakeLists.txt @@ -8,6 +8,7 @@ add_library(tdb "") target_sources(tdb PRIVATE "src/db/tdbPCache.c" + "src/db/tdbPFile.c" ) target_include_directories( diff --git a/source/libs/tdb/src/db/tdbPFile.c b/source/libs/tdb/src/db/tdbPFile.c index 7c1865e84b..ee77b120b2 100644 --- a/source/libs/tdb/src/db/tdbPFile.c +++ b/source/libs/tdb/src/db/tdbPFile.c @@ -15,207 +15,207 @@ #include "tdbInt.h" -typedef struct SPage1 { - char magic[64]; - SPgno mdbRootPgno; // master DB root page number - SPgno freePgno; // free list page number - uint32_t nFree; // number of free pages -} SPage1; +// typedef struct SPage1 { +// char magic[64]; +// SPgno mdbRootPgno; // master DB root page number +// SPgno freePgno; // free list page number +// uint32_t nFree; // number of free pages +// } SPage1; -typedef struct SFreePage { - /* TODO */ -} SFreePage; +// typedef struct SFreePage { +// /* TODO */ +// } 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) { - SPgFile * pPgFile; - SPgCache *pPgCache; - size_t fnameLen; - SPgno fsize; +// int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv) { +// SPgFile * pPgFile; +// SPgCache *pPgCache; +// size_t fnameLen; +// SPgno fsize; - *ppPgFile = NULL; +// *ppPgFile = NULL; - // create the handle - fnameLen = strlen(fname); - pPgFile = (SPgFile *)calloc(1, sizeof(*pPgFile) + fnameLen + 1); - if (pPgFile == NULL) { - return -1; - } +// // create the handle +// fnameLen = strlen(fname); +// pPgFile = (SPgFile *)calloc(1, sizeof(*pPgFile) + fnameLen + 1); +// if (pPgFile == NULL) { +// return -1; +// } - ASSERT(pEnv != NULL); +// ASSERT(pEnv != NULL); - // init the handle - pPgFile->fname = (char *)(&(pPgFile[1])); - memcpy(pPgFile->fname, fname, fnameLen); - pPgFile->fname[fnameLen] = '\0'; - pPgFile->fd = -1; +// // init the handle +// pPgFile->fname = (char *)(&(pPgFile[1])); +// memcpy(pPgFile->fname, fname, fnameLen); +// pPgFile->fname[fnameLen] = '\0'; +// pPgFile->fd = -1; - pPgFile->fd = open(fname, O_CREAT | O_RDWR, 0755); - if (pPgFile->fd < 0) { - // TODO: handle error - return -1; - } +// pPgFile->fd = open(fname, O_CREAT | O_RDWR, 0755); +// if (pPgFile->fd < 0) { +// // TODO: handle error +// return -1; +// } - tdbGnrtFileID(fname, pPgFile->fileid, false); - tdbGetFileSize(fname, tdbEnvGetPageSize(pEnv), &fsize); +// tdbGnrtFileID(fname, pPgFile->fileid, false); +// tdbGetFileSize(fname, tdbEnvGetPageSize(pEnv), &fsize); - pPgFile->fsize = fsize; - pPgFile->lsize = fsize; +// pPgFile->fsize = fsize; +// pPgFile->lsize = fsize; - if (pPgFile->fsize == 0) { - // A created file - SPgno pgno; - pgid_t pgid; +// if (pPgFile->fsize == 0) { +// // A created file +// SPgno pgno; +// pgid_t pgid; - pgFileAllocatePage(pPgFile, &pgno); +// pgFileAllocatePage(pPgFile, &pgno); - ASSERT(pgno == 1); +// ASSERT(pgno == 1); - memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN); - pgid.pgno = pgno; +// memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN); +// pgid.pgno = pgno; - pgCacheFetch(pPgCache, pgid); - // Need to allocate the first page as a description page - } else { - // An existing file - } +// pgCacheFetch(pPgCache, pgid); +// // Need to allocate the first page as a description page +// } else { +// // An existing file +// } - /* TODO: other open operations */ +// /* TODO: other open operations */ - // add the page file to the environment - tdbEnvRgstPageFile(pEnv, pPgFile); - pPgFile->pEnv = pEnv; +// // add the page file to the environment +// tdbEnvRgstPageFile(pEnv, pPgFile); +// pPgFile->pEnv = pEnv; - *ppPgFile = pPgFile; - return 0; -} +// *ppPgFile = pPgFile; +// return 0; +// } -int pgFileClose(SPgFile *pPgFile) { - if (pPgFile) { - if (pPgFile->fd >= 0) { - close(pPgFile->fd); - } +// int pgFileClose(SPgFile *pPgFile) { +// if (pPgFile) { +// if (pPgFile->fd >= 0) { +// close(pPgFile->fd); +// } - tfree(pPgFile->fname); - free(pPgFile); - } +// tfree(pPgFile->fname); +// free(pPgFile); +// } - return 0; -} +// return 0; +// } -SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno) { - SPgCache *pPgCache; - SPage * pPage; - pgid_t pgid; +// SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno) { +// SPgCache *pPgCache; +// SPage * pPage; +// pgid_t pgid; - // 1. Fetch from the page cache - // pgCacheFetch(pPgCache, pgid); +// // 1. Fetch from the page cache +// // pgCacheFetch(pPgCache, pgid); - // 2. If only get a page frame, no content, maybe - // need to load from the file - if (1 /*page not initialized*/) { - if (pgno < pPgFile->fsize) { - // load the page content from the disk - // ?? How about the freed pages ?? - } else { - // zero the page, make the page as a empty - // page with zero records. - } - } +// // 2. If only get a page frame, no content, maybe +// // need to load from the file +// if (1 /*page not initialized*/) { +// if (pgno < pPgFile->fsize) { +// // load the page content from the disk +// // ?? How about the freed pages ?? +// } else { +// // zero the page, make the page as a empty +// // page with zero records. +// } +// } -#if 0 - pPgCache = pPgFile->pPgCache; - pPage = NULL; - memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN); - pgid.pgno = pgno; +// #if 0 +// pPgCache = pPgFile->pPgCache; +// pPage = NULL; +// memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN); +// pgid.pgno = pgno; - if (pgno > pPgFile->pgFileSize) { - // TODO - } else { - pPage = pgCacheFetch(pPgCache, pgid); - if (1 /*Page is cached, no need to load from file*/) { - return pPage; - } else { - // TODO: handle error - if (pgFileRead(pPgFile, pgno, (void *)pPage) < 0) { - // todoerr - } - return pPage; - } - } -#endif +// if (pgno > pPgFile->pgFileSize) { +// // TODO +// } else { +// pPage = pgCacheFetch(pPgCache, pgid); +// if (1 /*Page is cached, no need to load from file*/) { +// return pPage; +// } else { +// // TODO: handle error +// if (pgFileRead(pPgFile, pgno, (void *)pPage) < 0) { +// // todoerr +// } +// return pPage; +// } +// } +// #endif - return pPage; -} +// return pPage; +// } -int pgFileRelease(SPage *pPage) { - pgCacheRelease(pPage); - return 0; -} +// int pgFileRelease(SPage *pPage) { +// pgCacheRelease(pPage); +// return 0; +// } -int pgFileWrite(SPage *pPage) { - // TODO - return 0; -} +// int pgFileWrite(SPage *pPage) { +// // TODO +// return 0; +// } -int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno) { - SPgno pgno; - SPage1 * pPage1; - SPgCache *pPgCache; - pgid_t pgid; - SPage * pPage; +// int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno) { +// SPgno pgno; +// SPage1 * pPage1; +// SPgCache *pPgCache; +// pgid_t pgid; +// SPage * pPage; - if (pPgFile->lsize == 0) { - pgno = ++(pPgFile->lsize); - } else { - if (0) { - // TODO: allocate from the free list - pPage = pgCacheFetch(pPgCache, pgid); +// if (pPgFile->lsize == 0) { +// pgno = ++(pPgFile->lsize); +// } else { +// if (0) { +// // TODO: allocate from the free list +// pPage = pgCacheFetch(pPgCache, pgid); - if (pPage1->nFree > 0) { - // TODO - } else { - pgno = ++(pPgFile->lsize); - } - } else { - pgno = ++(pPgFile->lsize); - } - } +// if (pPage1->nFree > 0) { +// // TODO +// } else { +// pgno = ++(pPgFile->lsize); +// } +// } else { +// pgno = ++(pPgFile->lsize); +// } +// } - *pPgno = pgno; - return 0; -} +// *pPgno = pgno; +// return 0; +// } -static int pgFileRead(SPgFile *pPgFile, SPgno pgno, uint8_t *pData) { - pgsz_t pgSize; - ssize_t rsize; - uint8_t *pTData; - size_t szToRead; +// static int pgFileRead(SPgFile *pPgFile, SPgno pgno, uint8_t *pData) { +// pgsz_t pgSize; +// ssize_t rsize; +// uint8_t *pTData; +// size_t szToRead; -#if 0 +// #if 0 - // pgSize = ; (TODO) - pTData = pData; - szToRead = pgSize; - for (; szToRead > 0;) { - rsize = pread(pPgFile->fd, pTData, szToRead, pgno * pgSize); - if (rsize < 0) { - if (errno == EINTR) { - continue; - } else { - return -1; - } - } else if (rsize == 0) { - return -1; - } +// // pgSize = ; (TODO) +// pTData = pData; +// szToRead = pgSize; +// for (; szToRead > 0;) { +// rsize = pread(pPgFile->fd, pTData, szToRead, pgno * pgSize); +// if (rsize < 0) { +// if (errno == EINTR) { +// continue; +// } else { +// return -1; +// } +// } else if (rsize == 0) { +// return -1; +// } - szToRead -= rsize; - pTData += rsize; - } -#endif +// szToRead -= rsize; +// pTData += rsize; +// } +// #endif - return 0; -} \ No newline at end of file +// return 0; +// } \ No newline at end of file diff --git a/source/libs/tdb/src/inc/tdbInt.h b/source/libs/tdb/src/inc/tdbInt.h index af019c4f9f..1ba97ec754 100644 --- a/source/libs/tdb/src/inc/tdbInt.h +++ b/source/libs/tdb/src/inc/tdbInt.h @@ -123,7 +123,7 @@ typedef TD_DLIST_NODE(SPgFile) SPgFileListNode; #include "tdbPCache.h" -// #include "tdbPFile.h" +#include "tdbPFile.h" // #include "tdbEnv.h" diff --git a/source/libs/tdb/src/inc/tdbPFile.h b/source/libs/tdb/src/inc/tdbPFile.h index 46e257cf81..0c2378bfbe 100644 --- a/source/libs/tdb/src/inc/tdbPFile.h +++ b/source/libs/tdb/src/inc/tdbPFile.h @@ -20,37 +20,37 @@ extern "C" { #endif -typedef struct __attribute__((__packed__)) { - char hdrInfo[16]; // info string - pgsz_t szPage; // page size of current file - int32_t cno; // commit number counter - SPgno freePgno; // freelist page number - uint8_t resv[100]; // reserved space -} SPgFileHdr; +// typedef struct __attribute__((__packed__)) { +// char hdrInfo[16]; // info string +// pgsz_t szPage; // page size of current file +// int32_t cno; // commit number counter +// SPgno freePgno; // freelist page number +// uint8_t resv[100]; // reserved space +// } 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 { - TENV * pEnv; // env containing this page file - char * fname; // backend file name - uint8_t fileid[TDB_FILE_ID_LEN]; // file id - SPgno lsize; // page file logical size (for count) - SPgno fsize; // real file size on disk (for rollback) - int fd; - SPgFileListNode envHash; - SPgFileListNode envPgfList; -}; +// struct SPgFile { +// TENV * pEnv; // env containing this page file +// char * fname; // backend file name +// uint8_t fileid[TDB_FILE_ID_LEN]; // file id +// SPgno lsize; // page file logical size (for count) +// SPgno fsize; // real file size on disk (for rollback) +// int fd; +// SPgFileListNode envHash; +// SPgFileListNode envPgfList; +// }; -int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv); -int pgFileClose(SPgFile *pPgFile); +// int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv); +// int pgFileClose(SPgFile *pPgFile); -SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno); -int pgFileRelease(SPage *pPage); +// SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno); +// int pgFileRelease(SPage *pPage); -int pgFileWrite(SPage *pPage); -int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno); +// int pgFileWrite(SPage *pPage); +// int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno); #ifdef __cplusplus }