fix: use C File API

This commit is contained in:
slzhou 2024-02-29 09:47:16 +08:00
parent 2fb0c1a00f
commit 049f27bf3e
1 changed files with 25 additions and 17 deletions

View File

@ -63,8 +63,8 @@ typedef struct SSortMemFile {
int32_t numMemPages; int32_t numMemPages;
SSHashObj* mActivePages; SSHashObj* mActivePages;
//FILE* pTdFile; FILE* pTdFile;
TdFilePtr pTdFile; // TdFilePtr pTdFile;
char memFilePath[PATH_MAX]; char memFilePath[PATH_MAX];
} SSortMemFile; } SSortMemFile;
@ -239,6 +239,14 @@ void destroyTuple(void* t) {
} }
} }
int tsortSeekFile(FILE* file, int64_t offset, int whence) {
#ifdef WINDOWS
return _fseeki64(file, offset, whence);
#else
return fseeko(file, offset, whence);
#endif
}
/** /**
* *
* @param type * @param type
@ -1034,11 +1042,11 @@ static int32_t getPageFromExtMemFile(SSortHandle* pHandle, int32_t pageId, char*
++pMemFile->numMemPages; ++pMemFile->numMemPages;
} }
{ {
int64_t ret = taosLSeekFile(pMemFile->pTdFile, ((int64_t)pageId) * pMemFile->pageSize, SEEK_SET); int ret = tsortSeekFile(pMemFile->pTdFile, ((int64_t)pageId) * pMemFile->pageSize, SEEK_SET);
if (ret >= 0) { if (ret == 0) {
ret = taosReadFile(pMemFile->pTdFile, pEntry->data, pMemFile->pageSize); ret = fread(pEntry->data, pMemFile->pageSize, 1, pMemFile->pTdFile);
} }
if (ret != pMemFile->pageSize) { if (ret != 1) {
terrno = TAOS_SYSTEM_ERROR(errno); terrno = TAOS_SYSTEM_ERROR(errno);
if (freeEntryWhenError) { if (freeEntryWhenError) {
taosMemoryFreeClear(pEntry->data); taosMemoryFreeClear(pEntry->data);
@ -1088,8 +1096,7 @@ static int32_t createSortMemFile(SSortHandle* pHandle) {
SSortMemFile* pMemFile = taosMemoryCalloc(1, sizeof(SSortMemFile)); SSortMemFile* pMemFile = taosMemoryCalloc(1, sizeof(SSortMemFile));
taosGetTmpfilePath(tsTempDir, "sort-ext-mem", pMemFile->memFilePath); taosGetTmpfilePath(tsTempDir, "sort-ext-mem", pMemFile->memFilePath);
pMemFile->pTdFile = pMemFile->pTdFile = fopen(pMemFile->memFilePath, "w+");
taosOpenFile(pMemFile->memFilePath, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_READ | TD_FILE_TRUNC);
if (pMemFile->pTdFile == NULL) { if (pMemFile->pTdFile == NULL) {
taosMemoryFree(pMemFile); taosMemoryFree(pMemFile);
return TAOS_SYSTEM_ERROR(errno); return TAOS_SYSTEM_ERROR(errno);
@ -1133,7 +1140,8 @@ static int32_t destroySortMemFile(SSortHandle* pHandle) {
taosMemoryFree(pMemFile->writePageBuf); taosMemoryFree(pMemFile->writePageBuf);
pMemFile->writePageBuf = NULL; pMemFile->writePageBuf = NULL;
taosCloseFile(&pMemFile->pTdFile); fclose(pMemFile->pTdFile);
pMemFile->pTdFile = NULL;
taosRemoveFile(pMemFile->memFilePath); taosRemoveFile(pMemFile->memFilePath);
taosMemoryFree(pMemFile); taosMemoryFree(pMemFile);
pHandle->pExtRowsMemFile = NULL; pHandle->pExtRowsMemFile = NULL;
@ -1153,11 +1161,11 @@ static int32_t saveBlockRowToExtRowsMemFile(SSortHandle* pHandle, SSDataBlock* p
pMemFile->currPageOffset = 0; pMemFile->currPageOffset = 0;
if (pMemFile->currPageId - pMemFile->startPageId >= pMemFile->numWritePages) { if (pMemFile->currPageId - pMemFile->startPageId >= pMemFile->numWritePages) {
int64_t ret = taosLSeekFile(pMemFile->pTdFile, ((int64_t)pMemFile->startPageId) * pMemFile->pageSize, SEEK_SET); int ret = tsortSeekFile(pMemFile->pTdFile, ((int64_t)pMemFile->startPageId) * pMemFile->pageSize, SEEK_SET);
if (ret >= 0) { if (ret == 0) {
ret = taosWriteFile(pMemFile->pTdFile, pMemFile->writePageBuf, pMemFile->pageSize * pMemFile->numWritePages); ret = fwrite(pMemFile->writePageBuf, pMemFile->pageSize * pMemFile->numWritePages, 1, pMemFile->pTdFile);
} }
if (ret != pMemFile->pageSize * pMemFile->numWritePages) { if (ret != 1) {
terrno = TAOS_SYSTEM_ERROR(errno); terrno = TAOS_SYSTEM_ERROR(errno);
return terrno; return terrno;
} }
@ -1182,12 +1190,12 @@ static int32_t saveDirtyPagesToExtRowsMemFile(SSortHandle* pHandle) {
if (!pMemFile->bDirty) { if (!pMemFile->bDirty) {
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
int64_t ret = taosLSeekFile(pMemFile->pTdFile, ((int64_t)pMemFile->startPageId) * pMemFile->pageSize, SEEK_SET); int ret = tsortSeekFile(pMemFile->pTdFile, ((int64_t)pMemFile->startPageId) * pMemFile->pageSize, SEEK_SET);
int32_t numWriteBytes = pMemFile->pageSize * (pMemFile->currPageId - pMemFile->startPageId + 1); int32_t numWriteBytes = pMemFile->pageSize * (pMemFile->currPageId - pMemFile->startPageId + 1);
if (ret >= 0) { if (ret == 0) {
ret = taosWriteFile(pMemFile->pTdFile, pMemFile->writePageBuf, numWriteBytes); ret = fwrite(pMemFile->writePageBuf, numWriteBytes, 1, pMemFile->pTdFile);
} }
if (ret != numWriteBytes) { if (ret != 1) {
terrno = TAOS_SYSTEM_ERROR(errno); terrno = TAOS_SYSTEM_ERROR(errno);
return terrno; return terrno;
} }