2014-06-27 17:20 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)

* src/rdd/delim1.c
  * src/rdd/sdf1.c
    + added support for importing TIME and TIMESTAMP fields
      from SDF and DELIM RDDs
This commit is contained in:
Przemysław Czerpak
2014-06-27 17:20:30 +02:00
parent a8f132e54d
commit 2e24ca5fe9
3 changed files with 53 additions and 9 deletions

View File

@@ -10,6 +10,12 @@
* Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment
*/
2014-06-27 17:20 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* src/rdd/delim1.c
* src/rdd/sdf1.c
+ added support for importing TIME and TIMESTAMP fields
from SDF and DELIM RDDs
2014-06-27 14:53 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* contrib/hbwin/olecore.c
* added workaround for missing DISP_E_BUFFERTOOSMALL declaration

View File

@@ -121,6 +121,7 @@ static HB_SIZE hb_delimEncodeBuffer( DELIMAREAP pArea )
switch( pField->uiType )
{
case HB_FT_STRING:
case HB_FT_TIMESTAMP:
uiLen = pField->uiLen;
while( uiLen && pFieldBuf[ uiLen - 1 ] == ' ' )
--uiLen;
@@ -262,7 +263,8 @@ static HB_ERRCODE hb_delimReadRecord( DELIMAREAP pArea )
pField = pArea->area.lpFields + uiField;
uiType = pField->uiType;
if( uiType == HB_FT_STRING || uiType == HB_FT_LOGICAL ||
uiType == HB_FT_DATE || uiType == HB_FT_LONG )
uiType == HB_FT_DATE || uiType == HB_FT_TIMESTAMP ||
uiType == HB_FT_LONG )
{
uiSize = 0;
uiLen = pField->uiLen;
@@ -289,7 +291,8 @@ static HB_ERRCODE hb_delimReadRecord( DELIMAREAP pArea )
* can be terminated only with valid stop character, when
* other fields also by length
*/
if( pField->uiType == HB_FT_STRING )
if( pField->uiType == HB_FT_STRING ||
( pField->uiType == HB_FT_TIMESTAMP && cStop == pArea->cDelim ) )
{
while( ch >= 0 && ch != cStop )
{
@@ -302,7 +305,8 @@ static HB_ERRCODE hb_delimReadRecord( DELIMAREAP pArea )
{
while( ch >= 0 && ch != cStop && uiSize < uiLen )
{
buffer[ uiSize++ ] = ( HB_BYTE ) ch;
if( uiSize < sizeof( buffer ) - 1 )
buffer[ uiSize++ ] = ( HB_BYTE ) ch;
ch = hb_delimNextChar( pArea );
}
buffer[ uiSize ] = '\0';
@@ -317,6 +321,12 @@ static HB_ERRCODE hb_delimReadRecord( DELIMAREAP pArea )
if( uiSize == 8 && hb_dateEncStr( ( char * ) buffer ) != 0 )
memcpy( pFieldBuf, buffer, 8 );
}
else if( pField->uiType == HB_FT_TIMESTAMP )
{
memcpy( pFieldBuf, buffer, uiSize );
if( uiSize < uiLen )
memset( pFieldBuf + uiSize, 0, uiLen - uiSize );
}
else
{
HB_MAXINT lVal;
@@ -588,6 +598,19 @@ static HB_ERRCODE hb_delimGetValue( DELIMAREAP pArea, HB_USHORT uiIndex, PHB_ITE
hb_itemPutDS( pItem, ( const char * ) pArea->pRecord + pArea->pFieldOffset[ uiIndex ] );
break;
case HB_FT_TIMESTAMP:
{
long lJulian, lMilliSec;
HB_BYTE * pFieldPtr = pArea->pRecord + pArea->pFieldOffset[ uiIndex ], bChar;
bChar = pFieldPtr[ pField->uiLen ];
pFieldPtr[ pField->uiLen ] = 0;
hb_timeStampStrGetDT( ( const char * ) pFieldPtr, &lJulian, &lMilliSec );
pFieldPtr[ pField->uiLen ] = bChar;
hb_itemPutTDT( pItem, lJulian, lMilliSec );
break;
}
case HB_FT_LONG:
{
HB_MAXINT lVal;
@@ -691,7 +714,7 @@ static HB_ERRCODE hb_delimPutValue( DELIMAREAP pArea, HB_USHORT uiIndex, PHB_ITE
hb_itemGetDS( pItem, szBuffer );
memcpy( pArea->pRecord + pArea->pFieldOffset[ uiIndex ], szBuffer, 8 );
}
else if( pField->uiType == HB_FT_STRING &&
else if( pField->uiType == HB_FT_TIMESTAMP &&
( pField->uiLen == 12 || pField->uiLen == 23 ) )
{
long lDate, lTime;
@@ -1116,16 +1139,18 @@ static HB_ERRCODE hb_delimAddField( DELIMAREAP pArea, LPDBFIELDINFO pFieldInfo )
break;
case HB_FT_TIME:
pFieldInfo->uiType = HB_FT_STRING;
pFieldInfo->uiType = HB_FT_TIMESTAMP;
pFieldInfo->uiLen = 12;
pArea->fTransRec = HB_FALSE;
uiDelim = 2;
break;
case HB_FT_TIMESTAMP:
case HB_FT_MODTIME:
pFieldInfo->uiType = HB_FT_STRING;
pFieldInfo->uiType = HB_FT_TIMESTAMP;
pFieldInfo->uiLen = 23;
pArea->fTransRec = HB_FALSE;
uiDelim = 2;
break;
default:

View File

@@ -411,6 +411,19 @@ static HB_ERRCODE hb_sdfGetValue( SDFAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pI
hb_itemPutDS( pItem, ( char * ) pArea->pRecord + pArea->pFieldOffset[ uiIndex ] );
break;
case HB_FT_TIMESTAMP:
{
long lJulian, lMilliSec;
HB_BYTE * pFieldPtr = pArea->pRecord + pArea->pFieldOffset[ uiIndex ], bChar;
bChar = pFieldPtr[ pField->uiLen ];
pFieldPtr[ pField->uiLen ] = 0;
hb_timeStampStrGetDT( ( const char * ) pFieldPtr, &lJulian, &lMilliSec );
pFieldPtr[ pField->uiLen ] = bChar;
hb_itemPutTDT( pItem, lJulian, lMilliSec );
break;
}
case HB_FT_LONG:
{
HB_MAXINT lVal;
@@ -520,7 +533,7 @@ static HB_ERRCODE hb_sdfPutValue( SDFAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pI
hb_itemGetDS( pItem, szBuffer );
memcpy( pArea->pRecord + pArea->pFieldOffset[ uiIndex ], szBuffer, 8 );
}
else if( pField->uiType == HB_FT_STRING &&
else if( pField->uiType == HB_FT_TIMESTAMP &&
( pField->uiLen == 12 || pField->uiLen == 23 ) )
{
long lDate, lTime;
@@ -870,14 +883,14 @@ static HB_ERRCODE hb_sdfAddField( SDFAREAP pArea, LPDBFIELDINFO pFieldInfo )
break;
case HB_FT_TIME:
pFieldInfo->uiType = HB_FT_STRING;
pFieldInfo->uiType = HB_FT_TIMESTAMP;
pFieldInfo->uiLen = 12;
pArea->fTransRec = HB_FALSE;
break;
case HB_FT_TIMESTAMP:
case HB_FT_MODTIME:
pFieldInfo->uiType = HB_FT_STRING;
pFieldInfo->uiType = HB_FT_TIMESTAMP;
pFieldInfo->uiLen = 23;
pArea->fTransRec = HB_FALSE;
break;