/**************************************************************************** Desc: Searches the SCache for the block referenced by the parameters. If found, it copies the data into pLocalSCache. Assumes that the mutex has already been locked! ****************************************************************************/ RCODE F_SCacheBase::locateSCacheBlock( FLMUINT uiNumParams, const char ** ppszParams, SCACHE * pLocalSCache, FLMUINT * puiBlkAddress, FLMUINT * puiLowTransID, FLMUINT * puiHighTransID, FFILE * * ppFile) { RCODE rc = FERR_OK; FLMUINT uiSigBitsInBlkSize; SCACHE * pSCache; SCACHE ** ppSCache; #define MAXPARAMLEN 15 char szBlkAddress[MAXPARAMLEN]; char szLowTransID[MAXPARAMLEN]; char szHighTransID[MAXPARAMLEN]; char szFile[MAXPARAMLEN]; // Grab the block address, low and high trans id's and FFile pointer, which // we need to uniquely identify an scache block... if (RC_BAD( rc = ExtractParameter( uiNumParams, ppszParams, "BlockAddress", sizeof( szBlkAddress), &szBlkAddress[0]))) { goto Exit; } *puiBlkAddress = f_atoi( szBlkAddress); if (RC_BAD( rc = ExtractParameter( uiNumParams, ppszParams, "LowTransID", sizeof( szLowTransID), &szLowTransID[0]))) { goto Exit; } *puiLowTransID = f_atoi( szLowTransID); if (RC_BAD( rc = ExtractParameter( uiNumParams, ppszParams, "HighTransID", sizeof( szHighTransID), &szHighTransID[0]))) { goto Exit; } *puiHighTransID = f_atoi( szHighTransID); if (RC_BAD( rc = ExtractParameter( uiNumParams, ppszParams, "File", sizeof( szFile), &szFile[0]))) { goto Exit; } *ppFile = (FFILE *)f_atoud( szFile); flmAssert( *ppFile); uiSigBitsInBlkSize = (*ppFile)->FileHdr.uiSigBitsInBlkSize; // ScaHash actually returns a pointer to the first scache in the hash // bucket. It's up to us to traverse this list to find the proper block // address and FFile (and potentially high and low trans id) ppSCache = ScaHash( uiSigBitsInBlkSize, *puiBlkAddress); pSCache = *ppSCache; while ( pSCache && ( (pSCache->uiBlkAddress != *puiBlkAddress) || (pSCache->pFile != *ppFile) ) ) { pSCache = pSCache->pNextInHashBucket; } // Ok - we've found the right address and ffile. Do we need a different // version? while ( (pSCache) && (pSCache->uiHighTransID != *puiHighTransID) && (scaGetLowTransID( pSCache) != *puiLowTransID) ) { pSCache = pSCache->pNextInVersionList; } // Now, if we've found the right block, copy it's contents to local memory... if (pSCache) { f_memcpy( pLocalSCache, pSCache, sizeof( SCACHE)); } else { rc = RC_SET( FERR_NOT_FOUND); goto Exit; } Exit: return( rc); }
/******************************************************************** Desc: ? *********************************************************************/ FSTATIC FLMBOOL bldGetParams( FLMINT iArgC, const char ** ppszArgV) { #define MAX_ARGS 30 FLMUINT uiLoop; char szErrMsg [100]; const char * pszPtr; const char * ppszArgs[ MAX_ARGS]; char szCommandBuffer [300]; gv_szSrcFileName [0] = 0; gv_szSrcDataDir [0] = 0; gv_szDestFileName [0] = 0; gv_szDestDataDir [0] = 0; gv_szDestRflDir [0] = 0; gv_szDictFileName [0] = 0; gv_szLogFileName [0] = 0; gv_bFixHdrInfo = FALSE; gv_DefaultCreateOpts.uiBlockSize = DEFAULT_BLKSIZ; gv_DefaultCreateOpts.uiMinRflFileSize = DEFAULT_MIN_RFL_FILE_SIZE; gv_DefaultCreateOpts.uiMaxRflFileSize = DEFAULT_MAX_RFL_FILE_SIZE; gv_DefaultCreateOpts.bKeepRflFiles = DEFAULT_KEEP_RFL_FILES_FLAG; gv_DefaultCreateOpts.bLogAbortedTransToRfl = DEFAULT_LOG_ABORTED_TRANS_FLAG; gv_DefaultCreateOpts.uiDefaultLanguage = DEFAULT_LANG; gv_DefaultCreateOpts.uiVersionNum = FLM_CUR_FILE_FORMAT_VER_NUM; gv_DefaultCreateOpts.uiAppMajorVer = gv_DefaultCreateOpts.uiAppMinorVer = 0; gv_uiCacheSize = 30000; gv_bBatchMode = FALSE; // Ask the user to enter parameters if none were entered on the command // line. if( iArgC < 2) { for (;;) { f_conStrOut( "\nRebuild Params (enter ? for help): "); szCommandBuffer[ 0] = 0; f_conLineEdit( szCommandBuffer, sizeof( szCommandBuffer) - 1); if( gv_bShutdown) { return( FALSE); } if( f_stricmp( szCommandBuffer, "?") == 0) { bldShowHelp(); } else { break; } } flmUtilParseParams( szCommandBuffer, MAX_ARGS, &iArgC, &ppszArgs [1]); ppszArgs[ 0] = ppszArgV[ 0]; iArgC++; ppszArgV = &ppszArgs[ 0]; } uiLoop = 1; while (uiLoop < (FLMUINT)iArgC) { pszPtr = ppszArgV [uiLoop]; // See if they specified an option #ifdef FLM_UNIX if (*pszPtr == '-') #else if (*pszPtr == '-' || *pszPtr == '/') #endif { pszPtr++; if (*pszPtr == 'c' || *pszPtr == 'C') { gv_uiCacheSize = f_atoi( (pszPtr + 1)); } else if (*pszPtr == 'd' || *pszPtr == 'D') { pszPtr++; if (*pszPtr == 'r' || *pszPtr == 'R') { pszPtr++; if (*pszPtr) { f_strcpy( gv_szDestRflDir, pszPtr); } else { bldShowError( "Destination RFL directory not specified"); return( FALSE); } } else if (*pszPtr == 'd' || *pszPtr == 'D') { pszPtr++; if (*pszPtr) { f_strcpy( gv_szDestDataDir, pszPtr); } else { bldShowError( "Destination data directory not specified"); return( FALSE); } } else if (*pszPtr == 'c' || *pszPtr == 'C') { pszPtr++; if (*pszPtr) { f_strcpy( gv_szDictFileName, pszPtr); } else { bldShowError( "Dictionary file name not specified"); return( FALSE); } } else { f_sprintf( szErrMsg, "Invalid option %s", pszPtr-1); bldShowError( szErrMsg); return( FALSE); } } else if (*pszPtr == 's' || *pszPtr == 'S') { pszPtr++; if (*pszPtr == 'd' || *pszPtr == 'D') { pszPtr++; if (*pszPtr) { f_strcpy( gv_szSrcDataDir, pszPtr); } else { bldShowError( "Source data directory not specified"); return( FALSE); } } else { f_sprintf( szErrMsg, "Invalid option %s", pszPtr-1); bldShowError( szErrMsg); return( FALSE); } } else if (*pszPtr == 'h' || *pszPtr == 'H') { pszPtr++; if( *pszPtr) { if( !bldParseHdrInfo( pszPtr)) { return( FALSE); } } else { bldShowError( "Block sizes not specified"); return( FALSE); } } else if (*pszPtr == 'l' || *pszPtr == 'L') { pszPtr++; if (*pszPtr) { f_strcpy( gv_szLogFileName, pszPtr); } else { bldShowError( "Log file name not specified"); return( FALSE); } } else if (f_stricmp( pszPtr, "P") == 0) { gv_bPauseBeforeExiting = TRUE; } else if (f_stricmp( pszPtr, "B") == 0) { gv_bBatchMode = TRUE; } else if (f_stricmp( pszPtr, "?") == 0) { goto Show_Help; } else { f_sprintf( szErrMsg, "Invalid option %s", pszPtr); bldShowError( szErrMsg); return( FALSE); } } else if (f_stricmp( pszPtr, "?") == 0) { Show_Help: bldShowHelp(); gv_bPauseBeforeExiting = TRUE; return( FALSE); } else if (!gv_szSrcFileName[ 0]) { f_strcpy( gv_szSrcFileName, pszPtr); } else if (!gv_szDestFileName[ 0]) { f_strcpy( gv_szDestFileName, pszPtr); } uiLoop++; } if (!gv_szSrcFileName [0] || !gv_szDestFileName [0]) { goto Show_Help; } return( TRUE); }