2008-04-28 01:00 UTC+0100 Viktor Szakats (harbour.01 syenar hu)
* contrib/rdd_ads/adsfunc.c
! Fixed warning in ADSDIRECTORY() for ADS >= 9.00.
* contrib/rdd_ads/adsfunc.c
* contrib/rdd_ads/adsmgmnt.c
+ Added AdsIsEmpty( <cFieldName | nFieldPos> ) -> <lValue>
With .adt tables will return .T. if value of the field is NULL.
With .dbf it's just equivalent to Empty().
(by Luis Krause Mantilla)
+ Added ADSMGGetOpenTables( nMaxNumberOfFilesToReturn, cUserName, nConnection )
+ Added ADSMGGetOpenIndexes( nMaxNumberOfFilesToReturn, cTableName, cUserName, nConnection )
(by Antonio Carlos Pantaglione & Brian Hays)
; Changes borrowed from xhb, added minor optimization, formatting and warning fix.
* include/hbclass.ch
! Comment typos.
This commit is contained in:
@@ -8,6 +8,24 @@
|
||||
2008-12-31 13:59 UTC+0100 Foo Bar <foo.bar@foobar.org>
|
||||
*/
|
||||
|
||||
2008-04-28 01:00 UTC+0100 Viktor Szakats (harbour.01 syenar hu)
|
||||
* contrib/rdd_ads/adsfunc.c
|
||||
! Fixed warning in ADSDIRECTORY() for ADS >= 9.00.
|
||||
|
||||
* contrib/rdd_ads/adsfunc.c
|
||||
* contrib/rdd_ads/adsmgmnt.c
|
||||
+ Added AdsIsEmpty( <cFieldName | nFieldPos> ) -> <lValue>
|
||||
With .adt tables will return .T. if value of the field is NULL.
|
||||
With .dbf it's just equivalent to Empty().
|
||||
(by Luis Krause Mantilla)
|
||||
+ Added ADSMGGetOpenTables( nMaxNumberOfFilesToReturn, cUserName, nConnection )
|
||||
+ Added ADSMGGetOpenIndexes( nMaxNumberOfFilesToReturn, cTableName, cUserName, nConnection )
|
||||
(by Antonio Carlos Pantaglione & Brian Hays)
|
||||
; Changes borrowed from xhb, added minor optimization, formatting and warning fix.
|
||||
|
||||
* include/hbclass.ch
|
||||
! Comment typos.
|
||||
|
||||
2008-04-27 22:42 UTC+0100 Viktor Szakats (harbour.01 syenar hu)
|
||||
* source/common/hbver.c
|
||||
+ OS(), hb_verPlatform(): Added detection of Windows Server 2008.
|
||||
|
||||
@@ -2002,6 +2002,35 @@ HB_FUNC( ADSCACHEOPENCURSORS )
|
||||
hb_retnl( ulRetVal );
|
||||
}
|
||||
|
||||
// Use AdsIsEmpty() to determine if the indicated field is NULL for ADTs or empty for DBFs
|
||||
HB_FUNC( ADSISEMPTY )
|
||||
{
|
||||
UNSIGNED32 ulRetVal = ~AE_SUCCESS;
|
||||
UNSIGNED16 pbEmpty = FALSE;
|
||||
ADSAREAP pArea;
|
||||
UNSIGNED8* pucFldName;
|
||||
|
||||
pArea = hb_rddGetADSWorkAreaPointer();
|
||||
if( ! ISCHAR( 1 ) && ! ISNUM( 1 ) )
|
||||
{
|
||||
hb_errRT_DBCMD( EG_ARG, 1014, NULL, "ADSISEMPTY" );
|
||||
return;
|
||||
}
|
||||
else if( pArea )
|
||||
{
|
||||
pucFldName = ( ISCHAR( 1 ) ? ( UNSIGNED8* ) hb_parcx( 1 ) : ADSFIELD( hb_parni( 1 ) ) );
|
||||
ulRetVal = AdsIsEmpty( pArea->hTable, pucFldName, &pbEmpty );
|
||||
}
|
||||
|
||||
if( ! pArea || ulRetVal != AE_SUCCESS )
|
||||
{
|
||||
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, "ADSISEMPTY" );
|
||||
return;
|
||||
}
|
||||
|
||||
hb_retl( pbEmpty );
|
||||
}
|
||||
|
||||
#if ADS_REQUIRE_VERSION >= 6
|
||||
|
||||
HB_FUNC( ADSGETNUMACTIVELINKS ) // requires 6.2 ! Only valid for a DataDict
|
||||
@@ -2469,7 +2498,11 @@ HB_FUNC( ADSDIRECTORY )
|
||||
UNSIGNED32 ulRetVal;
|
||||
UNSIGNED8 ucFileName[ ADS_MAX_TABLE_NAME ];
|
||||
UNSIGNED16 usFileNameLen;
|
||||
#if ADS_REQUIRE_VERSION >= 900
|
||||
ADSHANDLE sHandle = 0;
|
||||
#else
|
||||
SIGNED32 sHandle = 0;
|
||||
#endif
|
||||
PHB_ITEM pitmDir, pitmFileName;
|
||||
ADSHANDLE hConnect = HB_ADS_PARCONNECTION( 2 );
|
||||
|
||||
@@ -2477,7 +2510,7 @@ HB_FUNC( ADSDIRECTORY )
|
||||
hb_arrayNew( pitmDir, 0 );
|
||||
|
||||
usFileNameLen = ADS_MAX_TABLE_NAME;
|
||||
ulRetVal = AdsFindFirstTable( hConnect, ( UNSIGNED8* ) ( ISCHAR( 1 ) ? hb_parcx( 1 ) : "" ), ucFileName, &usFileNameLen, &sHandle );
|
||||
ulRetVal = AdsFindFirstTable( hConnect, ( UNSIGNED8* ) ( ISCHAR( 1 ) ? hb_parcx( 1 ) : "" ), ( UNSIGNED8* ) ucFileName, &usFileNameLen, &sHandle );
|
||||
if ( ulRetVal == AE_SUCCESS || ulRetVal == AE_NO_FILE_FOUND )
|
||||
{
|
||||
while( ulRetVal == AE_SUCCESS )
|
||||
|
||||
@@ -98,7 +98,7 @@ HB_FUNC( ADSMGGETINSTALLINFO )
|
||||
// printf( "\nMore possible info available." );
|
||||
*/
|
||||
|
||||
if ( ulRetVal == AE_SUCCESS )
|
||||
if( ulRetVal == AE_SUCCESS )
|
||||
{
|
||||
hb_reta( 8 );
|
||||
hb_stornl( stInstallInfo.ulUserOption , -1, 1 ); /* User option purchased*/
|
||||
@@ -504,24 +504,132 @@ HB_FUNC( ADSMGGETSERVERTYPE ) /* Determine OS ADS is running on; see ADS_MGMT_
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( ADSMGGETOPENTABLES ) /* nMaxNumberOfFilesToReturn, cUserName, nConnection */
|
||||
{ /* TODO: We're throwing away the locktype info. First edition
|
||||
* should have returned a 2-dim array. Perhaps see if a 4th arg
|
||||
* is passed as an (empty) array, if so populate parallel array
|
||||
* of locktypes. OR pass a logical to tell it to return 2-dim array */
|
||||
UNSIGNED32 ulRetVal;
|
||||
char * pucUserName = hb_parc( 2 );
|
||||
UNSIGNED16 pusArrayLen = 300;
|
||||
UNSIGNED16 ulCount;
|
||||
UNSIGNED16 pusStructSize = sizeof( ADS_MGMT_TABLE_INFO );
|
||||
ADS_MGMT_TABLE_INFO * astOpenTableInfo;
|
||||
UNSIGNED16 usConnNumber = 0 ; // = HB_ADS_PARCONNECTION( 3 ) >>> only valid for netware,
|
||||
// so don't default to current, only take a passed value
|
||||
|
||||
if( ISNUM( 1 ) )
|
||||
{
|
||||
pusArrayLen = ( UNSIGNED16 ) hb_parnl( 1 );
|
||||
}
|
||||
|
||||
if( !pucUserName || ( strlen( pucUserName ) == 0 ) )
|
||||
{
|
||||
pucUserName = NULL;
|
||||
}
|
||||
|
||||
if( ISNUM( 3 ) )
|
||||
{
|
||||
usConnNumber = (UNSIGNED16) hb_parnl( 3 );
|
||||
}
|
||||
|
||||
astOpenTableInfo = ( ADS_MGMT_TABLE_INFO * ) hb_xgrab( sizeof( ADS_MGMT_TABLE_INFO ) * pusArrayLen );
|
||||
|
||||
ulRetVal = AdsMgGetOpenTables( hMgmtHandle,
|
||||
(UNSIGNED8 *) pucUserName,
|
||||
usConnNumber,
|
||||
astOpenTableInfo,
|
||||
&pusArrayLen,
|
||||
&pusStructSize );
|
||||
|
||||
if( ulRetVal == AE_SUCCESS )
|
||||
{
|
||||
PHB_ITEM pArray = hb_itemArrayNew( pusArrayLen );
|
||||
|
||||
for( ulCount = 1; ulCount <= pusArrayLen; ulCount++ )
|
||||
{
|
||||
hb_itemPutC( hb_arrayGetItemPtr( pArray, ( ULONG ) ulCount ), ( char * ) astOpenTableInfo[ ulCount - 1 ].aucTableName );
|
||||
}
|
||||
hb_itemReturnRelease( pArray );
|
||||
}
|
||||
else
|
||||
{
|
||||
hb_reta( 0 );
|
||||
}
|
||||
|
||||
if( astOpenTableInfo )
|
||||
{
|
||||
hb_xfree( astOpenTableInfo );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
HB_FUNC( ADSMGGETOPENINDEXES ) /* nMaxNumberOfFilesToReturn, cTableName, cUserName, nConnection */
|
||||
{
|
||||
UNSIGNED32 ulRetVal;
|
||||
UNSIGNED16 pusArrayLen = 300;
|
||||
char * pucTableName = hb_parc( 2 ); // fully qualified path to that table
|
||||
char * pucUserName = hb_parc( 3 );
|
||||
UNSIGNED16 usConnNumber = 0 ; // = HB_ADS_PARCONNECTION( 4 ) >>> only valid for netware,
|
||||
// so don't default to current, only take a passed value
|
||||
UNSIGNED16 ulCount;
|
||||
UNSIGNED16 pusStructSize = sizeof( ADS_MGMT_INDEX_INFO );
|
||||
ADS_MGMT_INDEX_INFO * astOpenIndexInfo;
|
||||
|
||||
if( ISNUM( 1 ) )
|
||||
{
|
||||
pusArrayLen = ( UNSIGNED16 ) hb_parnl( 1 );
|
||||
}
|
||||
|
||||
if( !pucTableName || ( strlen( pucTableName ) == 0 ) )
|
||||
{
|
||||
pucTableName = NULL;
|
||||
}
|
||||
|
||||
if( !pucUserName || ( strlen( pucUserName ) == 0 ) )
|
||||
{
|
||||
pucUserName = NULL;
|
||||
}
|
||||
|
||||
if( ISNUM( 4 ) )
|
||||
{
|
||||
usConnNumber = (UNSIGNED16) hb_parnl( 4 );
|
||||
}
|
||||
|
||||
astOpenIndexInfo = ( ADS_MGMT_INDEX_INFO * ) hb_xgrab( sizeof( ADS_MGMT_INDEX_INFO ) * pusArrayLen );
|
||||
|
||||
ulRetVal = AdsMgGetOpenIndexes( hMgmtHandle,
|
||||
(UNSIGNED8 *) pucTableName,
|
||||
(UNSIGNED8 *) pucUserName,
|
||||
usConnNumber,
|
||||
astOpenIndexInfo,
|
||||
&pusArrayLen,
|
||||
&pusStructSize );
|
||||
|
||||
if( ulRetVal == AE_SUCCESS )
|
||||
{
|
||||
PHB_ITEM pArray = hb_itemArrayNew( pusArrayLen );
|
||||
|
||||
for( ulCount = 1; ulCount <= pusArrayLen; ulCount++ )
|
||||
{
|
||||
hb_itemPutC( hb_arrayGetItemPtr( pArray, ( ULONG ) ulCount ), ( char * ) astOpenIndexInfo[ ulCount - 1 ].aucIndexName );
|
||||
}
|
||||
hb_itemReturnRelease( pArray );
|
||||
}
|
||||
else
|
||||
{
|
||||
hb_reta( 0 );
|
||||
}
|
||||
|
||||
if( astOpenIndexInfo )
|
||||
{
|
||||
hb_xfree( astOpenIndexInfo );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
HB_FUNC( ADSMGGETOPENTABLES )
|
||||
{
|
||||
UNSIGNED32 ulRetVal ;
|
||||
UNSIGNED32 ulMaxUsers = 100 ; // needed for array memory allocation; caller can set with 2nd arg
|
||||
UNSIGNED32 ulCount;
|
||||
UNSIGNED16 usStructSize = sizeof( ADS_MGMT_USER_INFO );
|
||||
ADS_MGMT_USER_INFO* pastUserInfo;
|
||||
Get # of tables from ADS_MGMT_ACTIVITY_INFO
|
||||
}
|
||||
|
||||
HB_FUNC( ADSMGGETOPENINDEXES )
|
||||
{
|
||||
UNSIGNED32 ulRetVal = AE_SUCCESS;
|
||||
AdsMgGetOpenIndexes();
|
||||
}
|
||||
|
||||
HB_FUNC( ADSMGGETLOCKS )
|
||||
{
|
||||
UNSIGNED32 ulRetVal = AE_SUCCESS;
|
||||
@@ -539,7 +647,9 @@ HB_FUNC( ADSMGKILLUSER )
|
||||
UNSIGNED32 ulRetVal = AE_SUCCESS;
|
||||
AdsMgKillUser();
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
HB_FUNC( ADSMGKILLUSER )
|
||||
{
|
||||
hb_retnl( (UNSIGNED16) AdsMgKillUser( hMgmtHandle, (UNSIGNED8 *) hb_parc(1), (UNSIGNED16) hb_parnl(2) ));
|
||||
|
||||
@@ -82,17 +82,17 @@
|
||||
/* This is work in progress ... */
|
||||
/* FWOBJECT AND CLASSY compatibility are the base of this work */
|
||||
/* VO is just here as I like it's way of */
|
||||
/* instanciating object but there is only a very few VO keywords here :-( */
|
||||
/* instantiating object but there is only a very few VO keywords here :-( */
|
||||
/* TOPCLASS is better implemented because I like the way some Classy command */
|
||||
/* are simplified */
|
||||
/* There is also a big common block extending in fact each of the four base syntax */
|
||||
/* it seem actually impossible to completely separate it without creating */
|
||||
/* four differents include file (what I would not see in fact ) */
|
||||
/* four different include files (what I would not see in fact ) */
|
||||
|
||||
/* There is also two compatibility define you can use */
|
||||
/* HB_CLS_NOTOBJECT wich IF DEFINED, disable the auto inherit of HBObject */
|
||||
/* (wich in fact also disable the classy compatibility :new(...) => :Init(...) */
|
||||
/* HB_CLS_NOAUTOINIT wich disable the (VO like) AutoInit for Logical and Numeric */
|
||||
/* HB_CLS_NOTOBJECT which IF DEFINED, disable the auto inherit of HBObject */
|
||||
/* (which in fact also disable the classy compatibility :new(...) => :Init(...) */
|
||||
/* HB_CLS_NOAUTOINIT which disable the (VO like) AutoInit for Logical and Numeric */
|
||||
/* when not specifically initiated */
|
||||
/* These two are disabled by default */
|
||||
/* So Each class _inherit_ of HBObject by default and */
|
||||
@@ -156,7 +156,7 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* should we use <<ClassName>_ prefix for real method names? */
|
||||
/* should we use <ClassName>_ prefix for real method names? */
|
||||
#ifdef HB_CLS_NO_DECORATION
|
||||
#xtranslate __HB_CLS_MTHNAME <ClassName> <MethodName> => <MethodName>
|
||||
#else
|
||||
|
||||
Reference in New Issue
Block a user