/**************************************************************************** Desc: Displays an error message with an RCODE. *****************************************************************************/ void gigaOutputRcErr( const char * pszWhat, RCODE rc, FLMBOOL bMutexLocked) { char szMsg [100]; f_sprintf( szMsg, "Error %s: %s (%04X)", pszWhat, FlmErrorString( rc), (unsigned)rc); gigaOutputErrMsg( szMsg, bMutexLocked); }
/******************************************************************** Desc: ? *********************************************************************/ FSTATIC void bldShowResults( const char * FuncName, RCODE rc, FLMUINT uiTotalRecords, FLMUINT uiRecordsRecovered, FLMUINT uiDictRecordsRecovered) { char szErrMsg[ 100]; if( RC_BAD( rc)) { if( rc != FERR_FAILURE) { f_strcpy( szErrMsg, "Error calling "); f_strcpy( &szErrMsg[ f_strlen( szErrMsg)], FuncName); f_strcpy( &szErrMsg[ f_strlen( szErrMsg)], ": "); f_strcpy( &szErrMsg[ f_strlen( szErrMsg)], FlmErrorString( rc)); bldShowError( szErrMsg); if( gv_bLoggingEnabled) { bldLogString( szErrMsg); } } else if( gv_bLoggingEnabled) { bldLogString( "REBUILD HALTED BY USER"); gv_bShutdown = TRUE; } } else { bldOutNumValue( TOTAL_REC_ROW, uiTotalRecords); bldOutNumValue( RECOV_ROW, uiRecordsRecovered); bldOutNumValue( DICT_RECOV_ROW, uiDictRecordsRecovered); if( gv_bLoggingEnabled) { f_sprintf( (char *)szErrMsg, "Total Records: %u", (unsigned)uiTotalRecords); bldLogString( szErrMsg); f_sprintf( (char *)szErrMsg, "Records Recovered: %u", (unsigned)uiRecordsRecovered); bldLogString( szErrMsg); f_sprintf( (char *)szErrMsg, "Dict Items Recovered: %u", (unsigned)uiDictRecordsRecovered); bldLogString( szErrMsg); } f_strcpy( szErrMsg, "Recovery completed successfully"); bldShowError( szErrMsg); if( gv_bLoggingEnabled) { bldLogString( szErrMsg); } } }
/******************************************************************** Desc: ? *********************************************************************/ FSTATIC FLMBOOL bldDoRebuild( void) { RCODE rc; FLMBOOL bOk = TRUE; char szErrMsg[ 100]; CREATE_OPTS createOpts; gv_ui64DatabaseSize = 0; gv_ui64BytesDone = 0; gv_uiDictRecsRecovered = 0; gv_iLastDoing = -1; gv_uiTotalRecs = 0; gv_uiRecsRecovered = 0; f_conSetBackFore( FLM_BLACK, FLM_LIGHTGRAY); f_conClearScreen( 0, 0); gv_bLoggingEnabled = FALSE; gv_uiLogBufferCount = 0; if( gv_szLogFileName[ 0]) { gv_pFileSystem->deleteFile( gv_szLogFileName); if (RC_OK( rc = gv_pFileSystem->createFile( gv_szLogFileName, FLM_IO_RDWR, &gv_pLogFile))) { gv_bLoggingEnabled = TRUE; } else { f_strcpy( szErrMsg, "Error creating log file: "); f_strcpy( &szErrMsg[ f_strlen( szErrMsg)], FlmErrorString( rc)); bldShowError( szErrMsg); bOk = FALSE; goto Exit; } } /* Configure FLAIM */ if (RC_BAD( rc = FlmConfig( FLM_CACHE_LIMIT, (void *)(gv_uiCacheSize * 1024), (void *)0))) { f_strcpy( szErrMsg, "Error setting cache size for FLAIM share: "); f_strcpy( &szErrMsg[ f_strlen( szErrMsg)], FlmErrorString( rc)); bldShowError( szErrMsg); bOk = FALSE; goto Exit; } f_conSetBackFore( FLM_BLACK, FLM_WHITE); if( gv_bLoggingEnabled) { bldLogString( NULL); bldLogString( NULL); bldLogString( NULL); bldLogString( "=========================================================================="); bldLogString( "REBUILD PARAMETERS:"); } f_conClearScreen( 0, PARAM_ROW); f_conStrOutXY( "REBUILD PARAMETERS:", LABEL_COLUMN, PARAM_ROW); bldOutLabel( LABEL_COLUMN + 2, SOURCE_ROW, "Source DB", gv_szSrcFileName, 0, TRUE); bldOutLabel( LABEL_COLUMN + 2, SOURCE_DATA_DIR_ROW, "Src. Data Dir", (gv_szSrcDataDir [0]) ? &gv_szSrcDataDir [0] : "<NONE>", 0, TRUE); bldOutLabel( LABEL_COLUMN + 2, DEST_ROW, "Destination DB", gv_szDestFileName, 0, TRUE); bldOutLabel( LABEL_COLUMN + 2, DEST_DATA_DIR_ROW, "Dest. Data Dir", (gv_szDestDataDir [0]) ? &gv_szDestDataDir [0] : "<NONE>", 0, TRUE); bldOutLabel( LABEL_COLUMN + 2, DEST_RFL_ROW, "Dest. RFL Dir", (gv_szDestRflDir [0]) ? &gv_szDestRflDir [0] : "<NONE>", 0, TRUE); bldOutLabel( LABEL_COLUMN + 2, DICT_ROW, "Dictionary File", (gv_szDictFileName [0]) ? &gv_szDictFileName [0] : "<NONE>", 0, TRUE); bldOutLabel( LABEL_COLUMN + 2, CACHE_ROW, "Cache (kb)", NULL, gv_uiCacheSize, TRUE); bldOutLabel( LABEL_COLUMN + 2, LOG_FILE_ROW, "Log File", (gv_szLogFileName [0]) ? &gv_szLogFileName [0] : "<NONE>", 0, TRUE); bldOutLabel( LABEL_COLUMN, DOING_ROW, "Current Action", "Startup ", 0L, FALSE); bldOutLabel( LABEL_COLUMN, DB_SIZE_ROW, "Database Size", NULL, (FLMUINT)gv_ui64DatabaseSize, FALSE); bldOutLabel( LABEL_COLUMN, BYTES_DONE_ROW, "Bytes Processed", NULL, (FLMUINT)gv_ui64BytesDone, FALSE); bldOutLabel( LABEL_COLUMN, TOTAL_REC_ROW, "Total Records", NULL, gv_uiTotalRecs, FALSE); bldOutLabel( LABEL_COLUMN, RECOV_ROW, "Records Recovered", NULL, gv_uiRecsRecovered, FALSE); bldOutLabel( LABEL_COLUMN, DICT_RECOV_ROW, "Dict Items Recov", NULL, gv_uiDictRecsRecovered, FALSE); if( gv_szDictFileName [0]) { gv_pszDictPath = &gv_szDictFileName [0]; } else { gv_pszDictPath = NULL; } /* Open the database ONLY to get the createOpts. Rebuild the exact prefix and other create options. */ rc = bldGetCreateOpts( gv_szSrcFileName, &createOpts); if ((!gv_bShutdown) && (RC_OK( rc))) { char * pszDestRflDir; pszDestRflDir = ((gv_szDestRflDir [0]) ? &gv_szDestRflDir [0] : NULL); rc = FlmDbRebuild( gv_szSrcFileName, gv_szSrcDataDir, gv_szDestFileName, gv_szDestDataDir, pszDestRflDir, gv_pszDictPath, &createOpts, &gv_uiTotalRecs, &gv_uiRecsRecovered, bldProgFunc, NULL); bldShowResults( "FlmDbRebuild", rc, gv_uiTotalRecs, gv_uiRecsRecovered, gv_uiDictRecsRecovered); } Exit: if( gv_bLoggingEnabled) { bldLogFlush(); gv_pLogFile->Release(); gv_pLogFile = NULL; } return( bOk); }
/******************************************************************** Desc: ? *********************************************************************/ FSTATIC RCODE bldGetCreateOpts( const char * pszFileName, CREATE_OPTS * pCreateOpts) { RCODE rc = FERR_OK; char szBuf[ 80]; FLMBYTE ucLogHdr [LOG_HEADER_SIZE]; HDR_INFO HdrInfo; FLMUINT uiVersion; IF_FileHdl * pCFileHdl = NULL; f_memset( pCreateOpts, 0, sizeof( CREATE_OPTS)); if( gv_bFixHdrInfo) { f_memcpy( pCreateOpts, &gv_DefaultCreateOpts, sizeof( CREATE_OPTS)); goto Exit; } if( RC_BAD( rc = gv_FlmSysData.pFileSystem->openFile( pszFileName, FLM_IO_RDWR | FLM_IO_SH_DENYNONE | FLM_IO_DIRECT, &pCFileHdl))) { goto Exit; } if( (rc = flmGetHdrInfo( pCFileHdl, &HdrInfo.FileHdr, &HdrInfo.LogHdr, ucLogHdr)) == FERR_NOT_FLAIM) { uiVersion = gv_DefaultCreateOpts.uiVersionNum; f_memcpy( pCreateOpts, &gv_DefaultCreateOpts, sizeof( CREATE_OPTS)); rc = FERR_OK; } else { uiVersion = HdrInfo.FileHdr.uiVersionNum; flmGetCreateOpts( &HdrInfo.FileHdr, ucLogHdr, pCreateOpts); } if (rc != FERR_OK && rc != FERR_INCOMPLETE_LOG && rc != FERR_BLOCK_CHECKSUM) { if (((rc == FERR_UNSUPPORTED_VERSION) || (rc == FERR_NEWER_FLAIM)) && (uiVersion == 999)) { rc = FERR_OK; } else { f_strcpy( szBuf, "Error reading header info from "); f_strcpy( &szBuf[ f_strlen( szBuf)], pszFileName); f_strcpy( &szBuf[ f_strlen( szBuf)], ": "); f_strcpy( &szBuf[ f_strlen( szBuf)], FlmErrorString( rc)); bldShowError( szBuf); if( gv_bLoggingEnabled) { bldLogString( szBuf); } goto Exit; } } else { rc = FERR_OK; } Exit: if( pCFileHdl) { pCFileHdl->Release(); } return( rc); }