Ported FLAIM to FTK.

git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@509 0109f412-320b-0410-ab79-c3e0c5ffbbe6
This commit is contained in:
ahodgkinson
2006-06-05 22:59:36 +00:00
parent 728ce20c8d
commit 7de8b6be39
188 changed files with 7093 additions and 73582 deletions

View File

@@ -42,7 +42,7 @@ FSTATIC RCODE flmCopyDb(
void * UserData);
FSTATIC RCODE flmCopyFile(
F_FileSystemImp * pFileSystem,
IF_FileSystem * pFileSystem,
FLMUINT uiStartOffset,
FLMUINT uiEndOffset,
DB_COPY_INFO * pDbCopyInfo,
@@ -162,25 +162,27 @@ FSTATIC RCODE flmCopyDb(
FLMUINT uiFileNumber;
FLMUINT uiHighFileNumber;
FLMUINT uiHighLogFileNumber;
FLMUINT uiFileSize;
FFILE * pFile;
FLMUINT64 ui64FileSize;
FFILE * pFile = NULL;
FLMBOOL bMutexLocked = FALSE;
F_FileHdlImp * pLockFileHdl = NULL;
F_FileHdlImp * pTmpFileHdl = NULL;
F_DirHdl * pDirHdl = NULL;
IF_FileHdl * pLockFileHdl = NULL;
IF_FileHdl * pTmpFileHdl = NULL;
IF_DirHdl * pDirHdl = NULL;
FLMBOOL bFileLocked = FALSE;
FLMBOOL bWriteLocked = FALSE;
ServerLockObject * pWriteLockObj = NULL;
ServerLockObject * pFileLockObj = NULL;
IF_LockObject * pWriteLockObj = NULL;
IF_LockObject * pFileLockObj = NULL;
COPIED_NAME * pCopiedList = NULL;
FLMBOOL bUsedFFile = FALSE;
FLMBYTE * pucInMemLogHdr = NULL;
FLOCK_INFO LockInfo;
eLockType currLockType;
FLMUINT uiLockThreadId;
char * pszActualSrcRflPath = NULL;
char * pszSrcPrefix = NULL;
char * pszActualDestRflPath = NULL;
char * pszDestPrefix = NULL;
FLMBOOL bCreatedDestRflDir = FALSE;
F_SEM hWaitSem = F_SEM_NULL;
f_memset( &DbCopyInfo, 0, sizeof( DbCopyInfo));
@@ -191,7 +193,14 @@ FSTATIC RCODE flmCopyDb(
{
goto Exit;
}
// Allocate a semaphore
if( RC_BAD( rc = f_semCreate( &hWaitSem)))
{
goto Exit;
}
// Allocate memory for paths we don't want to push onto the stack.
if (RC_BAD( rc = f_calloc(
@@ -207,13 +216,12 @@ FSTATIC RCODE flmCopyDb(
// Set up the super file object for the source database.
// Must at least open the control file.
if (RC_BAD( rc = SrcSFileHdl.Setup( NULL, pszSrcDbName, pszSrcDataDir)))
if (RC_BAD( rc = SrcSFileHdl.setup( pszSrcDbName, pszSrcDataDir,
uiDbVersion)))
{
goto Exit;
}
SrcSFileHdl.SetDbVersion( uiDbVersion);
// Lock the destination database, if not already locked.
// This is so we can overwrite it without necessarily
// deleting it. May unlock and re-lock the global mutex.
@@ -266,14 +274,15 @@ FSTATIC RCODE flmCopyDb(
// Lock the destination file object and transaction
// object, if not already locked.
pFile->pFileLockObj->GetLockInfo( (FLMINT)0, &LockInfo);
if ((LockInfo.eCurrLockType != FLM_LOCK_EXCLUSIVE) ||
(LockInfo.uiThreadId != f_threadId()))
pFile->pFileLockObj->getLockInfo( 0, &currLockType, &uiLockThreadId, NULL);
if (currLockType != FLM_LOCK_EXCLUSIVE || uiLockThreadId != f_threadId())
{
pFileLockObj = pFile->pFileLockObj;
pFileLockObj->AddRef();
if (RC_BAD( rc = pFileLockObj->Lock( TRUE, NULL, FALSE, TRUE, FLM_NO_TIMEOUT, 0)))
if (RC_BAD( rc = pFileLockObj->lock( hWaitSem,
TRUE, FLM_NO_TIMEOUT, 0)))
{
goto Exit;
}
@@ -282,52 +291,45 @@ FSTATIC RCODE flmCopyDb(
// Lock the write object, if not already locked
pFile->pWriteLockObj->GetLockInfo( (FLMINT)0, &LockInfo);
if ((LockInfo.eCurrLockType != FLM_LOCK_EXCLUSIVE) ||
(LockInfo.uiThreadId != (FLMUINT)f_threadId()))
pFile->pWriteLockObj->getLockInfo( 0, &currLockType, &uiLockThreadId, NULL);
if( currLockType != FLM_LOCK_EXCLUSIVE ||
uiLockThreadId != f_threadId())
{
pWriteLockObj = pFile->pWriteLockObj;
pWriteLockObj->AddRef();
// Only contention here is with the checkpoint thread - wait
// forever until the checkpoint thread gives it up.
if (RC_BAD( rc = dbWriteLock( pFile)))
if( RC_BAD( rc = pWriteLockObj->lock( hWaitSem,
TRUE, FLM_NO_TIMEOUT, 0)))
{
goto Exit;
}
bWriteLocked = TRUE;
}
}
// Set up the super file object for the destination database.
if (RC_BAD( rc = DestSFileHdl.Setup( NULL, pszDestDbName,
pszDestDataDir)))
if (RC_BAD( rc = DestSFileHdl.setup( pszDestDbName, pszDestDataDir,
uiDbVersion)))
{
goto Exit;
}
DestSFileHdl.SetDbVersion( uiDbVersion);
// Setup the ECache manager
if( pFile && pFile->pECacheMgr)
{
DestSFileHdl.setECacheMgr( pFile->pECacheMgr);
}
// See how many files we have and calculate the total size.
uiHighFileNumber = 0;
for (;;)
{
if ((RC_BAD( rc = SrcSFileHdl.GetFileSize(
uiHighFileNumber, &uiFileSize))) || !uiFileSize )
if ((RC_BAD( rc = SrcSFileHdl.getFileSize(
uiHighFileNumber, &ui64FileSize))) || !ui64FileSize )
{
if (rc == FERR_IO_PATH_NOT_FOUND ||
rc == FERR_IO_INVALID_PATH ||
!uiFileSize)
!ui64FileSize)
{
// If the control file doesn't exist, we will return
// path not found.
@@ -343,7 +345,7 @@ FSTATIC RCODE flmCopyDb(
goto Exit;
}
DbCopyInfo.ui64BytesToCopy += (FLMUINT64)uiFileSize;
DbCopyInfo.ui64BytesToCopy += ui64FileSize;
if (uiHighFileNumber == MAX_DATA_BLOCK_FILE_NUMBER( uiDbVersion))
{
break;
@@ -357,12 +359,12 @@ FSTATIC RCODE flmCopyDb(
uiHighLogFileNumber = FIRST_LOG_BLOCK_FILE_NUMBER( uiDbVersion);
for (;;)
{
if ((RC_BAD( rc = SrcSFileHdl.GetFileSize(
uiHighLogFileNumber, &uiFileSize))) || !uiFileSize)
if ((RC_BAD( rc = SrcSFileHdl.getFileSize(
uiHighLogFileNumber, &ui64FileSize))) || !ui64FileSize)
{
if (rc == FERR_IO_PATH_NOT_FOUND ||
rc == FERR_IO_INVALID_PATH ||
!uiFileSize)
!ui64FileSize)
{
if (uiHighLogFileNumber ==
FIRST_LOG_BLOCK_FILE_NUMBER( uiDbVersion))
@@ -379,7 +381,7 @@ FSTATIC RCODE flmCopyDb(
goto Exit;
}
DbCopyInfo.ui64BytesToCopy += (FLMUINT64)uiFileSize;
DbCopyInfo.ui64BytesToCopy += ui64FileSize;
if (uiHighLogFileNumber == MAX_LOG_BLOCK_FILE_NUMBER( uiDbVersion))
{
break;
@@ -399,10 +401,10 @@ FSTATIC RCODE flmCopyDb(
goto Exit;
}
if (RC_BAD( rc = gv_FlmSysData.pFileSystem->Open(
if (RC_BAD( rc = gv_FlmSysData.pFileSystem->openFile(
pszActualSrcRflPath,
F_IO_RDWR | F_IO_SH_DENYNONE | F_IO_DIRECT,
(F_FileHdl **)&pTmpFileHdl)))
FLM_IO_RDWR | FLM_IO_SH_DENYNONE | FLM_IO_DIRECT,
&pTmpFileHdl)))
{
if (rc == FERR_IO_PATH_NOT_FOUND ||
rc == FERR_IO_INVALID_PATH)
@@ -416,13 +418,13 @@ FSTATIC RCODE flmCopyDb(
}
else
{
if (RC_BAD( rc = pTmpFileHdl->Size( &uiFileSize)))
if (RC_BAD( rc = pTmpFileHdl->size( &ui64FileSize)))
{
goto Exit;
}
DbCopyInfo.ui64BytesToCopy += (FLMUINT64)uiFileSize;
pTmpFileHdl->Close();
DbCopyInfo.ui64BytesToCopy += ui64FileSize;
pTmpFileHdl->Release();
pTmpFileHdl = NULL;
}
@@ -435,7 +437,7 @@ FSTATIC RCODE flmCopyDb(
goto Exit;
}
if (RC_BAD( rc = gv_FlmSysData.pFileSystem->OpenDir(
if (RC_BAD( rc = gv_FlmSysData.pFileSystem->openDir(
pszActualSrcRflPath, (char *)"*", &pDirHdl)))
{
goto Exit;
@@ -443,7 +445,7 @@ FSTATIC RCODE flmCopyDb(
for (;;)
{
if( RC_BAD( rc = pDirHdl->Next()))
if( RC_BAD( rc = pDirHdl->next()))
{
if (rc == FERR_IO_NO_MORE_FILES)
{
@@ -459,9 +461,9 @@ FSTATIC RCODE flmCopyDb(
// If the current file is an RFL file, increment ui64BytesToCopy
if( rflGetFileNum( uiDbVersion, pszSrcPrefix,
pDirHdl->CurrentItemName(), &uiFileNumber))
pDirHdl->currentItemName(), &uiFileNumber))
{
DbCopyInfo.ui64BytesToCopy += (FLMUINT64)pDirHdl->CurrentItemSize();
DbCopyInfo.ui64BytesToCopy += pDirHdl->currentItemSize();
}
}
@@ -471,8 +473,8 @@ FSTATIC RCODE flmCopyDb(
// Close all file handles in the source and destination
SrcSFileHdl.ReleaseFiles( TRUE);
DestSFileHdl.ReleaseFiles( TRUE);
SrcSFileHdl.releaseFiles( TRUE);
DestSFileHdl.releaseFiles( TRUE);
// Copy the database files.
@@ -481,12 +483,12 @@ FSTATIC RCODE flmCopyDb(
// Get the source file path and destination file path.
if( RC_BAD( rc = SrcSFileHdl.GetFilePath(
if( RC_BAD( rc = SrcSFileHdl.getFilePath(
uiFileNumber, DbCopyInfo.szSrcFileName)))
{
goto Exit;
}
if( RC_BAD( rc = DestSFileHdl.GetFilePath(
if( RC_BAD( rc = DestSFileHdl.getFilePath(
uiFileNumber, DbCopyInfo.szDestFileName)))
{
goto Exit;
@@ -529,13 +531,13 @@ FSTATIC RCODE flmCopyDb(
// Get the source file path and destination file path.
if (RC_BAD( rc = SrcSFileHdl.GetFilePath( uiFileNumber,
if (RC_BAD( rc = SrcSFileHdl.getFilePath( uiFileNumber,
DbCopyInfo.szSrcFileName)))
{
goto Exit;
}
if (RC_BAD( rc = DestSFileHdl.GetFilePath( uiFileNumber,
if (RC_BAD( rc = DestSFileHdl.getFilePath( uiFileNumber,
DbCopyInfo.szDestFileName)))
{
goto Exit;
@@ -594,18 +596,19 @@ FSTATIC RCODE flmCopyDb(
goto Exit;
}
if( RC_OK( gv_FlmSysData.pFileSystem->Exists( pszActualDestRflPath)))
if( RC_OK( gv_FlmSysData.pFileSystem->doesFileExist(
pszActualDestRflPath)))
{
if( gv_FlmSysData.pFileSystem->IsDir( pszActualDestRflPath))
if( gv_FlmSysData.pFileSystem->isDir( pszActualDestRflPath))
{
// Remove the existing directory and all files, etc.
(void)gv_FlmSysData.pFileSystem->RemoveDir(
(void)gv_FlmSysData.pFileSystem->removeDir(
pszActualDestRflPath, TRUE);
}
else
{
(void)gv_FlmSysData.pFileSystem->Delete( pszActualDestRflPath);
(void)gv_FlmSysData.pFileSystem->deleteFile( pszActualDestRflPath);
}
}
@@ -616,14 +619,14 @@ FSTATIC RCODE flmCopyDb(
// when we try to create the destination files (below), the FLAIM file
// file system code will try to create any necessary directories.
(void)gv_FlmSysData.pFileSystem->CreateDir( pszActualDestRflPath);
(void)gv_FlmSysData.pFileSystem->createDir( pszActualDestRflPath);
bCreatedDestRflDir = TRUE;
// Copy the RFL files. NOTE: We need to copy all of the RFL files
// in the source RFL directory so that they will be available
// when performing a database restore operation.
if (RC_BAD( rc = gv_FlmSysData.pFileSystem->OpenDir(
if (RC_BAD( rc = gv_FlmSysData.pFileSystem->openDir(
pszActualSrcRflPath, (char *)"*", &pDirHdl)))
{
goto Exit;
@@ -631,7 +634,7 @@ FSTATIC RCODE flmCopyDb(
for (;;)
{
if( RC_BAD( rc = pDirHdl->Next()))
if( RC_BAD( rc = pDirHdl->next()))
{
if (rc == FERR_IO_NO_MORE_FILES)
{
@@ -647,7 +650,7 @@ FSTATIC RCODE flmCopyDb(
// If the current file is an RFL file, copy it to the destination
if( rflGetFileNum( uiDbVersion, pszSrcPrefix,
pDirHdl->CurrentItemName(), &uiFileNumber))
pDirHdl->currentItemName(), &uiFileNumber))
{
// Get the source file path and the destination file path.
@@ -682,12 +685,12 @@ FSTATIC RCODE flmCopyDb(
// Do one final copy on the control file to copy just the first 2K
if (RC_BAD( rc = SrcSFileHdl.GetFilePath( 0, DbCopyInfo.szSrcFileName)))
if (RC_BAD( rc = SrcSFileHdl.getFilePath( 0, DbCopyInfo.szSrcFileName)))
{
goto Exit;
}
if (RC_BAD( rc = DestSFileHdl.GetFilePath( 0, DbCopyInfo.szDestFileName)))
if (RC_BAD( rc = DestSFileHdl.getFilePath( 0, DbCopyInfo.szDestFileName)))
{
goto Exit;
}
@@ -723,11 +726,13 @@ Exit:
bMutexLocked = FALSE;
}
/* Unlock the file, if it is locked. */
if (bWriteLocked)
{
dbWriteUnlock( pFile);
if( RC_BAD( rc = pWriteLockObj->unlock()))
{
goto Exit;
}
bWriteLocked = FALSE;
}
@@ -735,11 +740,12 @@ Exit:
{
RCODE rc3;
if (RC_BAD( rc3 = pFileLockObj->Unlock( TRUE, NULL)))
if (RC_BAD( rc3 = pFileLockObj->unlock()))
{
if (RC_OK( rc))
rc = rc3;
}
bFileLocked = FALSE;
}
@@ -757,7 +763,6 @@ Exit:
if (pLockFileHdl)
{
(void)pLockFileHdl->Close();
pLockFileHdl->Release();
pLockFileHdl = NULL;
}
@@ -784,7 +789,7 @@ Exit:
if (RC_BAD( rc))
{
(void)gv_FlmSysData.pFileSystem->Delete( pCopiedList->szPath);
(void)gv_FlmSysData.pFileSystem->deleteFile( pCopiedList->szPath);
}
f_free( &pCopiedList);
@@ -793,13 +798,18 @@ Exit:
if( RC_BAD( rc) && bCreatedDestRflDir)
{
(void)gv_FlmSysData.pFileSystem->RemoveDir( pszActualDestRflPath);
(void)gv_FlmSysData.pFileSystem->removeDir( pszActualDestRflPath);
}
if( pszActualSrcRflPath)
{
f_free( &pszActualSrcRflPath);
}
if( hWaitSem != F_SEM_NULL)
{
f_semDestroy( &hWaitSem);
}
return( rc);
}
@@ -808,7 +818,7 @@ Exit:
Desc: Copy a file that is one of the files of the database.
*****************************************************************************/
FSTATIC RCODE flmCopyFile(
F_FileSystemImp * pFileSystem,
IF_FileSystem * pFileSystem,
FLMUINT uiStartOffset,
FLMUINT uiEndOffset,
DB_COPY_INFO * pDbCopyInfo,
@@ -820,8 +830,8 @@ FSTATIC RCODE flmCopyFile(
{
RCODE rc = FERR_OK;
FLMBYTE * pucBuffer = NULL;
F_FileHdlImp * pSrcFileHdl = NULL;
F_FileHdlImp * pDestFileHdl = NULL;
IF_FileHdl * pSrcFileHdl = NULL;
IF_FileHdl * pDestFileHdl = NULL;
FLMUINT uiBufferSize = 32768;
FLMUINT uiBytesToRead;
FLMUINT uiBytesRead;
@@ -833,9 +843,10 @@ FSTATIC RCODE flmCopyFile(
// Open the source file.
if( RC_BAD( rc = gv_FlmSysData.pFileSystem->Open( pDbCopyInfo->szSrcFileName,
F_IO_RDWR | F_IO_SH_DENYNONE | F_IO_DIRECT,
(F_FileHdl **)&pSrcFileHdl)))
if( RC_BAD( rc = gv_FlmSysData.pFileSystem->openFile(
pDbCopyInfo->szSrcFileName,
FLM_IO_RDWR | FLM_IO_SH_DENYNONE | FLM_IO_DIRECT,
&pSrcFileHdl)))
{
goto Exit;
}
@@ -843,9 +854,10 @@ FSTATIC RCODE flmCopyFile(
// First attempt to open the destination file. If it does
// not exist, attempt to create it.
if (RC_BAD( rc = gv_FlmSysData.pFileSystem->Open( pDbCopyInfo->szDestFileName,
F_IO_RDWR | F_IO_SH_DENYNONE | F_IO_DIRECT,
(F_FileHdl **)&pDestFileHdl)))
if (RC_BAD( rc = gv_FlmSysData.pFileSystem->openFile(
pDbCopyInfo->szDestFileName,
FLM_IO_RDWR | FLM_IO_SH_DENYNONE | FLM_IO_DIRECT,
&pDestFileHdl)))
{
if (rc != FERR_IO_PATH_NOT_FOUND &&
rc != FERR_IO_INVALID_PATH)
@@ -853,10 +865,11 @@ FSTATIC RCODE flmCopyFile(
goto Exit;
}
if( RC_BAD( rc = gv_FlmSysData.pFileSystem->Create( pDbCopyInfo->szDestFileName,
F_IO_RDWR | F_IO_EXCL | F_IO_SH_DENYNONE |
F_IO_CREATE_DIR | F_IO_DIRECT,
(F_FileHdl **)&pDestFileHdl)))
if( RC_BAD( rc = gv_FlmSysData.pFileSystem->createFile(
pDbCopyInfo->szDestFileName,
FLM_IO_RDWR | FLM_IO_EXCL | FLM_IO_SH_DENYNONE |
FLM_IO_CREATE_DIR | FLM_IO_DIRECT,
&pDestFileHdl)))
{
goto Exit;
}
@@ -880,7 +893,7 @@ FSTATIC RCODE flmCopyFile(
{
// Read the first 2K of the source file.
if (RC_BAD( rc = pSrcFileHdl->SectorRead( 0L, 2048,
if (RC_BAD( rc = pSrcFileHdl->sectorRead( 0L, 2048,
pucBuffer, &uiBytesRead)))
{
if (rc == FERR_IO_END_OF_FILE)
@@ -905,7 +918,7 @@ FSTATIC RCODE flmCopyFile(
// destination file, these bytes may not be present.
if ((bCreatedDestFile) ||
(RC_BAD( pDestFileHdl->Read( 16L, LOG_HEADER_SIZE,
(RC_BAD( pDestFileHdl->read( 16L, LOG_HEADER_SIZE,
ucLogHdr, &uiBytesRead))))
{
f_memset( ucLogHdr, 0, sizeof(ucLogHdr));
@@ -934,7 +947,7 @@ FSTATIC RCODE flmCopyFile(
// The real first 2K from the source file will be copied in
// at a later time.
if (RC_BAD( rc = pDestFileHdl->Write( 0L, 2048,
if (RC_BAD( rc = pDestFileHdl->write( 0L, 2048,
pucBuffer, &uiBytesWritten)))
{
goto Exit;
@@ -963,7 +976,7 @@ FSTATIC RCODE flmCopyFile(
// Read data from source file.
if (RC_BAD( rc = pSrcFileHdl->SectorRead( uiOffset, uiBytesToRead,
if (RC_BAD( rc = pSrcFileHdl->sectorRead( uiOffset, uiBytesToRead,
pucBuffer, &uiBytesRead)))
{
if (rc == FERR_IO_END_OF_FILE)
@@ -982,7 +995,7 @@ FSTATIC RCODE flmCopyFile(
// Write data to destination file.
if (RC_BAD( rc = pDestFileHdl->Write( uiOffset,
if (RC_BAD( rc = pDestFileHdl->write( uiOffset,
uiBytesRead, pucBuffer, &uiBytesWritten)))
{
goto Exit;
@@ -1029,7 +1042,7 @@ FSTATIC RCODE flmCopyFile(
if (!bCreatedDestFile && bOkToTruncate)
{
if (RC_BAD( rc = pDestFileHdl->Truncate( uiOffset)))
if (RC_BAD( rc = pDestFileHdl->truncate( uiOffset)))
{
goto Exit;
}
@@ -1068,7 +1081,7 @@ Exit:
if (pDestFileHdl)
{
pDestFileHdl->Flush();
pDestFileHdl->flush();
pDestFileHdl->Release();
}
@@ -1077,7 +1090,7 @@ Exit:
if (RC_BAD( rc))
{
(void)pFileSystem->Delete( pDbCopyInfo->szDestFileName);
(void)pFileSystem->deleteFile( pDbCopyInfo->szDestFileName);
}
return( rc);