static HB_ERRCODE hb_sdfReadRecord( SDFAREAP pArea ) { HB_USHORT uiRead, uiToRead, uiEolPos; HB_TRACE( HB_TR_DEBUG, ( "hb_sdfReadRecord(%p)", pArea ) ); uiToRead = pArea->uiRecordLen + pArea->uiEolLen + 2; uiRead = ( HB_USHORT ) hb_fileReadAt( pArea->pFile, pArea->pRecord, uiToRead, pArea->nRecordOffset ); if( uiRead > 0 && uiRead < uiToRead && pArea->pRecord[ uiRead - 1 ] == '\032' ) --uiRead; if( uiRead == 0 ) { pArea->area.fEof = HB_TRUE; pArea->fPositioned = HB_FALSE; hb_sdfClearRecordBuffer( pArea ); } else { pArea->area.fEof = HB_FALSE; pArea->fPositioned = HB_TRUE; uiEolPos = ( HB_USHORT ) hb_strAt( pArea->szEol, pArea->uiEolLen, ( const char * ) pArea->pRecord, uiRead ); if( uiEolPos ) { --uiEolPos; if( uiRead < uiToRead && uiRead == uiEolPos + pArea->uiEolLen ) pArea->nNextOffset = ( HB_FOFFSET ) -1; else pArea->nNextOffset = pArea->nRecordOffset + uiEolPos + pArea->uiEolLen; if( uiEolPos < pArea->uiRecordLen ) memset( pArea->pRecord + uiEolPos, ' ', pArea->uiRecordLen - uiEolPos ); } else { if( uiRead < uiToRead ) pArea->nNextOffset = ( HB_FOFFSET ) -1; else pArea->nNextOffset = 0; if( uiRead < pArea->uiRecordLen ) memset( pArea->pRecord + uiRead, ' ', pArea->uiRecordLen - uiRead ); } if( uiEolPos != pArea->uiRecordLen ) memcpy( pArea->pRecord + pArea->uiRecordLen, pArea->szEol, pArea->uiEolLen ); } return HB_SUCCESS; }
/* * Delete a record. */ static HB_ERRCODE hb_sdfDeleteRec( SDFAREAP pArea ) { HB_TRACE( HB_TR_DEBUG, ( "hb_sdfDeleteRec(%p)", pArea ) ); if( pArea->fRecordChanged ) { pArea->ulRecCount--; pArea->area.fEof = HB_TRUE; pArea->fPositioned = pArea->fRecordChanged = HB_FALSE; hb_sdfClearRecordBuffer( pArea ); } return HB_SUCCESS; }
/* * Delete a record. */ static HB_ERRCODE hb_sdfDeleteRec( SDFAREAP pArea ) { HB_TRACE( HB_TR_DEBUG, ( "hb_sdfDeleteRec(%p)", pArea ) ); HB_SYMBOL_UNUSED( pArea ); /* It's not Cl*pper compatible so I had to disable it [druzus] */ #if 0 if( pArea->fRecordChanged ) { pArea->ulRecCount--; pArea->area.fEof = HB_TRUE; pArea->fPositioned = pArea->fRecordChanged = HB_FALSE; hb_sdfClearRecordBuffer( pArea ); } #endif return HB_SUCCESS; }
/* * Append a record to the WorkArea. */ static HB_ERRCODE hb_sdfAppend( SDFAREAP pArea, HB_BOOL fUnLockAll ) { HB_TRACE( HB_TR_DEBUG, ( "hb_sdfAppend(%p,%d)", pArea, ( int ) fUnLockAll ) ); HB_SYMBOL_UNUSED( fUnLockAll ); if( SELF_GOCOLD( &pArea->area ) != HB_SUCCESS ) return HB_FAILURE; if( SELF_GOHOT( &pArea->area ) != HB_SUCCESS ) return HB_FAILURE; pArea->ulRecNo = ++pArea->ulRecCount; pArea->area.fEof = HB_FALSE; pArea->fPositioned = HB_TRUE; hb_sdfClearRecordBuffer( pArea ); return HB_SUCCESS; }
static HB_ERRCODE hb_sdfNextRecord( SDFAREAP pArea ) { HB_TRACE( HB_TR_DEBUG, ( "hb_sdfNextRecord(%p)", pArea ) ); if( ! pArea->fPositioned ) pArea->nNextOffset = ( HB_FOFFSET ) -1; else { if( pArea->nNextOffset == 0 ) { HB_USHORT uiRead, uiToRead, uiEolPos, uiRest = 0; HB_FOFFSET ulOffset = pArea->nRecordOffset; uiToRead = pArea->uiRecordLen + pArea->uiEolLen + 2; do { uiRead = ( HB_USHORT ) hb_fileReadAt( pArea->pFile, pArea->pRecord + uiRest, uiToRead - uiRest, ulOffset + uiRest ) + uiRest; if( uiRead > 0 && uiRead < uiToRead && pArea->pRecord[ uiRead - 1 ] == '\032' ) --uiRead; uiEolPos = ( HB_USHORT ) hb_strAt( pArea->szEol, pArea->uiEolLen, ( const char * ) pArea->pRecord, uiRead ); if( uiEolPos ) { --uiEolPos; if( uiRead < uiToRead && uiRead == uiEolPos + pArea->uiEolLen ) pArea->nNextOffset = ( HB_FOFFSET ) -1; else pArea->nNextOffset = ulOffset + uiEolPos + pArea->uiEolLen; } else if( uiRead < uiToRead ) { pArea->nNextOffset = ( HB_FOFFSET ) -1; } else { if( pArea->uiEolLen > 1 ) { uiRest = pArea->uiEolLen - 1; memcpy( pArea->pRecord, pArea->pRecord + uiRead - uiRest, uiRest ); } ulOffset += uiRead - uiRest; } } while( pArea->nNextOffset == 0 ); } pArea->ulRecNo++; } if( pArea->nNextOffset == ( HB_FOFFSET ) -1 ) { pArea->area.fEof = HB_TRUE; pArea->fPositioned = HB_FALSE; hb_sdfClearRecordBuffer( pArea ); return HB_SUCCESS; } pArea->nRecordOffset = pArea->nNextOffset; return hb_sdfReadRecord( pArea ); }
/* * Create a data store in the specified WorkArea. */ static HB_ERRCODE hb_sdfCreate( SDFAREAP pArea, LPDBOPENINFO pCreateInfo ) { PHB_ITEM pError = NULL; HB_ERRCODE errCode; HB_BOOL fRetry; PHB_FNAME pFileName; char szFileName[ HB_PATH_MAX ]; HB_TRACE( HB_TR_DEBUG, ( "hb_sdfCreate(%p,%p)", pArea, pCreateInfo ) ); pArea->fShared = HB_FALSE; /* pCreateInfo->fShared; */ pArea->fReadonly = HB_FALSE; /* pCreateInfo->fReadonly */ if( pCreateInfo->cdpId ) { pArea->area.cdPage = hb_cdpFindExt( pCreateInfo->cdpId ); if( ! pArea->area.cdPage ) pArea->area.cdPage = hb_vmCDP(); } else pArea->area.cdPage = hb_vmCDP(); pFileName = hb_fsFNameSplit( pCreateInfo->abName ); if( hb_setGetDefExtension() && ! pFileName->szExtension ) { PHB_ITEM pItem = hb_itemPutC( NULL, NULL ); SELF_INFO( &pArea->area, DBI_TABLEEXT, pItem ); pFileName->szExtension = hb_itemGetCPtr( pItem ); hb_fsFNameMerge( szFileName, pFileName ); hb_itemRelease( pItem ); } else { hb_strncpy( szFileName, pCreateInfo->abName, sizeof( szFileName ) - 1 ); } hb_xfree( pFileName ); /* Try create */ do { pArea->pFile = hb_fileExtOpen( szFileName, NULL, FO_READWRITE | FO_EXCLUSIVE | FXO_TRUNCATE | FXO_DEFAULTS | FXO_SHARELOCK | FXO_COPYNAME, NULL, pError ); if( ! pArea->pFile ) { if( ! pError ) { pError = hb_errNew(); hb_errPutGenCode( pError, EG_CREATE ); hb_errPutSubCode( pError, EDBF_CREATE_DBF ); hb_errPutOsCode( pError, hb_fsError() ); hb_errPutDescription( pError, hb_langDGetErrorDesc( EG_CREATE ) ); hb_errPutFileName( pError, szFileName ); hb_errPutFlags( pError, EF_CANRETRY | EF_CANDEFAULT ); } fRetry = ( SELF_ERROR( &pArea->area, pError ) == E_RETRY ); } else fRetry = HB_FALSE; } while( fRetry ); if( pError ) hb_itemRelease( pError ); if( ! pArea->pFile ) return HB_FAILURE; errCode = SUPER_CREATE( &pArea->area, pCreateInfo ); if( errCode != HB_SUCCESS ) { SELF_CLOSE( &pArea->area ); return errCode; } hb_sdfInitArea( pArea, szFileName ); pArea->ulRecNo = 1; pArea->area.fEof = HB_TRUE; pArea->fPositioned = HB_FALSE; hb_sdfClearRecordBuffer( pArea ); return HB_SUCCESS; }