Example #1
0
static HB_ERRCODE hb_sdfNextRecord( SDFAREAP pArea )
{
   HB_TRACE( HB_TR_DEBUG, ( "hb_sdfNextRecord(%p)", pArea ) );

   if( pArea->fPositioned )
   {
      pArea->ulRecNo++;
      return hb_sdfReadRecord( pArea );
   }
   return HB_SUCCESS;
}
Example #2
0
/*
 * Position cursor at the first record.
 */
static HB_ERRCODE hb_sdfGoTop( SDFAREAP pArea )
{
   HB_TRACE( HB_TR_DEBUG, ( "hb_sdfGoTop(%p)", pArea ) );

   if( SELF_GOCOLD( &pArea->area ) != HB_SUCCESS )
      return HB_FAILURE;

   pArea->area.fTop = HB_TRUE;
   pArea->area.fBottom = HB_FALSE;

   pArea->nRecordOffset = 0;
   pArea->ulRecNo = 1;
   if( hb_sdfReadRecord( pArea ) != HB_SUCCESS )
      return HB_FAILURE;

   return SELF_SKIPFILTER( &pArea->area, 1 );
}
Example #3
0
/*
 * Position cursor at the first record.
 */
static HB_ERRCODE hb_sdfGoTop( SDFAREAP pArea )
{
   HB_TRACE( HB_TR_DEBUG, ( "hb_sdfGoTop(%p)", pArea ) );

   if( SELF_GOCOLD( &pArea->area ) != HB_SUCCESS )
      return HB_FAILURE;

   pArea->area.fTop = HB_TRUE;
   pArea->area.fBottom = HB_FALSE;

   if( pArea->ulRecNo != 1 )
   {
      if( pArea->ulRecNo != 0 || ! pArea->fReadonly )
         /* generate RTE */
         return SUPER_GOTOP( &pArea->area );

      pArea->ulRecNo = 1;
      if( hb_sdfReadRecord( pArea ) != HB_SUCCESS )
         return HB_FAILURE;
   }

   return SELF_SKIPFILTER( &pArea->area, 1 );
}
Example #4
0
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 );
}