diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 0a49c6b9c7..68b5fcfb4c 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,7 @@ +20000212-12:22 GMT+1 Philip Joseph + * contrib/rdd_ads/ads1.c + + Added adsCreate function for creating ads tables. It also supports + adt tables with short names. 20000212-02:30 GMT+1 Victor Szakats * include/gtapi.h + NOTE: added about incompatibilities between Harbour and CA-Cl*pper diff --git a/harbour/contrib/rdd_ads/ads1.c b/harbour/contrib/rdd_ads/ads1.c index 2ce7297119..f7e2b5f114 100644 --- a/harbour/contrib/rdd_ads/ads1.c +++ b/harbour/contrib/rdd_ads/ads1.c @@ -620,7 +620,66 @@ static ERRCODE adsClose( ADSAREAP pArea ) return SUPER_CLOSE( (AREAP)pArea ); } -#define adsCreate NULL +//#define adsCreate NULL +static ERRCODE adsCreate( ADSAREAP pArea, LPDBOPENINFO pCreateInfo) +{ + ADSHANDLE hTable; + UNSIGNED32 uRetVal; + UNSIGNED8 *ucfieldDefs; + UNSIGNED8 ucBuffer[MAX_STR_LEN+1], ucField[HARBOUR_MAX_RDD_FIELDNAME_LENGTH+1]; + USHORT uiCount, uiLen; + LPFIELD pField; + + HB_TRACE(HB_TR_DEBUG, ("adsCreate(%p, %p)", pArea, pCreateInfo)); + + uiLen = (pArea->uiFieldCount * 22) + 1; + ucfieldDefs = (UNSIGNED8 *) hb_xgrab( uiLen ); + ucfieldDefs[0]='\0'; + pField = pArea->lpFields; + for( uiCount = 0; uiCount < pArea->uiFieldCount; uiCount++ ) + { + switch ( pField->uiType ) + { + case 'D' : + case 'L' : + case 'M' : + if(strlen((( PHB_DYNS ) pField->sym )->pSymbol->szName) > HARBOUR_MAX_RDD_FIELDNAME_LENGTH ) + { + ucField[0]='\0'; + strncat(ucField, (( PHB_DYNS ) pField->sym )->pSymbol->szName, + HARBOUR_MAX_RDD_FIELDNAME_LENGTH); + sprintf(ucBuffer,"%s,%c;", ucField, pField->uiType ); + } + else + sprintf(ucBuffer,"%s,%c;", ( ( PHB_DYNS ) pField->sym )->pSymbol->szName, + pField->uiType ); + break; + default : + if(strlen((( PHB_DYNS ) pField->sym )->pSymbol->szName) > HARBOUR_MAX_RDD_FIELDNAME_LENGTH ) + { + ucField[0]='\0'; + strncat(ucField, (( PHB_DYNS ) pField->sym )->pSymbol->szName, + HARBOUR_MAX_RDD_FIELDNAME_LENGTH); + sprintf(ucBuffer,"%s,%c,%d,%d;", ucField, pField->uiType, pField->uiLen, pField->uiDec ); + } + else + sprintf(ucBuffer,"%s,%c,%d,%d;", (( PHB_DYNS ) pField->sym )->pSymbol->szName, + pField->uiType, pField->uiLen, pField->uiDec ); + break; + } + strcat(ucfieldDefs, ucBuffer); + pField++; + } + pArea->lpDataInfo->hFile = FS_ERROR; + uRetVal = AdsCreateTable( 0, pCreateInfo->abName, NULL, adsFileType, adsCharType, + adsLockType, adsRights, ADS_DEFAULT, ucfieldDefs, &hTable); + + hb_xfree(ucfieldDefs); + if( uRetVal != AE_SUCCESS ) + return FAILURE; + AdsCloseTable(hTable); + return SUCCESS; +} static ERRCODE adsInfo( ADSAREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) {