From 2e24ca5fe9208f1cf663716e9bac26718834f66d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Fri, 27 Jun 2014 17:20:30 +0200 Subject: [PATCH] 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 --- ChangeLog.txt | 6 ++++++ src/rdd/delim1.c | 37 +++++++++++++++++++++++++++++++------ src/rdd/sdf1.c | 19 ++++++++++++++++--- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index dd5090adbc..9a59bcb0ee 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -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 diff --git a/src/rdd/delim1.c b/src/rdd/delim1.c index 8dd253cd33..1d2fb94d02 100644 --- a/src/rdd/delim1.c +++ b/src/rdd/delim1.c @@ -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: diff --git a/src/rdd/sdf1.c b/src/rdd/sdf1.c index 125b88dac6..aa68d1ad92 100644 --- a/src/rdd/sdf1.c +++ b/src/rdd/sdf1.c @@ -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;