diff --git a/source/libs/tdb/src/db/tdbPFile.c b/source/libs/tdb/src/db/tdbPFile.c index ee77b120b23e61d4d1b975208ff35427d7758424..bf4bda83beb0bf8a65adbb1fbedcbc9ccf8c036a 100644 --- a/source/libs/tdb/src/db/tdbPFile.c +++ b/source/libs/tdb/src/db/tdbPFile.c @@ -15,207 +15,72 @@ #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 SFreePage { -// /* TODO */ -// } SFreePage; - -// TDB_STATIC_ASSERT(sizeof(SPage1) <= TDB_MIN_PGSIZE, "TDB Page1 definition too large"); - -// 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; - -// *ppPgFile = NULL; - -// // 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->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; -// } - -// tdbGnrtFileID(fname, pPgFile->fileid, false); -// tdbGetFileSize(fname, tdbEnvGetPageSize(pEnv), &fsize); - -// pPgFile->fsize = fsize; -// pPgFile->lsize = fsize; - -// if (pPgFile->fsize == 0) { -// // A created file -// SPgno pgno; -// pgid_t pgid; - -// pgFileAllocatePage(pPgFile, &pgno); - -// ASSERT(pgno == 1); - -// 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 -// } - -// /* TODO: other open operations */ - -// // add the page file to the environment -// tdbEnvRgstPageFile(pEnv, pPgFile); -// pPgFile->pEnv = pEnv; - -// *ppPgFile = pPgFile; -// return 0; -// } - -// int pgFileClose(SPgFile *pPgFile) { -// if (pPgFile) { -// if (pPgFile->fd >= 0) { -// close(pPgFile->fd); -// } - -// tfree(pPgFile->fname); -// free(pPgFile); -// } - -// return 0; -// } - -// SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno) { -// SPgCache *pPgCache; -// SPage * pPage; -// pgid_t 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. -// } -// } - -// #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 - -// return pPage; -// } - -// int pgFileRelease(SPage *pPage) { -// pgCacheRelease(pPage); -// 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; - -// 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); -// } -// } - -// *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; - -// #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; -// } - -// szToRead -= rsize; -// pTData += rsize; -// } -// #endif - -// return 0; -// } \ No newline at end of file +struct SPFile { + char * dbFileName; + char * jFileName; + uint8_t fid[TDB_FILE_ID_LEN]; + int fd; + int jfd; + SPCache *pCache; + SPgno dbFileSize; + SPgno dbOrigSize; +}; + +int tdbPFileOpen(SPCache *pCache, const char *fileName, SPFile **ppFile) { + uint8_t *pPtr; + SPFile * pFile; + int fsize; + int zsize; + + *ppFile = NULL; + + fsize = strlen(fileName); + zsize = sizeof(*pFile) /* SPFile */ + + fsize + 1 /* dbFileName */ + + fsize + 8 + 1; /* jFileName */ + pPtr = (uint8_t *)calloc(1, zsize); + if (pPtr == NULL) { + return -1; + } + + pFile = (SPFile *)pPtr; + pPtr += sizeof(*pFile); + pFile->dbFileName = (char *)pPtr; + memcpy(pFile->dbFileName, fileName, fsize); + pFile->dbFileName[fsize] = '\0'; + pPtr += fsize + 1; + pFile->jFileName = (char *)pPtr; + memcpy(pFile->jFileName, fileName, fsize); + memcpy(pFile->jFileName + fsize, "-journal", 8); + pFile->jFileName[fsize + 8] = '\0'; + + pFile->fd = open(pFile->dbFileName, O_RDWR | O_CREAT, 0755); + if (pFile->fd < 0) { + return -1; + } + + pFile->jfd = -1; + + *ppFile = pFile; + return 0; +} + +int tdbPFileClose(SPFile *pFile) { + // TODO + return 0; +} + +int tdbPFileBegin(SPFile *pFile) { + // TODO + return 0; +} + +int tdbPFileCommit(SPFile *pFile) { + // TODO + return 0; +} + +int tdbPFileRollback(SPFile *pFile) { + // TODO + return 0; +} \ No newline at end of file diff --git a/source/libs/tdb/src/inc/tdbPFile.h b/source/libs/tdb/src/inc/tdbPFile.h index 74cb2b75061cce7e376a33226996e6d5c14894a8..a6b4620f142a6cc040db22020590f92147162d1a 100644 --- a/source/libs/tdb/src/inc/tdbPFile.h +++ b/source/libs/tdb/src/inc/tdbPFile.h @@ -22,37 +22,11 @@ extern "C" { typedef struct SPFile SPFile; -// 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 - -// 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; -// }; - -// int pgFileOpen(SPgFile **ppPgFile, const char *fname, TENV *pEnv); -// int pgFileClose(SPgFile *pPgFile); - -// SPage *pgFileFetch(SPgFile *pPgFile, SPgno pgno); -// int pgFileRelease(SPage *pPage); - -// int pgFileWrite(SPage *pPage); -// int pgFileAllocatePage(SPgFile *pPgFile, SPgno *pPgno); +int tdbPFileOpen(SPCache *pCache, const char *fileName, SPFile **ppFile); +int tdbPFileClose(SPFile *pFile); +int tdbPFileBegin(SPFile *pFile); +int tdbPFileCommit(SPFile *pFile); +int tdbPFileRollback(SPFile *pFile); #ifdef __cplusplus }