Exemplo n.º 1
0
/****************************************************************************
 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);
}
Exemplo n.º 2
0
/********************************************************************
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);
}