Added support for storing 64 bit numbers

git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@805 0109f412-320b-0410-ab79-c3e0c5ffbbe6
This commit is contained in:
dsandersoremutah
2006-09-01 16:34:15 +00:00
parent 8350b37976
commit 24346739dd
27 changed files with 4376 additions and 1568 deletions

View File

@@ -387,6 +387,67 @@ Exit:
return( rc);
}
/*****************************************************************************
Desc:
*****************************************************************************/
RCODE FlmRecord::setINT64(
void * pvField,
FLMINT64 i64Number,
FLMUINT uiEncId)
{
RCODE rc = FERR_OK;
FLMBYTE * pucData;
FLMBYTE ucStorageBuf[ F_MAX_NUM64_BUF + 1];
FLMUINT uiStorageLen;
FLMUINT uiEncDataLen = 0;
FLMUINT uiEncFlags = 0;
if( isReadOnly() || isCached())
{
flmAssert( 0);
rc = RC_SET( FERR_FAILURE);
goto Exit;
}
uiStorageLen = sizeof( ucStorageBuf);
if( RC_BAD( rc = FlmINT64ToStorage( i64Number, &uiStorageLen, ucStorageBuf)))
{
goto Exit;
}
if( uiEncId)
{
// For encrypted fields, we want to make sure we allocate
// enough space for the encrypted data too. The data does
// not get encrypted until the call to FlmRecordModify or
// FlmRecordAdd.
if( uiStorageLen % 16)
{
uiEncDataLen = uiStorageLen + (16 - (uiStorageLen % 16));
}
else
{
uiEncDataLen = uiStorageLen;
}
uiEncFlags = FLD_HAVE_DECRYPTED_DATA;
}
if( RC_BAD( rc = getNewDataPtr( getFieldPointer( pvField), FLM_NUMBER_TYPE,
uiStorageLen, uiEncDataLen, uiEncId, uiEncFlags, &pucData, NULL)))
{
goto Exit;
}
f_memcpy( pucData, ucStorageBuf, uiStorageLen);
Exit:
return( rc);
}
/*****************************************************************************
Desc:
*****************************************************************************/
@@ -447,6 +508,66 @@ Exit:
return( rc);
}
/*****************************************************************************
Desc:
*****************************************************************************/
RCODE FlmRecord::setUINT64(
void * pvField,
FLMUINT64 ui64Number,
FLMUINT uiEncId)
{
RCODE rc = FERR_OK;
FLMBYTE * pucData;
FLMBYTE ucStorageBuf[ F_MAX_NUM64_BUF + 1];
FLMUINT uiStorageLen;
FLMUINT uiEncDataLen = 0;
FLMUINT uiEncFlags = 0;
if( isReadOnly() || isCached())
{
flmAssert( 0);
rc = RC_SET( FERR_FAILURE);
goto Exit;
}
uiStorageLen = sizeof( ucStorageBuf);
if( RC_BAD( rc = FlmUINT64ToStorage( ui64Number, &uiStorageLen, ucStorageBuf)))
{
goto Exit;
}
if( uiEncId)
{
// For encrypted fields, we want to make sure we allocate
// enough space for the encrypted data too. The data does
// not get encrypted until the call to FlmRecordModify or
// FlmRecordAdd.
if( uiStorageLen % 16)
{
uiEncDataLen = uiStorageLen + (16 - (uiStorageLen % 16));
}
else
{
uiEncDataLen = uiStorageLen;
}
uiEncFlags = FLD_HAVE_DECRYPTED_DATA;
}
if( RC_BAD( rc = getNewDataPtr( getFieldPointer( pvField), FLM_NUMBER_TYPE,
uiStorageLen, uiEncDataLen, uiEncId, uiEncFlags, &pucData, NULL)))
{
goto Exit;
}
f_memcpy( pucData, ucStorageBuf, uiStorageLen);
Exit:
return( rc);
}
/*****************************************************************************
Desc:
*****************************************************************************/
@@ -4257,6 +4378,96 @@ Exit:
}
/*****************************************************************************
Desc:
*****************************************************************************/
RCODE FlmRecord::getINT32(
void * pvField,
FLMINT32 * pi32Number)
{
RCODE rc = FERR_OK;
FLMBOOL bEncrypted;
FlmField * pField = getFieldPointer( pvField);
if (!pField)
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
bEncrypted = isEncryptedField( pField);
if (!bEncrypted ||
(getEncFlags( pField) & FLD_HAVE_DECRYPTED_DATA))
{
rc = FlmStorage2INT32( getFieldDataType( pField),
getFieldDataLength( pField),
(const FLMBYTE *)getDataPtr( pField),
pi32Number);
}
else if (bEncrypted &&
!(getEncFlags( pField) & FLD_HAVE_DECRYPTED_DATA))
{
rc = RC_SET( FERR_ENCRYPTION_UNAVAILABLE);
goto Exit;
}
else
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
Exit:
return( rc);
}
/*****************************************************************************
Desc:
*****************************************************************************/
RCODE FlmRecord::getINT64(
void * pvField,
FLMINT64 * pi64Number)
{
RCODE rc = FERR_OK;
FLMBOOL bEncrypted;
FlmField * pField = getFieldPointer( pvField);
if (!pField)
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
bEncrypted = isEncryptedField( pField);
if (!bEncrypted ||
(getEncFlags( pField) & FLD_HAVE_DECRYPTED_DATA))
{
rc = FlmStorage2INT64( getFieldDataType( pField),
getFieldDataLength( pField),
(const FLMBYTE *)getDataPtr( pField),
pi64Number);
}
else if (bEncrypted &&
!(getEncFlags( pField) & FLD_HAVE_DECRYPTED_DATA))
{
rc = RC_SET( FERR_ENCRYPTION_UNAVAILABLE);
goto Exit;
}
else
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
Exit:
return( rc);
}
/*****************************************************************************
Desc:
*****************************************************************************/
@@ -4348,6 +4559,52 @@ Exit:
}
/*****************************************************************************
Desc:
*****************************************************************************/
RCODE FlmRecord::getUINT64(
void * pvField,
FLMUINT64 * pui64Number)
{
RCODE rc = FERR_OK;
FLMBOOL bEncrypted;
FlmField * pField = getFieldPointer( pvField);
if (!pField)
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
bEncrypted = isEncryptedField( pField);
if (!bEncrypted ||
(getEncFlags( pField) & FLD_HAVE_DECRYPTED_DATA))
{
rc = FlmStorage2UINT64( getFieldDataType( pField),
getFieldDataLength( pField),
(const FLMBYTE *)getDataPtr( pField),
pui64Number);
}
else if (bEncrypted &&
!(getEncFlags( pField) & FLD_HAVE_DECRYPTED_DATA))
{
rc = RC_SET( FERR_ENCRYPTION_UNAVAILABLE);
goto Exit;
}
else
{
rc = RC_SET( FERR_NOT_FOUND);
goto Exit;
}
Exit:
return( rc);
}
/*****************************************************************************
Desc:
*****************************************************************************/
@@ -5686,11 +5943,11 @@ void * RecCursor::Scan(
void * pvIDMatch = NULL;
FLMUINT uiTargetLevel = pTargetCursor->Level();
FLMBOOL bAdvanced = FALSE;
RecCursor candidate = this;
*peMatchType = GRD_NoMatch;
for (RecCursor candidate = this;
candidate.Level() >= uiTargetLevel && !candidate.EndOfRecord();
for ( ; candidate.Level() >= uiTargetLevel && !candidate.EndOfRecord();
candidate.Advance(), bAdvanced = TRUE)
{
if (pTargetCursor->FieldIdIsEqualTo( &candidate))
@@ -5896,22 +6153,28 @@ RCODE flmAddField(
{
case 0:
uiNum = (FLMUINT)(*((FLMUINT *)(pvData)));
rc = pRecord->setUINT( pvField, uiNum);
break;
case 1:
uiNum = (FLMUINT)(*((FLMBYTE *)(pvData)));
rc = pRecord->setUINT( pvField, uiNum);
break;
case 2:
uiNum = (FLMUINT)(*((FLMUINT16 *)(pvData)));
rc = pRecord->setUINT( pvField, uiNum);
break;
case 4:
uiNum = (FLMUINT)(*((FLMUINT32 *)(pvData)));
rc = pRecord->setUINT( pvField, uiNum);
break;
case 8:
rc = pRecord->setUINT64( pvField, *((FLMUINT64 *)(pvData)));
break;
default:
flmAssert( 0);
rc = RC_SET( FERR_INVALID_PARM);
goto Exit;
}
rc = pRecord->setUINT( pvField, uiNum);
break;
}
case FLM_BINARY_TYPE:
@@ -5970,22 +6233,28 @@ RCODE flmModField(
{
case 0:
uiNum = (FLMUINT)(*((FLMUINT *)(pvData)));
rc = pRecord->setUINT( pvField, uiNum);
break;
case 1:
uiNum = (FLMUINT)(*((FLMBYTE *)(pvData)));
rc = pRecord->setUINT( pvField, uiNum);
break;
case 2:
uiNum = (FLMUINT)(*((FLMUINT16 *)(pvData)));
rc = pRecord->setUINT( pvField, uiNum);
break;
case 4:
uiNum = (FLMUINT)(*((FLMUINT32 *)(pvData)));
rc = pRecord->setUINT( pvField, uiNum);
break;
case 8:
rc = pRecord->setUINT64( pvField, *((FLMUINT64 *)(pvData)));
break;
default:
flmAssert( 0);
rc = RC_SET( FERR_INVALID_PARM);
goto Exit;
}
rc = pRecord->setUINT( pvField, uiNum);
break;
}
@@ -6105,3 +6374,4 @@ RCODE flmDecrField(
return( rc);
}