From a500cb7e894aa8a6610f6403aa1cede87b3a3ec6 Mon Sep 17 00:00:00 2001 From: Brian Hays Date: Tue, 17 Dec 2002 18:52:56 +0000 Subject: [PATCH] 2002-12-17 10:50 UTC-0800 Brian Hays --- harbour/ChangeLog | 68 +++- harbour/contrib/rdd_ads/ads.ch | 39 +-- harbour/contrib/rdd_ads/ads1.c | 69 +++- harbour/contrib/rdd_ads/adsfunc.c | 86 ++++- harbour/contrib/rdd_ads/doc/en/adsfuncs.txt | 369 +++++++++++++++++++- harbour/contrib/rdd_ads/doc/en/readme.txt | 43 ++- 6 files changed, 630 insertions(+), 44 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 9e6feec717..aaee656982 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,70 @@ 2002-12-01 23:12 UTC+0100 Foo Bar */ + +2002-12-17 10:50 UTC-0800 Brian Hays + * contrib/rdd_ads/ads.ch + - Removed commands for SET PATH, DEFAULT, DELETED, EXACT, + DATEFORMAT and EPOCH since these are handled by the + Set Listener functionality now. + + added new #define ADS_REQUIRE_VERSION6 to control version 6 + ace32.lib/linker requirements + + * contrib/rdd_ads/ads1.c + * created Set Listener support for + HB_SET_DATEFORMAT + HB_SET_DEFAULT + HB_SET_DELETED + HB_SET_EPOCH + HB_SET_EXACT + HB_SET_PATH + So whenever you call the Set() function or commands, + ADS is automatically updated. + + * added these fixes by Luiz Culik: + * Created bDictionary and adsConnectHandle to allow access + to ads data dictionaries; + * store pFieldInfo.uiDec = uiDec for doubles in adsCreateFields. + + * fixed initialization of dVal in adsGetValue + (fix by Ron Christie) + + * fixed Trace in ADS_GETFUNCTABLE(%i, %p), *uiCount, pTable)); + to show the contents of uiCount instead of the pointer address. + + * contrib/rdd_ads/adsfunc.c + * to test SetListener capabilities, added or upgraded + these functions to be classic "Set/Get" functions so + they return the prior ads setting: + AdsSetDeleted + AdsSetDefault + AdsSetSearchPath + AdsSetExact + NOTE! Because the Set() function now also controls + ADS, there is no reason for normal code to ever call + these functions. If you do, you may get ADS out of sync + with Harbour's settings and create unpredictable results. + + + added these funcs by Luiz Culik: + AdsAddTable() + AdsAddUser To Group() + AdsUseDictionary() + These are all protected by ADS_REQUIRE_VERSION6, so to use them + you must define it when compiling rddads. + + The data dictionary support is a work-in-progress and may need + to be re-thought, so don't get too dependent upon current + implementation. + + * contrib/rdd_ads/doc/en/adsfuncs.txt + + added documentation for functions in adsfunc.c + * contrib/rdd_ads/doc/en/readme.txt + + added explanation for using the Set() function call + as well as the equivalent commands for SET DEFAULT TO, + DATEFORMAT, DELETE, EXACT and EPOCH. + + added explanation of INDEXING and Progress Displays using + AdsRegCallBack() (and why EVAL/EVERY cannot be supported.) + 2002-12-17 12:40 UTC-0300 Walter Negro * source/tget.prg ! Fix, UpdateBuffer() should not actualize the variable if the value @@ -53,7 +117,7 @@ 2002-11-26 21:20 UTC+0100 Tomaz Zupan * contrib/odbc/browodbc.prg - ! There was a bug in skipping, that threw an error when + ! There was a bug in skipping, that threw an error when dataset contained 0 rows 2002-11-25 21:45 UTC-0300 Luiz Rafael Culik @@ -98,7 +162,7 @@ 2002-11-18 22:35 UTC+0300 Alexander Kresin * source/rdd/dbcmd.c - ! COPY TO ... FIELDS ... is fixed - fields in the result dbf are in the + ! COPY TO ... FIELDS ... is fixed - fields in the result dbf are in the same secuence as in the FIELDS clause. 2002-11-18 14:55 UTC+0300 Alexander Kresin diff --git a/harbour/contrib/rdd_ads/ads.ch b/harbour/contrib/rdd_ads/ads.ch index f1f68fbde5..07599f949f 100644 --- a/harbour/contrib/rdd_ads/ads.ch +++ b/harbour/contrib/rdd_ads/ads.ch @@ -87,11 +87,28 @@ #command SET SERVER LOCAL => AdsSetServerType ( 1 ) #command SET SERVER REMOTE => AdsSetServerType ( 2 ) + /* Server type constants for ORing with AdsSetServerType() */ #define ADS_LOCAL_SERVER 1 #define ADS_REMOTE_SERVER 2 #define ADS_AIS_SERVER 4 +/* + If you are want to use functions from ADS version 6 or later + (data dictionary support, built-in Internet Server + capabilities, etc.), you must do two things: + + 1) Link with an ACE32.LIB created from the version 6 or + later dll that imports these functions, and + 2) Set this "define" when compiling rddads: + + #define ADS_REQUIRE_VERSION6 + + Otherwise, any version of ADS will work but you won't have + the extra functionality available past v.5. + +*/ + #command SET AXS LOCKING ; => AdsLocking( if( upper( <(x)> ) == "ON", .t., .f. ) ) @@ -99,26 +116,4 @@ #command SET CHARTYPE TO ; => AdsSetCharType( if( upper( <(x)> ) == "OEM", 2, 1 ) ) -#command SET DEFAULT TO <(path)> ; - => Set( _SET_DEFAULT, <(path)> ); AdsSetDefault( <(path)> ) -#command SET DEFAULT TO ; - => Set( _SET_DEFAULT, "" ); AdsSetDefault( "" ) - -#command SET PATH TO <(path)> ; - => Set( _SET_PATH, <(path)> ); AdsSetSearchPath( <(path)> ) -#command SET PATH TO ; - => Set( _SET_PATH, "" ); AdsSetSearchPath( "" ) - -#command SET DELETED ; - => Set( _SET_DELETED, <(x)> ) ; - ;AdsSetDeleted( if( upper( <(x)> ) == "ON", .t., .f. ) ) -#command SET DELETED () ; - => Set( _SET_DELETED, ); AdsSetDeleted( ) - -#command SET EPOCH TO ; - => Set( _SET_EPOCH, ); AdsSetEpoch( ) - -#command SET DATE FORMAT [TO] ; - => Set( _SET_DATEFORMAT, ); AdsSetDateFormat( ) - #command COMMIT => AdsWriteAllRecords() diff --git a/harbour/contrib/rdd_ads/ads1.c b/harbour/contrib/rdd_ads/ads1.c index 0fa1c11c99..4840f0caf6 100644 --- a/harbour/contrib/rdd_ads/ads1.c +++ b/harbour/contrib/rdd_ads/ads1.c @@ -69,6 +69,7 @@ static ERRCODE adsRecCount( ADSAREAP pArea, ULONG * pRecCount ); static ERRCODE adsScopeInfo( ADSAREAP pArea, USHORT nScope, PHB_ITEM pItem ); static ERRCODE adsSetScope( ADSAREAP pArea, LPDBORDSCOPEINFO sInfo ); +static iSetListenerHandle; HB_FUNC( _ADS ); HB_FUNC( ADS_GETFUNCTABLE ); @@ -77,6 +78,8 @@ extern int adsFileType; /* current global setting */ extern int adsLockType; extern int adsRights; extern int adsCharType; +extern BOOL bDictionary; +extern ADSHANDLE adsConnectHandle; #ifdef HB_PCODE_VER #undef HB_PRG_PCODE_VER @@ -102,6 +105,48 @@ HB_INIT_SYMBOLS_END( ads1__InitSymbols ) static RDDFUNCS adsSuper = { NULL }; +void adsSetListener_callback( HB_set_enum setting, HB_set_listener_enum when ) +{ + HB_TRACE(HB_TR_DEBUG, ("adsSetListener_callback (%d %d)", setting, when)); + if ( when == HB_SET_LISTENER_AFTER ) /* we don't do anything with BEFORE calls */ + { + switch ( setting ) + { + case HB_SET_DATEFORMAT : + AdsSetDateFormat( (UNSIGNED8*) hb_set.HB_SET_DATEFORMAT ); + break; + case HB_SET_DEFAULT : + AdsSetDefault( (UNSIGNED8*) hb_set.HB_SET_DEFAULT ); + break; + case HB_SET_DELETED : + AdsShowDeleted( ! hb_set.HB_SET_DELETED ); + break; + case HB_SET_EPOCH : + AdsSetEpoch( hb_set.HB_SET_EPOCH ); + break; + case HB_SET_EXACT : + AdsSetExact( hb_set.HB_SET_EXACT ); + break; + case HB_SET_PATH : + AdsSetSearchPath( (UNSIGNED8*) hb_set.HB_SET_PATH ); + break; + +/* Possible TODO? + case HB_SET_MFILEEXT : + if( hb_set.HB_SET_MFILEEXT ) hb_retc( hb_set.HB_SET_MFILEEXT ); + break; + case HB_SET_STRICTREAD : + hb_retl( hb_set.HB_SET_STRICTREAD ); + break; + +*/ + } + } + +} + + + static void commonError( ADSAREAP pArea, USHORT uiGenCode, USHORT uiSubCode, char* filename ) { PHB_ITEM pError; @@ -785,6 +830,7 @@ static ERRCODE adsCreateFields( ADSAREAP pArea, PHB_ITEM pStruct ) pFieldInfo.uiType = HB_IT_LONG; pFieldInfo.uiTypeExtended = ADS_DOUBLE; pFieldInfo.uiLen = 8; + pFieldInfo.uiDec = uiDec; } else return FAILURE; @@ -1044,6 +1090,8 @@ static ERRCODE adsGetValue( ADSAREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) HB_TRACE(HB_TR_DEBUG, ("adsGetValue(%p, %hu, %p)", pArea, uiIndex, pItem)); + dVal = 0; + if( uiIndex > pArea->uiFieldCount ) return FAILURE; @@ -1603,7 +1651,14 @@ static ERRCODE adsOpen( ADSAREAP pArea, LPDBOPENINFO pOpenInfo ) pArea->hStatement = 0; pArea->hOrdCurrent = 0; - ulRetVal = AdsOpenTable ( 0, pOpenInfo->abName, pOpenInfo->atomAlias, + if (bDictionary) + ulRetVal = AdsOpenTable ( adsConnectHandle, pOpenInfo->abName, pOpenInfo->atomAlias, + ADS_DEFAULT, adsCharType, adsLockType, adsRights, + ( (pOpenInfo->fShared) ? ADS_SHARED : ADS_EXCLUSIVE ) | + ( (pOpenInfo->fReadonly) ? ADS_READONLY : ADS_DEFAULT ), + &hTable); + else + ulRetVal = AdsOpenTable ( 0, pOpenInfo->abName, pOpenInfo->atomAlias, pArea->iFileType, adsCharType, adsLockType, adsRights, ( (pOpenInfo->fShared) ? ADS_SHARED : ADS_EXCLUSIVE ) | ( (pOpenInfo->fReadonly) ? ADS_READONLY : ADS_DEFAULT ), @@ -1943,7 +1998,7 @@ static ERRCODE adsOrderCreate( ADSAREAP pArea, LPDBORDERCREATEINFO pOrderInfo ) HB_TRACE(HB_TR_DEBUG, ("adsOrderCreate(%p, %p)", pArea, pOrderInfo)); - if( !pArea->lpdbOrdCondInfo || ( pArea->lpdbOrdCondInfo->fAll && + if( !pArea->lpdbOrdCondInfo || ( pArea->lpdbOrdCondInfo->fAll && !pArea->lpdbOrdCondInfo->fAdditive ) ) SELF_ORDLSTCLEAR( ( AREAP ) pArea ); @@ -2029,7 +2084,7 @@ static ERRCODE adsOrderCreate( ADSAREAP pArea, LPDBORDERCREATEINFO pOrderInfo ) }else pArea->hOrdCurrent = phIndex; - if( pArea->lpdbOrdCondInfo && !pArea->lpdbOrdCondInfo->fAll && + if( pArea->lpdbOrdCondInfo && !pArea->lpdbOrdCondInfo->fAll && !pArea->lpdbOrdCondInfo->fAdditive ) { ADSHANDLE ahIndex[50]; @@ -2779,6 +2834,9 @@ BOOL adsExists( PHB_ITEM pItemTable, PHB_ITEM pItemIndex ) static ERRCODE adsExit( void ) { AdsApplicationExit(); + if ( iSetListenerHandle ) + hb_setListenerRemove( iSetListenerHandle ) ; + return SUCCESS; } @@ -2893,11 +2951,14 @@ HB_FUNC( ADS_GETFUNCTABLE ) uiCount = ( USHORT * ) hb_itemGetPtr( hb_param( 1, HB_IT_POINTER ) ); * uiCount = RDDFUNCSCOUNT; - HB_TRACE(HB_TR_DEBUG, ("ADS_GETFUNCTABLE(%i, %p)", uiCount, pTable)); + HB_TRACE(HB_TR_DEBUG, ("ADS_GETFUNCTABLE(%i, %p)", *uiCount, pTable)); pTable = ( RDDFUNCS * ) hb_itemGetPtr( hb_param( 2, HB_IT_POINTER ) ); if( pTable ) + { + iSetListenerHandle = hb_setListenerAdd( adsSetListener_callback ); hb_retni( hb_rddInherit( pTable, &adsTable, &adsSuper, 0 ) ); + } else hb_retni( FAILURE ); } diff --git a/harbour/contrib/rdd_ads/adsfunc.c b/harbour/contrib/rdd_ads/adsfunc.c index 7237101f46..c6658701fc 100644 --- a/harbour/contrib/rdd_ads/adsfunc.c +++ b/harbour/contrib/rdd_ads/adsfunc.c @@ -64,6 +64,7 @@ #include "hbstack.h" #define HARBOUR_MAX_RDD_FILTER_LENGTH 256 +#define MAX_STR_LEN 255 extern ERRCODE adsCloseCursor( ADSAREAP pArea ); int adsFileType = ADS_CDX; @@ -71,6 +72,7 @@ int adsLockType = ADS_PROPRIETARY_LOCKING; int adsRights = 1; int adsCharType = ADS_ANSI; ADSHANDLE adsConnectHandle = 0; +BOOL bDictionary = FALSE; /* Use Data Dictionary? */ PHB_ITEM itmCobCallBack = 0; @@ -243,12 +245,28 @@ HB_FUNC( ADSSETCHARTYPE ) HB_FUNC( ADSSETDEFAULT ) { + UNSIGNED8 pucDefault[ MAX_STR_LEN+1]; + UNSIGNED16 pusLen = MAX_STR_LEN; + + AdsGetDefault( pucDefault, &pusLen); + + hb_retclen( pucDefault, pusLen ); + if( ISCHAR(1) ) AdsSetDefault( (UNSIGNED8*) hb_parc( 1 ) ); + } + HB_FUNC( ADSSETSEARCHPATH ) { + UNSIGNED8 pucPath[ MAX_STR_LEN+1]; + UNSIGNED16 pusLen = MAX_STR_LEN; + + AdsGetSearchPath( pucPath, &pusLen); + + hb_retclen( pucPath, pusLen ); + if( ISCHAR(1) ) AdsSetSearchPath( (UNSIGNED8*) hb_parc( 1 ) ); } @@ -256,7 +274,25 @@ HB_FUNC( ADSSETSEARCHPATH ) HB_FUNC( ADSSETDELETED ) { UNSIGNED16 usShowDeleted = hb_parl( 1 ); - AdsShowDeleted( !usShowDeleted ); + UNSIGNED16 pbShowDeleted ; + + AdsGetDeleted( &pbShowDeleted ) ; + hb_retl( ! pbShowDeleted ); + + if( ISLOG(1) ) + AdsShowDeleted( !usShowDeleted ); +} + +HB_FUNC( ADSSETEXACT ) +{ + UNSIGNED16 usExact = hb_parl( 1 ); + UNSIGNED16 pbExact ; + + AdsGetExact( &pbExact ) ; + hb_retl( pbExact ); + + if( ISLOG(1) ) + AdsSetExact( usExact ); } HB_FUNC( ADSBLOB2FILE ) @@ -267,7 +303,7 @@ HB_FUNC( ADSBLOB2FILE ) szFileName = hb_parc( 1 ); szFieldName = hb_parc( 2 ); - if( !szFileName || !szFieldName || ( strlen( szFileName ) == 0 ) || + if( !szFileName || !szFieldName || ( strlen( szFileName ) == 0 ) || ( strlen( szFieldName ) == 0 ) ) { hb_errRT_DBCMD( EG_ARG, 1014, NULL, "ADSBLOB2FILE" ); @@ -291,7 +327,7 @@ HB_FUNC( ADSFILE2BLOB ) szFileName = hb_parc( 1 ); szFieldName = hb_parc( 2 ); - if( !szFileName || !szFieldName || ( strlen( szFileName ) == 0 ) || + if( !szFileName || !szFieldName || ( strlen( szFileName ) == 0 ) || ( strlen( szFieldName ) == 0 ) ) { hb_errRT_DBCMD( EG_ARG, 1014, NULL, "ADSFILE2BLOB" ); @@ -907,6 +943,7 @@ HB_FUNC( ADSDISCONNECT ) if ( ulRetVal == AE_SUCCESS ) { + adsConnectHandle = 0; hb_retl( 1 ); } else @@ -1253,3 +1290,46 @@ HB_FUNC( ADSGETLASTERROR ) hb_retnl( ulLastErr ); } +#ifdef ADS_REQUIRE_VERSION6 + +HB_FUNC(ADSADDTABLE) +{ + UNSIGNED32 ulRetVal; + UNSIGNED8 *pTableName = hb_parc( 1 ); + UNSIGNED8 *pTableFileName = hb_parc( 2 ); + UNSIGNED8 *pTableIndexFileName = hb_parc( 3 ); + + ulRetVal= AdsDDAddTable( adsConnectHandle, pTableName, pTableFileName, adsFileType, adsCharType, pTableIndexFileName, NULL); + + if ( ulRetVal == AE_SUCCESS ) + hb_retl(1); + else + hb_retl(0); +} + +HB_FUNC(ADSADDUSERTOGROUP) +{ + UNSIGNED32 ulRetVal; + UNSIGNED8 *pGroup = hb_parc( 1 ); + UNSIGNED8 *pName = hb_parc( 2 ); + + ulRetVal = AdsDDAddUserToGroup( adsConnectHandle, + pGroup, + pName); + + if ( ulRetVal == AE_SUCCESS ) + hb_retl(1); + else + hb_retl(0); +} + +HB_FUNC(ADSUSEDICTIONARY) +{ + BOOL bOld = bDictionary; + if ( ISLOG( 1 ) ) + bDictionary = hb_parl( 1 ) ; + + hb_retl(bOld); +} + +#endif diff --git a/harbour/contrib/rdd_ads/doc/en/adsfuncs.txt b/harbour/contrib/rdd_ads/doc/en/adsfuncs.txt index 217910a044..a76114f136 100644 --- a/harbour/contrib/rdd_ads/doc/en/adsfuncs.txt +++ b/harbour/contrib/rdd_ads/doc/en/adsfuncs.txt @@ -645,14 +645,336 @@ * $END$ */ +/* $DOC$ + * $FUNCNAME$ + * AdsRegCallBack() + * $CATEGORY$ + * Advantage Database RDD + * $ONELINER$ + * For Progress displays: Sets a codeblock to be called during indexing + * $SYNTAX$ + * AdsRegCallBack( bEval ) --> nil + * $ARGUMENTS$ + * The codeblock that is eval'ed every 2 seconds during + * indexing. A numeric value of the "percent completed" is passed + * to the codeblock by the ADS server. The codeblock should return + * a logical value: .T. to abort or .F. to not stop indexing. + * + * $RETURNS$ + * + * $DESCRIPTION$ + * See ACE.HLP for full details on AdsRegisterProgressCallback. + * ACE32.DLL does not support the EVAL/EVERY clauses. Remember, there + * is an external process doing the indexing that knows nothing of + * Harbour expressions or codeblocks. Even with Local Server it's the + * DLLs doing all the indexing. So to do progress meters + * you need to implement this. + * $EXAMPLES$ + * + * FUNCTION Main() + * ... + * AdsRegCallBack( {|nPercent| outputstuff(nPercent)} ) + * /* The above codeblock will be called approximately + * every 2 seconds while indexing. + * The codeblock can return .T. to abort. */ + * INDEX ON First+LAST+LABEL1+LABEL2 TAG First + * AdsClrCallBack() + * RETURN nil + * + * FUNCTION outputstuff(nPercent) /* The "callback" function */ + * ? "output stuff", nPercent + * RETURN inkey() == 27 + * /* If press ESC, returns .T. to abort. */ + *
+ * $TESTS$ + * $STATUS$ + * R + * $COMPLIANCE$ + * Harbour extension + * $PLATFORMS$ + * Windows 32-bit, Linux + * $FILES$ + * Library is RddAds + * Header is ads.ch + * $SEEALSO$ + * AdsClrCallBack() + * $END$ + */ + + +/* $DOC$ + * $FUNCNAME$ + * AdsClrCallBack() + * $CATEGORY$ + * Advantage Database RDD + * $ONELINER$ + * Clears the callback set by AdsRegCallBack(). + * $SYNTAX$ + * AdsClrCallBack() --> nil + * $ARGUMENTS$ + * + * $RETURNS$ + * + * $DESCRIPTION$ + * See AdsRegCallBack(). + * $EXAMPLES$ + * $TESTS$ + * $STATUS$ + * R + * $COMPLIANCE$ + * Harbour extension + * $PLATFORMS$ + * Windows 32-bit, Linux + * $FILES$ + * Library is RddAds + * Header is ads.ch + * $SEEALSO$ + * AdsRegCallBack() + * $END$ + */ + + +/* $DOC$ + * $FUNCNAME$ + * ADSSetDefault() * + * $CATEGORY$ + * Advantage Database RDD + * $ONELINER$ + * Get/Set function for ADS's DEFAULT setting. + * $SYNTAX$ + * ADSSetDefault( [] ) --> cPriorSetting + * $ARGUMENTS$ + * Sets new value if passed. + * + * $RETURNS$ + * + * $DESCRIPTION$ + * This function is NOT recommended! It allows direct access to the + * ADS internal equivalent to SET DEFAULT TO. But this setting is + * automatically maintained by Harbour's Set() function and the + * SET DEFAULT TO command, so normal programming will not use this. + * It exists primarily for testing purposes. + * $EXAMPLES$ + * $TESTS$ + * $STATUS$ + * R + * $COMPLIANCE$ + * Harbour extension + * $PLATFORMS$ + * Windows 32-bit, Linux + * $FILES$ + * Library is RddAds + * Header is ads.ch + * $SEEALSO$ + * $END$ + */ + + +/* $DOC$ + * $FUNCNAME$ + * ADSSetDeleted() * + * $CATEGORY$ + * Advantage Database RDD + * $ONELINER$ + * Get/Set function for ADS's ShowDeleted() setting. + * $SYNTAX$ + * ADSSetDeleted( [] ) --> lPriorSetting + * $ARGUMENTS$ + * Sets new value if passed. The value is parallel + * to Harbour usage, so pass .F. to see deleted records or .T. + * to hide them. (This is inverted from ADS's AdsShowDeleted() + * syntax.) + * + * $RETURNS$ + * + * $DESCRIPTION$ + * This function is NOT recommended! It allows direct access to the + * ADS internal equivalent to SET DELETED. But this setting is + * automatically maintained by Harbour's Set() function and the + * SET DELETED ON/OFF command, so normal programming will not use this. + * It exists primarily for testing purposes. + * $EXAMPLES$ + * $TESTS$ + * $STATUS$ + * R + * $COMPLIANCE$ + * Harbour extension + * $PLATFORMS$ + * Windows 32-bit, Linux + * $FILES$ + * Library is RddAds + * Header is ads.ch + * $SEEALSO$ + * $END$ + */ + + +/* $DOC$ + * $FUNCNAME$ + * AdsSetSearchPath() * + * $CATEGORY$ + * Advantage Database RDD + * $ONELINER$ + * Get/Set function for ADS's AdsSetSearchPath() setting. + * $SYNTAX$ + * AdsSetSearchPath( [] ) --> cPriorSetting + * $ARGUMENTS$ + * Sets new value if passed. + * + * $RETURNS$ + * + * $DESCRIPTION$ + * This function is NOT recommended! It allows direct access to the + * ADS AdsSetSearchPath() setting. But this setting is + * automatically maintained by Harbour's Set() function and the + * SET PATH command, so normal programming will not use this. + * It exists primarily for testing purposes. + * $EXAMPLES$ + * $TESTS$ + * $STATUS$ + * R + * $COMPLIANCE$ + * Harbour extension + * $PLATFORMS$ + * Windows 32-bit, Linux + * $FILES$ + * Library is RddAds + * Header is ads.ch + * $SEEALSO$ + * $END$ + */ + + +/* $DOC$ + * $FUNCNAME$ + * AdsSetExact() * + * $CATEGORY$ + * Advantage Database RDD + * $ONELINER$ + * Get/Set function for ADS's AdsSetExact() setting. + * $SYNTAX$ + * AdsSetExact( [] ) --> lPriorSetting + * $ARGUMENTS$ + * Sets new value if passed. + + * $RETURNS$ + * + * $DESCRIPTION$ + * This function is NOT recommended! It allows direct access to the + * ADS internal equivalent to SET EXACT. But this setting is + * automatically maintained by Harbour's Set() function and the + * SET EXACT ON/OFF command, so normal programming will not use this. + * It exists primarily for testing purposes. + * $EXAMPLES$ + * $TESTS$ + * $STATUS$ + * R + * $COMPLIANCE$ + * Harbour extension + * $PLATFORMS$ + * Windows 32-bit, Linux + * $FILES$ + * Library is RddAds + * Header is ads.ch + * $SEEALSO$ + * $END$ + */ + + +/* $DOC$ + * $FUNCNAME$ + * ADSSetCharType() + * $CATEGORY$ + * Advantage Database RDD + * $ONELINER$ + * Sets the type of character data expected when opening tables. + * $SYNTAX$ + * ADSSetCharType( ) --> nPriorSetting + * $ARGUMENTS$ + * Type of character data in the table. + * From ADS docs: + * Options are ADS_ANSI and ADS_OEM. This indicates the type of + * character data to be stored in the table. For compatibility with + * DOS-based CA-Clipper applications, ADS_OEM should be specified. + * When usTableType is ADS_ADT, this parameter is ignored and ANSI + * is always used. + * + * $RETURNS$ + * + * $DESCRIPTION$ + * See ACE.HLP for full details about the Advantage Database Server. + * This sets the usCharType parameter used when ADS opens a table. + * $EXAMPLES$ + * $TESTS$ + * $STATUS$ + * R + * $COMPLIANCE$ + * Harbour extension + * $PLATFORMS$ + * Windows 32-bit, Linux + * $FILES$ + * Library is RddAds + * Header is ads.ch + * $SEEALSO$ + * AdsRightsCheck(),AdsLocking(), ADSSetFileType() + * $END$ + */ + + +/* $DOC$ + * $FUNCNAME$ + * AdsIsIndexed() + * $CATEGORY$ + * Advantage Database RDD + * $ONELINER$ + * Fast determination for if current workarea has a selected index + * $SYNTAX$ + * AdsIsIndexed() --> lActiveIndex + * $ARGUMENTS$ + * + * $RETURNS$ + * + * $DESCRIPTION$ + * Equivalent to empty(ordSetFocus())<\b>, but faster. + * $EXAMPLES$ + * $TESTS$ + * $STATUS$ + * R + * $COMPLIANCE$ + * Harbour extension + * $PLATFORMS$ + * Windows 32-bit, Linux + * $FILES$ + * Library is RddAds + * $SEEALSO$ + * $END$ + */ + /* TO-DO: -ADSSetCharType -ADSSetDefault -ADSSetDeleted -ADSSetFileType -ADSSetServerType +AdsIsExprValid +ADSGETCONNECTIONHANDLE +AdsGetLastError +AdsSetRelKeyPos +AdsGetRelKeyPos + +v6: + AdsAddTable + AdsAddUserToGroup + ADSUSEDICTIONARY + +AdsAddCustomKey +AdsDeleteCustomKey +AdsGetTableAlias +AdsConnect +AdsDisconnect +AdsCloseAllTables +AdsWriteAllRecords +AdsRefreshRecord +AdsCopyTable +AdsConvertTable +AdsGetNumIndexes ADSDecryptRecord ADSDecryptTable @@ -663,5 +985,42 @@ ADSEncryptTable ADSIsEncryptionEnabled ADSIsRecordEncrypted ADSIsTableEncrypted + */ + +/* $DOC$ + * $FUNCNAME$ + * xxx() + * $CATEGORY$ + * Advantage Database RDD + * $ONELINER$ + * xxx + * $SYNTAX$ + * xxx( ) --> lPriorSetting + * $ARGUMENTS$ + * xxx + * xxx + * + * $RETURNS$ + * + * $DESCRIPTION$ + * See ACE.HLP for full details about the Advantage Database Server. + * ADSRightsCheck() is a Get/Set function for the "rights checking" mode. + * $EXAMPLES$ + * $TESTS$ + * $STATUS$ + * R + * $COMPLIANCE$ + * Harbour extension + * $PLATFORMS$ + * Windows 32-bit, Linux + * $FILES$ + * Library is RddAds + * Header is ads.ch + * $SEEALSO$ + * xxx() + * $END$ + */ + + diff --git a/harbour/contrib/rdd_ads/doc/en/readme.txt b/harbour/contrib/rdd_ads/doc/en/readme.txt index 6f7b643f17..391a47935d 100644 --- a/harbour/contrib/rdd_ads/doc/en/readme.txt +++ b/harbour/contrib/rdd_ads/doc/en/readme.txt @@ -74,15 +74,42 @@ * ACE will always automatically open an index with the same * name as the data file. There is no way to turn this feature off. - * Be sure to use the command SET DEFAULT TO (cDir) and not its - * equivalent Set() function call. The Set() function will not make - * the call to ADS to change its internal setting, but the command - * will. The same is true for DATEFORMAT, DELETE, and EPOCH. - - * For programmers who are already familiar with the - * ACE engine, this also means there are some differences - * between the RDDADS in Harbour and the parallel ACE documentation. + * You can use the Set() function call as well as the equivalent + * commands for SET DEFAULT TO, DATEFORMAT, DELETE, and EPOCH. + * Harbour automatically makes the call to ADS to change its internal + * setting to match Harbour's. + * INDEXING and Progress Displays: + * ACE32.DLL does not support the EVAL/EVERY clauses. Remember, there + * is an external process doing the indexing that knows nothing of + * Harbour expressions or codeblocks. Even with Local Server it's the + * DLLs doing all the indexing. So to do progress meters + * you need to implement adsRegCallback( bEval ). + * It lets you set a codeblock that is eval'ed every 2 seconds. + * A numeric value of the "percent completed" is passed to the + * codeblock by the ADS server. + * + * + * FUNCTION Main() + * ... + * AdsRegCallBack( {|nPercent| outputstuff(nPercent)} ) + * /* The above codeblock will be called approximately + * every 2 seconds while indexing. + * The codeblock can return .T. to abort. */ + * INDEX ON First+LAST+LABEL1+LABEL2 TAG First + * AdsClrCallBack() + * RETURN nil + * + * FUNCTION outputstuff(nPercent) /* The "callback" function */ + * ? "output stuff", nPercent + * RETURN inkey() == 27 + * /* If press ESC, returns .T. to abort. */ + *
+ * + * For programmers who are already familiar with the ACE engine, + * Harbour's compatibility with dbfcdx means there are some differences + * between the RDDADS in Harbour and the parallel ACE documentation: + * * 1) In ACE, skipping backwards to BOF goes to the phantom record and * sets the record number to 0. In RDDADS, the record pointer stays at * the Top record and only the BOF flag is set to True.