From 2ac9ec265fe38d34e0514b78509f7532ccb01923 Mon Sep 17 00:00:00 2001 From: Mindaugas Kavaliauskas Date: Thu, 23 Dec 2010 11:46:22 +0000 Subject: [PATCH] 2010-12-23 13:45 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt) * harbour/contrib/rddads/ads1.c + added DBFIELDINFO( DBS_ISNULL, ) support ; ADT tables support NULL values, but ADS returns ISNULL=.T. for all empty CDX values. ; This modification does not alter FIELDGET() values * harbour/contrib/hbmemio/memio.c * pacified MSVC warnings --- harbour/ChangeLog | 9 ++ harbour/contrib/hbmemio/memio.c | 8 +- harbour/contrib/rddads/ads1.c | 212 ++++++++++++++++++-------------- 3 files changed, 133 insertions(+), 96 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index d14e88f894..a1426b5757 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,15 @@ The license applies to all entries newer than 2009-04-28. */ +2010-12-23 13:45 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt) + * harbour/contrib/rddads/ads1.c + + added DBFIELDINFO( DBS_ISNULL, ) support + ; ADT tables support NULL values, but ADS returns ISNULL=.T. for + all empty CDX values. + ; This modification does not alter FIELDGET() values + * harbour/contrib/hbmemio/memio.c + * pacified MSVC warnings + 2010-12-22 01:36 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/src/vm/itemapi.c + added support for symbol items in hb_itemString() function diff --git a/harbour/contrib/hbmemio/memio.c b/harbour/contrib/hbmemio/memio.c index ee5d7603a8..1d628c9b42 100644 --- a/harbour/contrib/hbmemio/memio.c +++ b/harbour/contrib/hbmemio/memio.c @@ -199,7 +199,7 @@ static PHB_MEMFS_INODE memfsInodeAlloc( const char* szName ) pInode->llSize = 0; pInode->llAlloc = HB_MEMFS_INITSIZE; pInode->pData = ( char * ) hb_xgrab( ( HB_ULONG ) pInode->llAlloc ); - memset( pInode->pData, 0, pInode->llAlloc ); + memset( pInode->pData, 0, ( HB_SIZE ) pInode->llAlloc ); pInode->szName = hb_strdup( szName ); pInode->uiCount = 1; @@ -545,7 +545,7 @@ HB_MEMFS_EXPORT HB_SIZE hb_memfsWriteAt( HB_FHANDLE hFile, const void * pBuff, H llNewAlloc = llOffset + ( HB_FOFFSET ) nCount; pInode->pData = ( char * ) hb_xrealloc( pInode->pData, ( HB_SIZE ) llNewAlloc ); - memset( pInode->pData + ( HB_SIZE ) pInode->llAlloc, 0, llNewAlloc - pInode->llAlloc ); + memset( pInode->pData + ( HB_SIZE ) pInode->llAlloc, 0, ( HB_SIZE ) ( llNewAlloc - pInode->llAlloc ) ); pInode->llAlloc = llNewAlloc; } memcpy( pInode->pData + ( HB_SIZE ) llOffset, pBuff, nCount ); @@ -599,7 +599,7 @@ HB_MEMFS_EXPORT HB_BOOL hb_memfsTruncAt( HB_FHANDLE hFile, HB_FOFFSET llOffset ) llNewAlloc = llOffset; pInode->pData = ( char * ) hb_xrealloc( pInode->pData, ( HB_SIZE ) llNewAlloc ); - memset( pInode->pData + ( HB_SIZE ) pInode->llAlloc, 0, llNewAlloc - pInode->llAlloc ); + memset( pInode->pData + ( HB_SIZE ) pInode->llAlloc, 0, ( HB_SIZE ) ( llNewAlloc - pInode->llAlloc ) ); pInode->llAlloc = llNewAlloc; } else if( ( pInode->llAlloc >> 2 ) > ( llOffset > HB_MEMFS_INITSIZE ? llOffset : HB_MEMFS_INITSIZE ) ) @@ -608,7 +608,7 @@ HB_MEMFS_EXPORT HB_BOOL hb_memfsTruncAt( HB_FHANDLE hFile, HB_FOFFSET llOffset ) pInode->pData = ( char * ) hb_xrealloc( pInode->pData, ( HB_SIZE ) pInode->llAlloc ); } - memset( pInode->pData + ( HB_SIZE ) llOffset, 0, pInode->llAlloc - llOffset ); + memset( pInode->pData + ( HB_SIZE ) llOffset, 0, ( HB_SIZE ) ( pInode->llAlloc - llOffset ) ); pInode->llSize = llOffset; HB_MEMFSMT_UNLOCK diff --git a/harbour/contrib/rddads/ads1.c b/harbour/contrib/rddads/ads1.c index ec54013190..edda07bd8e 100644 --- a/harbour/contrib/rddads/ads1.c +++ b/harbour/contrib/rddads/ads1.c @@ -1948,111 +1948,139 @@ static HB_ERRCODE adsFieldCount( ADSAREAP pArea, HB_USHORT * uiFields ) #define adsFieldDisplay NULL -static HB_ERRCODE adsFieldInfo( AREAP pArea, HB_USHORT uiIndex, HB_USHORT uiType, PHB_ITEM pItem ) +static HB_ERRCODE adsFieldInfo( ADSAREAP pArea, HB_USHORT uiIndex, HB_USHORT uiType, PHB_ITEM pItem ) { LPFIELD pField; HB_TRACE(HB_TR_DEBUG, ("adsFieldInfo(%p, %hu, %hu, %p)", pArea, uiIndex, uiType, pItem)); - if( uiIndex > pArea->uiFieldCount ) + if( uiIndex > pArea->area.uiFieldCount ) return HB_FAILURE; - if( uiType != DBS_TYPE ) - return SUPER_FIELDINFO( ( AREAP ) pArea, uiIndex, uiType, pItem ); - - pField = pArea->lpFields + uiIndex - 1; - switch( pField->uiType ) + switch( uiType ) { - case HB_FT_STRING: - if( pField->uiFlags & HB_FF_BINARY ) - hb_itemPutC( pItem, "RAW" ); - else if( pField->uiFlags & HB_FF_UNICODE ) - hb_itemPutC( pItem, "NCHAR" ); + case DBS_ISNULL: + { + UNSIGNED16 bEmpty; + + if( pArea->fPositioned ) + { + UNSIGNED32 u32RetVal; + + u32RetVal = AdsIsEmpty( pArea->hTable, ADSFIELD( uiIndex ), &bEmpty ); + if( u32RetVal != AE_SUCCESS ) + { + commonError( pArea, EG_READ, ( HB_ERRCODE ) u32RetVal, 0, NULL, 0, NULL ); + return HB_FAILURE; + } + } + else + bEmpty = 1; + + hb_itemPutL( pItem, bEmpty != 0 ); + return HB_SUCCESS; + } + + case DBS_TYPE: + { + pField = pArea->area.lpFields + uiIndex - 1; + switch( pField->uiType ) + { + case HB_FT_STRING: + if( pField->uiFlags & HB_FF_BINARY ) + hb_itemPutC( pItem, "RAW" ); + else if( pField->uiFlags & HB_FF_UNICODE ) + hb_itemPutC( pItem, "NCHAR" ); #ifdef ADS_CISTRING - else if( pField->uiTypeExtended == ADS_CISTRING ) - hb_itemPutC( pItem, "CICHARACTER" ); + else if( pField->uiTypeExtended == ADS_CISTRING ) + hb_itemPutC( pItem, "CICHARACTER" ); #endif - else - hb_itemPutC( pItem, "C" ); - break; - - case HB_FT_LOGICAL: - hb_itemPutC( pItem, "L" ); - break; - - case HB_FT_DATE: - hb_itemPutC( pItem, "D" ); - break; - - case HB_FT_LONG: - hb_itemPutC( pItem, "N" ); - break; - - case HB_FT_INTEGER: - hb_itemPutC( pItem, "I" ); - break; - - case HB_FT_DOUBLE: - hb_itemPutC( pItem, "B" ); - break; - - case HB_FT_TIME: - hb_itemPutC( pItem, "T" ); - break; - - case HB_FT_TIMESTAMP: - hb_itemPutC( pItem, "@" ); - break; - - case HB_FT_MODTIME: - hb_itemPutC( pItem, "=" ); - break; - - case HB_FT_ROWVER: - hb_itemPutC( pItem, "^" ); - break; - - case HB_FT_AUTOINC: - hb_itemPutC( pItem, "+" ); - break; - - case HB_FT_CURRENCY: - hb_itemPutC( pItem, "Y" ); - break; - - case HB_FT_CURDOUBLE: - hb_itemPutC( pItem, "Z" ); - break; - - case HB_FT_VARLENGTH: - if( pField->uiFlags & HB_FF_BINARY ) - hb_itemPutC( pItem, "VARBINARY" ); - else if( pField->uiFlags & HB_FF_UNICODE ) - hb_itemPutC( pItem, "NVARCHAR" ); - else - hb_itemPutC( pItem, "Q" ); - break; - - case HB_FT_MEMO: - if( pField->uiFlags & HB_FF_UNICODE ) - hb_itemPutC( pItem, "NMEMO" ); - else - hb_itemPutC( pItem, "M" ); - break; - - case HB_FT_IMAGE: - hb_itemPutC( pItem, "P" ); - break; - - case HB_FT_BLOB: - hb_itemPutC( pItem, "W" ); - break; + else + hb_itemPutC( pItem, "C" ); + break; + + case HB_FT_LOGICAL: + hb_itemPutC( pItem, "L" ); + break; + + case HB_FT_DATE: + hb_itemPutC( pItem, "D" ); + break; + + case HB_FT_LONG: + hb_itemPutC( pItem, "N" ); + break; + + case HB_FT_INTEGER: + hb_itemPutC( pItem, "I" ); + break; + + case HB_FT_DOUBLE: + hb_itemPutC( pItem, "B" ); + break; + + case HB_FT_TIME: + hb_itemPutC( pItem, "T" ); + break; + + case HB_FT_TIMESTAMP: + hb_itemPutC( pItem, "@" ); + break; + + case HB_FT_MODTIME: + hb_itemPutC( pItem, "=" ); + break; + + case HB_FT_ROWVER: + hb_itemPutC( pItem, "^" ); + break; + + case HB_FT_AUTOINC: + hb_itemPutC( pItem, "+" ); + break; + + case HB_FT_CURRENCY: + hb_itemPutC( pItem, "Y" ); + break; + + case HB_FT_CURDOUBLE: + hb_itemPutC( pItem, "Z" ); + break; + + case HB_FT_VARLENGTH: + if( pField->uiFlags & HB_FF_BINARY ) + hb_itemPutC( pItem, "VARBINARY" ); + else if( pField->uiFlags & HB_FF_UNICODE ) + hb_itemPutC( pItem, "NVARCHAR" ); + else + hb_itemPutC( pItem, "Q" ); + break; + + case HB_FT_MEMO: + if( pField->uiFlags & HB_FF_UNICODE ) + hb_itemPutC( pItem, "NMEMO" ); + else + hb_itemPutC( pItem, "M" ); + break; + + case HB_FT_IMAGE: + hb_itemPutC( pItem, "P" ); + break; + + case HB_FT_BLOB: + hb_itemPutC( pItem, "W" ); + break; + + default: + hb_itemPutC( pItem, "U" ); + break; + } + return HB_SUCCESS; + } default: - hb_itemPutC( pItem, "U" ); - break; + return SUPER_FIELDINFO( ( AREAP ) pArea, uiIndex, uiType, pItem ); } - return HB_SUCCESS; } static HB_ERRCODE adsFieldName( ADSAREAP pArea, HB_USHORT uiIndex, void * szName )