From c9cd5fce3b2e17f2fa8c1d5f5b3bacd0ab5a0c39 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 15 Feb 2022 10:11:07 +0000 Subject: [PATCH] more TDB --- source/libs/tdb/src/db/tdb.c | 9 ++++--- source/libs/tdb/src/db/tdbEnv.c | 1 + source/libs/tdb/src/db/tdbPgFile.c | 38 +++++++++++++++-------------- source/libs/tdb/src/inc/tdbPgFile.h | 12 ++++----- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/source/libs/tdb/src/db/tdb.c b/source/libs/tdb/src/db/tdb.c index df25fe20b8..eab3db13b7 100644 --- a/source/libs/tdb/src/db/tdb.c +++ b/source/libs/tdb/src/db/tdb.c @@ -87,17 +87,20 @@ int tdbOpen(TDB *pDb, const char *fname, const char *dbname, TENV *pEnv) { pDb->dbname[dbNameLen] = '\0'; // open pPgFile or get from the env + pPgFile = NULL; snprintf(dbfname, 128, "%s/%s", tdbEnvGetRootDir(pEnv), fname); fileExist = (tdbCheckFileAccess(fname, TDB_F_OK) == 0); if (fileExist) { - // TODO - } else { + tdbGnrtFileID(dbfname, fileid, false); + pPgFile = tdbEnvGetPageFile(pEnv, fileid); + } + + if (pPgFile == NULL) { ret = pgFileOpen(&pPgFile, dbfname, pEnv); if (ret != 0) { // TODO: handle error return -1; } - // Create and open the page file } #if 0 diff --git a/source/libs/tdb/src/db/tdbEnv.c b/source/libs/tdb/src/db/tdbEnv.c index d88b816a34..f668d3e047 100644 --- a/source/libs/tdb/src/db/tdbEnv.c +++ b/source/libs/tdb/src/db/tdbEnv.c @@ -47,6 +47,7 @@ int tdbEnvCreate(TENV **ppEnv, const char *rootDir) { pEnv->cacheSize = TDB_DEFAULT_CACHE_SIZE; memcpy(pEnv->rootDir, rootDir, slen); + pEnv->rootDir[slen] = '\0'; TD_DLIST_INIT(&(pEnv->dbList)); TD_DLIST_INIT(&(pEnv->pgfList)); diff --git a/source/libs/tdb/src/db/tdbPgFile.c b/source/libs/tdb/src/db/tdbPgFile.c index 07c036d623..9e006aa2b4 100644 --- a/source/libs/tdb/src/db/tdbPgFile.c +++ b/source/libs/tdb/src/db/tdbPgFile.c @@ -20,38 +20,35 @@ static int pgFileRead(SPgFile *pPgFile, pgno_t pgno, uint8_t *pData); int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv) { SPgFile * pPgFile; SPgCache *pPgCache; + size_t fnameLen; *ppPgFile = NULL; - pPgFile = (SPgFile *)calloc(1, sizeof(*pPgFile)); + // create the handle + fnameLen = strlen(fname); + pPgFile = (SPgFile *)calloc(1, sizeof(*pPgFile) + fnameLen + 1); if (pPgFile == NULL) { return -1; } + ASSERT(pEnv != NULL); + + // init the handle + pPgFile->pEnv = pEnv; + pPgFile->fname = (char *)(&(pPgFile[1])); + memcpy(pPgFile->fname, fname, fnameLen); + pPgFile->fname[fnameLen] = '\0'; pPgFile->fd = -1; - pPgFile->fname = strdup(fname); - if (pPgFile->fname == NULL) { - pgFileClose(pPgFile); - return -1; - } - - pPgFile->pPgCache = pPgCache; - // pPgFile->pgSize = ; (TODO) - - pPgFile->fd = open(fname, O_RDWR, 0755); + pPgFile->fd = open(fname, O_CREAT | O_RDWR, 0755); if (pPgFile->fd < 0) { - pgFileClose(pPgFile); + // TODO: handle error return -1; } - if (tdbGnrtFileID(fname, pPgFile->fileid, false) < 0) { - pgFileClose(pPgFile); - return -1; - } + tdbGnrtFileID(fname, pPgFile->fileid, false); - // TODO: get file size - pPgFile->pgFileSize = 0; + /* TODO */ *ppPgFile = pPgFile; return 0; @@ -75,6 +72,7 @@ SPage *pgFileFetch(SPgFile *pPgFile, pgno_t pgno) { SPage * pPage; pgid_t pgid; +#if 0 pPgCache = pPgFile->pPgCache; pPage = NULL; memcpy(pgid.fileid, pPgFile->fileid, TDB_FILE_ID_LEN); @@ -94,6 +92,7 @@ SPage *pgFileFetch(SPgFile *pPgFile, pgno_t pgno) { return pPage; } } +#endif return pPage; } @@ -114,6 +113,8 @@ static int pgFileRead(SPgFile *pPgFile, pgno_t pgno, uint8_t *pData) { uint8_t *pTData; size_t szToRead; +#if 0 + // pgSize = ; (TODO) pTData = pData; szToRead = pgSize; @@ -132,6 +133,7 @@ static int pgFileRead(SPgFile *pPgFile, pgno_t pgno, uint8_t *pData) { szToRead -= rsize; pTData += rsize; } +#endif return 0; } \ No newline at end of file diff --git a/source/libs/tdb/src/inc/tdbPgFile.h b/source/libs/tdb/src/inc/tdbPgFile.h index afe3511fb0..d0b51442d1 100644 --- a/source/libs/tdb/src/inc/tdbPgFile.h +++ b/source/libs/tdb/src/inc/tdbPgFile.h @@ -33,13 +33,11 @@ typedef struct __attribute__((__packed__)) { TDB_STATIC_ASSERT(sizeof(SPgFileHdr) == TDB_PG_FILE_HDR_SIZE, "Page file header size if not 128"); struct SPgFile { - char * fname; // backend file name - uint8_t fileid[TDB_FILE_ID_LEN]; // file id - SPgCache *pPgCache; // page cache underline - pgsz_t pgSize; - int fd; - pgno_t pgFileSize; - TDB * pDb; // For a SPgFile for multiple databases, this is the mapping DB. + TENV * pEnv; // env containing this page file + char * fname; // backend file name + uint8_t fileid[TDB_FILE_ID_LEN]; // file id + int fd; + // TDB * pDb; // For a SPgFile for multiple databases, this is the mapping DB. }; int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv);