Files
mars-flaim/flaim/src/fmisc.cpp
dsandersoremutah eb7a1e48b7 Added FLMEXP and FLMAPI to exported APIs.
git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@112 0109f412-320b-0410-ab79-c3e0c5ffbbe6
2006-02-13 23:35:37 +00:00

215 lines
5.2 KiB
C++

//-------------------------------------------------------------------------
// Desc: Miscellaneous functions.
// Tabs: 3
//
// Copyright (c) 1995-2001,2003-2006 Novell, Inc. All Rights Reserved.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 2 of the GNU General Public
// License as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, contact Novell, Inc.
//
// To contact Novell about this file by physical or electronic mail,
// you may find current contact information at www.novell.com
//
// $Id: fmisc.cpp 12266 2006-01-19 14:45:33 -0700 (Thu, 19 Jan 2006) dsanders $
//-------------------------------------------------------------------------
#include "flaimsys.h"
/*API~***********************************************************************
Desc : Returns TRUE if the passed in RCODE indicates that a corruption
has occured in a FLAIM database file.
*END************************************************************************/
FLMEXP FLMBOOL FLMAPI FlmErrorIsFileCorrupt(
RCODE rc)
{
FLMBOOL b = FALSE;
switch( rc)
{
/* This is the list of errors within FLAIM that indicate a corruption
has been found within FLAIM database file. */
case FERR_BTREE_ERROR :
case FERR_DATA_ERROR :
case FERR_DD_ERROR :
case FERR_NOT_FLAIM :
case FERR_PCODE_ERROR :
case FERR_BLOCK_CHECKSUM :
case FERR_INCOMPLETE_LOG :
case FERR_KEY_NOT_FOUND :
case FERR_NO_REC_FOR_KEY:
b = TRUE;
break;
default :
break;
}
return( b);
}
/*API~***********************************************************************
Desc : Returns specific information about the most recent error that
occured within FLAIM.
Notes: FLAIM maintains information about the operation which generated
the error. This information can include a field number
or other information specific to the operation and can
be useful in identifying the cause of the error.
*END************************************************************************/
FLMEXP RCODE FLMAPI FlmGetDiagInfo(
HFDB hDb,
eDiagInfoType eDiagCode,
void * pvDiagInfo
)
{
RCODE rc = FERR_OK;
FDB * pDb;
if ((pDb = (FDB *)hDb) == NULL)
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
fdbUseCheck( pDb);
/* Now, copy over the data into the users variable */
switch( eDiagCode)
{
case FLM_GET_DIAG_INDEX_NUM :
if (!(pDb->Diag.uiInfoFlags & FLM_DIAG_INDEX_NUM))
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
else
{
*((FLMUINT *)pvDiagInfo) = pDb->Diag.uiIndexNum;
}
break;
case FLM_GET_DIAG_DRN :
if (!(pDb->Diag.uiInfoFlags & FLM_DIAG_DRN))
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
else
{
*((FLMUINT *)pvDiagInfo) = pDb->Diag.uiDrn;
}
break;
case FLM_GET_DIAG_FIELD_NUM :
if (!(pDb->Diag.uiInfoFlags & FLM_DIAG_FIELD_NUM))
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
else
{
*((FLMUINT *)pvDiagInfo) = pDb->Diag.uiFieldNum;
}
break;
case FLM_GET_DIAG_FIELD_TYPE :
if (!(pDb->Diag.uiInfoFlags & FLM_DIAG_FIELD_TYPE))
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
else
{
*((FLMUINT *)pvDiagInfo) = pDb->Diag.uiFieldType;
}
break;
case FLM_GET_DIAG_ENC_ID :
if (!(pDb->Diag.uiInfoFlags & FLM_DIAG_ENC_ID))
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
else
{
*((FLMUINT *)pvDiagInfo) = pDb->Diag.uiEncId;
}
break;
default:
flmAssert( 0);
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
Exit:
if( pDb)
{
fdbUnuse( pDb);
}
return( rc);
}
/****************************************************************************
Desc: Get the total bytes represented by a particular block address.
****************************************************************************/
FLMUINT64 FSGetSizeInBytes(
FLMUINT uiMaxFileSize,
FLMUINT uiBlkAddress)
{
FLMUINT uiFileNum;
FLMUINT uiFileOffset;
FLMUINT64 ui64Size;
uiFileNum = FSGetFileNumber( uiBlkAddress);
uiFileOffset = FSGetFileOffset( uiBlkAddress);
if( uiFileNum > 1)
{
ui64Size = (FLMUINT64)(((FLMUINT64)uiFileNum - (FLMUINT64)1) *
(FLMUINT64)uiMaxFileSize +
(FLMUINT64)uiFileOffset);
}
else
{
ui64Size = (FLMUINT64)uiFileOffset;
}
return( ui64Size);
}
/****************************************************************************
Desc: Converts a UNICODE string consisting of 7-bit ASCII characters to
a 7-bit ASCII string. The conversion is done in place, so that
only one buffer is needed
*****************************************************************************/
RCODE flmUnicodeToAscii(
FLMUNICODE * puzString) // Unicode in, Ascii out
{
FLMBYTE * pucDest;
pucDest = (FLMBYTE *)puzString;
while( *puzString)
{
if( *puzString > 0x007F)
{
*pucDest = 0xFF;
}
else
{
*pucDest = (FLMBYTE)*puzString;
}
pucDest++;
puzString++;
}
*pucDest = '\0';
return( FERR_OK);
}