* contrib/rddads/ads1.c
* contrib/rddads/adsfunc.c
* contrib/rddads/adsx.c
* src/common/hbfsapi.c
! deleted explicit newlines at EOL in HB_TRACE() calls
* INSTALL
+ added new '0. GUARANTEES AND LIABILITY' section
! updated instructions to create debug build
* utils/hbmk2/hbmk2.prg
* minor cleanups
* utils/hbmk2/Makefile
+ enabled dynamic version of hbmk2 only for mingw builds.
Rest of the targets may or may not work due to CRTL
usage (fprintf()) from HB_COMPILE*() calls which causes
GPF in currently generated shared builds, most probably
due to double copy of statically linked CRTL code.
mingw uses MSVCRT.DLL, so it's not prone to this.
Solution is either to avoid file handling CRTL calls
in compiler code, or to tweak -shared build setting to
death to make it work for all non-mingw compilers.
Both of these is very difficult.
This means that dynamic module loading from scripts
will only work in hbmk2 built with mingw.
; TOFIX: 'make clean' on contribs doesn't work with mingw,
because harbour dll is deleted before hbmk2 is
called, so it cannot be started for cleanup.
2383 lines
68 KiB
C
2383 lines
68 KiB
C
/*
|
|
* $Id$
|
|
*/
|
|
|
|
/*
|
|
* Harbour Project source code:
|
|
* Advantage Database Server RDD (additional functions)
|
|
*
|
|
* Copyright 2008 Viktor Szakats (harbour syenar.net) (cleanups)
|
|
* Copyright 2000 Alexander Kresin <alex@belacy.belgorod.su>
|
|
* www - http://harbour-project.org
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this software; see the file COPYING. If not, write to
|
|
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
|
|
*
|
|
* As a special exception, the Harbour Project gives permission for
|
|
* additional uses of the text contained in its release of Harbour.
|
|
*
|
|
* The exception is that, if you link the Harbour libraries with other
|
|
* files to produce an executable, this does not by itself cause the
|
|
* resulting executable to be covered by the GNU General Public License.
|
|
* Your use of that executable is in no way restricted on account of
|
|
* linking the Harbour library code into it.
|
|
*
|
|
* This exception does not however invalidate any other reasons why
|
|
* the executable file might be covered by the GNU General Public License.
|
|
*
|
|
* This exception applies only to the code released by the Harbour
|
|
* Project under the name Harbour. If you copy code from other
|
|
* Harbour Project or Free Software Foundation releases into a copy of
|
|
* Harbour, as the General Public License permits, the exception does
|
|
* not apply to the code that you add in this way. To avoid misleading
|
|
* anyone as to the status of such modified files, you must delete
|
|
* this exception notice from them.
|
|
*
|
|
* If you write modifications of your own for Harbour, it is your choice
|
|
* whether to permit this exception to apply to your modifications.
|
|
* If you do not wish that, delete this exception notice.
|
|
*
|
|
*/
|
|
|
|
#include "hbvm.h"
|
|
#include "hbapi.h"
|
|
#include "hbapiitm.h"
|
|
#include "hbapierr.h"
|
|
#include "hbapilng.h"
|
|
#include "hbstack.h"
|
|
#include "hbdate.h"
|
|
|
|
#include "rddsys.ch"
|
|
#include "rddads.h"
|
|
|
|
#define HARBOUR_MAX_RDD_FILTER_LENGTH 256
|
|
#define MAX_STR_LEN 255
|
|
#define ADS_MAX_PARAMDEF_LEN 2048
|
|
|
|
int hb_ads_iFileType = ADS_CDX;
|
|
int hb_ads_iLockType = ADS_PROPRIETARY_LOCKING;
|
|
int hb_ads_iCheckRights = ADS_CHECKRIGHTS;
|
|
int hb_ads_iCharType = ADS_ANSI;
|
|
HB_BOOL hb_ads_bTestRecLocks = HB_FALSE; /* Debug Implicit locks */
|
|
|
|
#ifdef ADS_USE_OEM_TRANSLATION
|
|
|
|
HB_BOOL hb_ads_bOEM = HB_FALSE;
|
|
|
|
char * hb_adsOemToAnsi( const char * pszSrc, HB_SIZE nLen )
|
|
{
|
|
if( hb_ads_bOEM )
|
|
{
|
|
int nWideLen = MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED, pszSrc, ( int ) nLen, NULL, 0 );
|
|
LPWSTR pszWide = ( LPWSTR ) hb_xgrab( ( nWideLen + 1 ) * sizeof( wchar_t ) );
|
|
|
|
char * pszDst;
|
|
|
|
MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED, pszSrc, ( int ) nLen, pszWide, nWideLen );
|
|
|
|
nLen = WideCharToMultiByte( CP_ACP, 0, pszWide, nWideLen, NULL, 0, NULL, NULL );
|
|
pszDst = ( char * ) hb_xgrab( nLen + 1 );
|
|
|
|
WideCharToMultiByte( CP_ACP, 0, pszWide, nWideLen, pszDst, ( int ) nLen, NULL, NULL );
|
|
|
|
hb_xfree( pszWide );
|
|
|
|
pszDst[ nLen ] = '\0';
|
|
return pszDst;
|
|
}
|
|
return ( char * ) pszSrc;
|
|
}
|
|
|
|
char * hb_adsAnsiToOem( const char * pszSrc, HB_SIZE nLen )
|
|
{
|
|
if( hb_ads_bOEM )
|
|
{
|
|
int nWideLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszSrc, ( int ) nLen, NULL, 0 );
|
|
LPWSTR pszWide = ( LPWSTR ) hb_xgrab( ( nWideLen + 1 ) * sizeof( wchar_t ) );
|
|
|
|
char * pszDst;
|
|
|
|
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszSrc, ( int ) nLen, pszWide, nWideLen );
|
|
|
|
nLen = WideCharToMultiByte( CP_OEMCP, 0, pszWide, nWideLen, NULL, 0, NULL, NULL );
|
|
pszDst = ( char * ) hb_xgrab( nLen + 1 );
|
|
|
|
WideCharToMultiByte( CP_OEMCP, 0, pszWide, nWideLen, pszDst, ( int ) nLen, NULL, NULL );
|
|
|
|
hb_xfree( pszWide );
|
|
|
|
pszDst[ nLen ] = '\0';
|
|
return pszDst;
|
|
}
|
|
return ( char * ) pszSrc;
|
|
}
|
|
|
|
void hb_adsOemAnsiFree( char * pszSrc )
|
|
{
|
|
if( hb_ads_bOEM )
|
|
hb_xfree( pszSrc );
|
|
}
|
|
|
|
#endif
|
|
|
|
typedef struct
|
|
{
|
|
ADSHANDLE hConnect;
|
|
#if !defined( ADS_LINUX )
|
|
PHB_ITEM pCallBack;
|
|
#endif /* !ADS_LINUX */
|
|
} HB_ADSDATA, * PHB_ADSDATA;
|
|
|
|
#if !defined( ADS_LINUX ) || defined( HB_ADS_TSD_CONNECTION )
|
|
|
|
static void hb_adsThreadRelease( void * cargo )
|
|
{
|
|
PHB_ADSDATA pAdsData = ( PHB_ADSDATA ) cargo;
|
|
|
|
if( pAdsData->hConnect )
|
|
AdsDisconnect( pAdsData->hConnect );
|
|
#if !defined( ADS_LINUX )
|
|
if( pAdsData->pCallBack )
|
|
hb_itemRelease( pAdsData->pCallBack );
|
|
#endif /* !ADS_LINUX */
|
|
}
|
|
|
|
static HB_TSD_NEW( s_adsData, sizeof( HB_ADSDATA ), NULL, hb_adsThreadRelease );
|
|
#define HB_ADS_THREAD_DATA ( ( PHB_ADSDATA ) hb_stackGetTSD( &s_adsData ) )
|
|
|
|
#endif
|
|
|
|
#ifdef HB_ADS_TSD_CONNECTION
|
|
#define HB_ADS_CONN_DATA HB_ADS_THREAD_DATA
|
|
#else
|
|
static HB_ADSDATA s_ads_data;
|
|
#define HB_ADS_CONN_DATA (&s_ads_data)
|
|
#endif
|
|
|
|
ADSHANDLE hb_ads_getConnection( void )
|
|
{
|
|
return HB_ADS_CONN_DATA->hConnect;
|
|
}
|
|
|
|
ADSHANDLE hb_ads_defConnection( ADSHANDLE hConnect, const char * szName )
|
|
{
|
|
if( !hConnect )
|
|
{
|
|
PHB_ADSDATA pAdsData = HB_ADS_CONN_DATA;
|
|
|
|
hConnect = pAdsData->hConnect;
|
|
#ifdef HB_ADS_TSD_CONNECTION
|
|
if( !hConnect )
|
|
{
|
|
if( AdsConnect( ( UNSIGNED8 * ) szName, &hConnect ) == AE_SUCCESS )
|
|
pAdsData->hConnect = hConnect;
|
|
}
|
|
#else
|
|
HB_SYMBOL_UNUSED( szName );
|
|
#endif
|
|
}
|
|
return hConnect;
|
|
}
|
|
|
|
void hb_ads_setConnection( ADSHANDLE hConnect )
|
|
{
|
|
HB_ADS_CONN_DATA->hConnect = hConnect;
|
|
}
|
|
|
|
static void hb_ads_clrConnection( ADSHANDLE hConnect )
|
|
{
|
|
PHB_ADSDATA pAdsData = HB_ADS_CONN_DATA;
|
|
|
|
if( hConnect == 0 || hConnect == pAdsData->hConnect )
|
|
pAdsData->hConnect = 0;
|
|
}
|
|
|
|
#if !defined( ADS_LINUX )
|
|
static PHB_ITEM hb_ads_getCallBack( void )
|
|
{
|
|
return HB_ADS_THREAD_DATA->pCallBack;
|
|
}
|
|
|
|
static void hb_ads_setCallBack( PHB_ITEM pCallBack )
|
|
{
|
|
PHB_ADSDATA pAdsData = HB_ADS_THREAD_DATA;
|
|
|
|
if( pAdsData->pCallBack )
|
|
hb_itemRelease( pAdsData->pCallBack );
|
|
|
|
pAdsData->pCallBack = pCallBack ? hb_itemNew( pCallBack ) : NULL;
|
|
}
|
|
#endif /* !ADS_LINUX */
|
|
|
|
/* Debug Implicit locks Set/Get call */
|
|
HB_FUNC( ADSTESTRECLOCKS )
|
|
{
|
|
hb_retl( hb_ads_bTestRecLocks );
|
|
|
|
if( HB_ISLOG( 1 ) )
|
|
hb_ads_bTestRecLocks = hb_parl( 1 );
|
|
}
|
|
|
|
HB_FUNC( ADSSETFILETYPE )
|
|
{
|
|
hb_retni( hb_ads_iFileType );
|
|
|
|
if( hb_pcount() > 0 )
|
|
{
|
|
int fileType = hb_parni( 1 );
|
|
|
|
#if ADS_LIB_VERSION >= 900
|
|
if( fileType >= ADS_NTX && fileType <= ADS_VFP )
|
|
#else
|
|
if( fileType >= ADS_NTX && fileType <= ADS_ADT )
|
|
#endif
|
|
hb_ads_iFileType = fileType;
|
|
}
|
|
}
|
|
|
|
HB_FUNC( ADSSETSERVERTYPE )
|
|
{
|
|
hb_retnl( hb_pcount() > 0 ? AdsSetServerType( ( UNSIGNED16 ) hb_parni( 1 ) /* servType */ ) : 999999 );
|
|
}
|
|
|
|
HB_FUNC( ADSSETDATEFORMAT )
|
|
{
|
|
UNSIGNED8 pucFormat[ 16 ];
|
|
UNSIGNED16 usLen = sizeof( pucFormat );
|
|
|
|
AdsGetDateFormat( pucFormat, &usLen );
|
|
|
|
hb_retc( usLen > 0 ? ( char * ) pucFormat : NULL );
|
|
|
|
if( HB_ISCHAR( 1 ) )
|
|
AdsSetDateFormat( ( UNSIGNED8 * ) hb_parcx( 1 ) );
|
|
}
|
|
|
|
HB_FUNC( ADSSETEPOCH )
|
|
{
|
|
UNSIGNED16 pusEpoch = 0;
|
|
|
|
if( AdsGetEpoch( &pusEpoch ) == AE_SUCCESS )
|
|
hb_retni( pusEpoch );
|
|
|
|
if( HB_ISNUM( 1 ) )
|
|
AdsSetEpoch( ( UNSIGNED16 ) hb_parni( 1 ) );
|
|
}
|
|
|
|
HB_FUNC( ADSAPPLICATIONEXIT )
|
|
{
|
|
#ifdef __BORLANDC__
|
|
#pragma option push -w-pro
|
|
#endif
|
|
AdsApplicationExit();
|
|
#ifdef __BORLANDC__
|
|
#pragma option pop
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSISSERVERLOADED )
|
|
{
|
|
UNSIGNED16 pbLoaded = 0;
|
|
|
|
hb_retni( HB_ISCHAR( 1 ) && AdsIsServerLoaded( ( UNSIGNED8 * ) hb_parcx( 1 ),
|
|
&pbLoaded ) == AE_SUCCESS ? pbLoaded : 0 );
|
|
}
|
|
|
|
HB_FUNC( ADSGETCONNECTIONTYPE )
|
|
{
|
|
UNSIGNED16 pusConnectType = 0;
|
|
ADSHANDLE hConnToCheck = HB_ADS_PARCONNECTION( 1 );
|
|
|
|
/* NOTE: Caller can specify a connection. Otherwise use default thread local handle.
|
|
The thread default handle will continue to be 0 if no adsConnect60() (Data
|
|
Dictionary) calls are made. Simple table access uses an implicit connection
|
|
whose handle we don't see unless you get it from an opened table
|
|
with ADSGETTABLECONTYPE(). */
|
|
|
|
if( hConnToCheck )
|
|
{
|
|
/* NOTE: This does NOT return the Type of a connection Handle-- it returns whether
|
|
connected to ADS_REMOTE_SERVER, ADS_AIS_SERVER, or ADS_LOCAL_SERVER. */
|
|
|
|
if( AdsGetConnectionType( hConnToCheck, &pusConnectType ) != AE_SUCCESS )
|
|
pusConnectType = AE_INVALID_CONNECTION_HANDLE; /* It may have set an error value, or leave as 0. */
|
|
}
|
|
else
|
|
pusConnectType = AE_NO_CONNECTION; /* AE_INVALID_CONNECTION_HANDLE; */
|
|
|
|
hb_retni( pusConnectType );
|
|
}
|
|
|
|
HB_FUNC( ADSUNLOCKRECORD )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
hb_retl( pArea && AdsUnlockRecord( pArea->hTable, ( UNSIGNED32 ) hb_parnl( 1 ) ) == AE_SUCCESS );
|
|
}
|
|
|
|
HB_FUNC( ADSGETMEMODATATYPE )
|
|
{
|
|
UNSIGNED8 * pszFieldName = ( UNSIGNED8 * ) hb_parc( 1 );
|
|
|
|
if( !pszFieldName )
|
|
pszFieldName = ADSFIELD( hb_parni( 1 ) );
|
|
|
|
if( pszFieldName )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
UNSIGNED16 u16Type = 0;
|
|
|
|
if( pArea && AdsGetMemoDataType( pArea->hTable, pszFieldName,
|
|
&u16Type ) == AE_SUCCESS )
|
|
hb_retni( u16Type );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSGETTABLECONTYPE )
|
|
{
|
|
UNSIGNED16 pusConnectType = 0;
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
ADSHANDLE pTableConnectHandle = 0;
|
|
|
|
AdsGetTableConnection( pArea->hTable, &pTableConnectHandle );
|
|
|
|
if( pTableConnectHandle &&
|
|
AdsGetConnectionType( pTableConnectHandle, &pusConnectType ) != AE_SUCCESS )
|
|
pusConnectType = 0;
|
|
}
|
|
|
|
hb_retni( pusConnectType );
|
|
}
|
|
|
|
HB_FUNC( ADSGETSERVERTIME )
|
|
{
|
|
UNSIGNED8 pucDateBuf[ 16 ];
|
|
UNSIGNED8 pucTimeBuf[ 16 ];
|
|
|
|
UNSIGNED16 usDateBufLen = sizeof( pucDateBuf );
|
|
UNSIGNED16 usTimeBufLen = sizeof( pucTimeBuf );
|
|
|
|
SIGNED32 plTime = 0;
|
|
|
|
if( AdsGetServerTime( HB_ADS_PARCONNECTION( 1 ) /* hConnect */,
|
|
pucDateBuf,
|
|
&usDateBufLen,
|
|
&plTime,
|
|
pucTimeBuf,
|
|
&usTimeBufLen ) == AE_SUCCESS )
|
|
{
|
|
hb_reta( 3 );
|
|
hb_storvc( ( char * ) pucDateBuf, -1, 1 );
|
|
hb_storvc( ( char * ) pucTimeBuf, -1, 2 );
|
|
hb_storvnl( plTime, -1, 3 );
|
|
}
|
|
/* QUESTION: Returning NIL on error. Is this what we want? [vszakats] */
|
|
#if HB_TR_LEVEL >= HB_TR_DEBUG
|
|
else
|
|
{
|
|
HB_TRACE(HB_TR_DEBUG, ("AdsGetServerTime() error"));
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
HB_FUNC( ADSISTABLELOCKED )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED16 pbLocked = 0;
|
|
|
|
if( AdsIsTableLocked( pArea->hTable, &pbLocked ) == AE_SUCCESS )
|
|
hb_retl( pbLocked != 0 );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSISRECORDLOCKED )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
HB_ULONG ulRec;
|
|
UNSIGNED16 pbLocked = 0;
|
|
|
|
if( HB_ISNUM( 1 ) )
|
|
ulRec = hb_parnl( 1 );
|
|
else
|
|
SELF_RECNO( ( AREAP ) pArea, &ulRec );
|
|
|
|
if( AdsIsRecordLocked( pArea->hTable, ( UNSIGNED32 ) ulRec, &pbLocked ) == AE_SUCCESS )
|
|
hb_retl( pbLocked != 0 );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSLOCKING )
|
|
{
|
|
hb_retl( hb_ads_iLockType == ADS_PROPRIETARY_LOCKING );
|
|
|
|
if( hb_pcount() > 0 )
|
|
hb_ads_iLockType = hb_parl( 1 ) ? ADS_PROPRIETARY_LOCKING : ADS_COMPATIBLE_LOCKING;
|
|
}
|
|
|
|
HB_FUNC( ADSRIGHTSCHECK )
|
|
{
|
|
hb_retl( hb_ads_iCheckRights == ADS_CHECKRIGHTS );
|
|
|
|
if( hb_pcount() > 0 )
|
|
hb_ads_iCheckRights = hb_parl( 1 ) ? ADS_CHECKRIGHTS : ADS_IGNORERIGHTS;
|
|
}
|
|
|
|
HB_FUNC( ADSSETCHARTYPE )
|
|
{
|
|
hb_retni( hb_ads_iCharType );
|
|
|
|
if( hb_pcount() > 0 )
|
|
{
|
|
int charType = hb_parni( 1 );
|
|
|
|
#if ADS_LIB_VERSION >= 900
|
|
if( charType >= ADS_ANSI && charType <= ADS_MAX_CHAR_SETS )
|
|
#else
|
|
if( charType >= ADS_ANSI && charType <= ADS_OEM )
|
|
#endif
|
|
hb_ads_iCharType = charType;
|
|
|
|
#ifdef ADS_USE_OEM_TRANSLATION
|
|
if( HB_ISLOG( 2 ) )
|
|
hb_ads_bOEM = hb_parl( 2 );
|
|
#endif
|
|
}
|
|
}
|
|
|
|
/* Return whether the current table is opened with OEM or ANSI character set. */
|
|
HB_FUNC( ADSGETTABLECHARTYPE )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED16 usCharType = 0;
|
|
|
|
AdsGetTableCharType( pArea->hTable, &usCharType );
|
|
|
|
hb_retni( usCharType );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSSETDEFAULT )
|
|
{
|
|
UNSIGNED8 pucDefault[ MAX_STR_LEN + 1 ];
|
|
UNSIGNED16 usLen = sizeof( pucDefault );
|
|
|
|
AdsGetDefault( pucDefault, &usLen );
|
|
|
|
hb_retclen( ( char * ) pucDefault, usLen );
|
|
|
|
if( HB_ISCHAR( 1 ) )
|
|
AdsSetDefault( ( UNSIGNED8 * ) hb_parcx( 1 ) );
|
|
}
|
|
|
|
HB_FUNC( ADSSETSEARCHPATH )
|
|
{
|
|
UNSIGNED8 pucPath[ MAX_STR_LEN + 1 ];
|
|
UNSIGNED16 usLen = sizeof( pucPath );
|
|
|
|
AdsGetSearchPath( pucPath, &usLen );
|
|
|
|
hb_retclen( ( char * ) pucPath, usLen );
|
|
|
|
if( HB_ISCHAR( 1 ) )
|
|
AdsSetSearchPath( ( UNSIGNED8 * ) hb_parcx( 1 ) );
|
|
}
|
|
|
|
HB_FUNC( ADSSETDELETED )
|
|
{
|
|
UNSIGNED16 pbShowDeleted = 0;
|
|
|
|
AdsGetDeleted( &pbShowDeleted );
|
|
|
|
hb_retl( pbShowDeleted == 0 );
|
|
|
|
if( HB_ISLOG( 1 ) )
|
|
AdsShowDeleted( ( UNSIGNED16 ) !hb_parl( 1 ) /* usShowDeleted */ );
|
|
}
|
|
|
|
HB_FUNC( ADSSETEXACT )
|
|
{
|
|
UNSIGNED16 pbExact = 0;
|
|
|
|
AdsGetExact( &pbExact );
|
|
|
|
hb_retl( pbExact != 0 );
|
|
|
|
if( HB_ISLOG( 1 ) )
|
|
AdsSetExact( ( UNSIGNED16 ) hb_parl( 1 ) /* usExact */ );
|
|
}
|
|
|
|
HB_FUNC( ADSBLOB2FILE )
|
|
{
|
|
const char * szFileName = hb_parcx( 1 );
|
|
const char * szFieldName = hb_parcx( 2 );
|
|
|
|
if( *szFileName && *szFieldName )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
hb_retl( AdsBinaryToFile( pArea->hTable,
|
|
( UNSIGNED8 * ) szFieldName,
|
|
( UNSIGNED8 * ) szFileName ) == AE_SUCCESS );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSFILE2BLOB )
|
|
{
|
|
const char * szFileName = hb_parcx( 1 );
|
|
const char * szFieldName = hb_parcx( 2 );
|
|
|
|
if( *szFileName && *szFieldName )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
hb_retl( AdsFileToBinary( pArea->hTable,
|
|
( UNSIGNED8 * ) szFieldName,
|
|
( UNSIGNED16 ) ( hb_pcount() > 2 ? hb_parni( 3 ) : ADS_BINARY ) /* usBinaryType */,
|
|
( UNSIGNED8 * ) szFileName ) == AE_SUCCESS );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
/* 2nd parameter: unsupported Bag Name. */
|
|
HB_FUNC( ADSKEYNO )
|
|
{
|
|
PHB_ITEM pxOrder = hb_param( 1, HB_IT_ANY );
|
|
PHB_ITEM pFilterOption = hb_param( 3, HB_IT_NUMERIC );
|
|
|
|
/* if arg 1 or 3 is bad, toss error */
|
|
if( ( pxOrder == NULL || HB_IS_STRING( pxOrder ) || HB_IS_NUMBER( pxOrder ) || HB_IS_NIL( pxOrder ) ) &&
|
|
( pFilterOption == NULL || HB_IS_NUMBER( pFilterOption ) ) )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED32 pulKey = 0L;
|
|
ADSHANDLE hIndex = 0;
|
|
UNSIGNED16 usFilterOption = pFilterOption ? ( UNSIGNED16 ) hb_itemGetNI( pFilterOption ) : ADS_IGNOREFILTERS;
|
|
|
|
/* get an Index Handle */
|
|
if( pxOrder == NULL || HB_IS_NIL( pxOrder ) ) /* didn't pass it in; use current */
|
|
{
|
|
hIndex = pArea->hOrdCurrent;
|
|
}
|
|
else if( HB_IS_NUMBER( pxOrder ) )
|
|
{
|
|
UNSIGNED8 ordNum = ( UNSIGNED8 ) hb_itemGetNI( pxOrder );
|
|
|
|
if( ordNum > 0 ) /* otherwise leave hIndex at 0 */
|
|
AdsGetIndexHandleByOrder( pArea->hTable, ordNum, &hIndex );
|
|
}
|
|
else if( hb_itemGetCLen( pxOrder ) == 0 ) /* passed empty string */
|
|
{
|
|
hIndex = pArea->hOrdCurrent;
|
|
}
|
|
else
|
|
{
|
|
AdsGetIndexHandle( pArea->hTable,
|
|
( UNSIGNED8 * ) hb_itemGetCPtr( pxOrder ) /* ordName */,
|
|
&hIndex );
|
|
}
|
|
|
|
if( hIndex == 0 ) /* no index selected */
|
|
AdsGetRecordNum( pArea->hTable, usFilterOption, &pulKey );
|
|
else
|
|
AdsGetKeyNum( hIndex, usFilterOption, &pulKey );
|
|
|
|
hb_retnl( pulKey );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
/* 2nd parameter: unsupported Bag Name. */
|
|
HB_FUNC( ADSKEYCOUNT )
|
|
{
|
|
PHB_ITEM pxOrder = hb_param( 1, HB_IT_ANY );
|
|
PHB_ITEM pFilterOption = hb_param( 3, HB_IT_NUMERIC );
|
|
|
|
/* if arg 1 or 3 is bad, toss error */
|
|
if( ( pxOrder == NULL || HB_IS_STRING( pxOrder ) || HB_IS_NUMBER( pxOrder ) || HB_IS_NIL( pxOrder ) ) &&
|
|
( pFilterOption == NULL || HB_IS_NUMBER( pFilterOption ) ) )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED32 pulKey = 0L;
|
|
ADSHANDLE hIndex = 0;
|
|
UNSIGNED16 usFilterOption = pFilterOption ? ( UNSIGNED16 ) hb_itemGetNI( pFilterOption ) : ADS_IGNOREFILTERS;
|
|
|
|
/* get an Index Handle */
|
|
if( pxOrder == NULL || HB_IS_NIL( pxOrder ) ) /* didn't pass it in; use current */
|
|
{
|
|
hIndex = pArea->hOrdCurrent;
|
|
}
|
|
else if( HB_IS_NUMBER( pxOrder ) )
|
|
{
|
|
UNSIGNED8 ordNum = ( UNSIGNED8 ) hb_itemGetNI( pxOrder );
|
|
|
|
if( ordNum > 0 ) /* otherwise leave hIndex at 0 */
|
|
AdsGetIndexHandleByOrder( pArea->hTable, ordNum, &hIndex );
|
|
}
|
|
else if( hb_itemGetCLen( pxOrder ) == 0 ) /* passed empty string */
|
|
{
|
|
hIndex = pArea->hOrdCurrent;
|
|
}
|
|
else
|
|
{
|
|
AdsGetIndexHandle( pArea->hTable,
|
|
( UNSIGNED8 * ) hb_itemGetCPtr( pxOrder ) /* ordName */,
|
|
&hIndex );
|
|
}
|
|
|
|
if( hIndex == 0 ) /* no index selected */
|
|
hIndex = pArea->hTable;
|
|
|
|
if( usFilterOption == ADS_IGNOREFILTERS )
|
|
{
|
|
AdsGetRecordCount( hIndex, ADS_IGNOREFILTERS, &pulKey );
|
|
}
|
|
else
|
|
{
|
|
/* ADS scope handling is flawed; do our own */
|
|
/* One more optimization would be to check if there's a fully optimized AOF available so don't walk ours. */
|
|
|
|
UNSIGNED8 pucScope[ ADS_MAX_KEY_LENGTH + 1 ];
|
|
UNSIGNED16 usBufLen = sizeof( pucScope );
|
|
UNSIGNED8 pucFilter[ HARBOUR_MAX_RDD_FILTER_LENGTH + 1 ];
|
|
|
|
AdsGetScope( hIndex, ADS_BOTTOM, pucScope, &usBufLen );
|
|
|
|
if( usBufLen ) /* had a scope */
|
|
{
|
|
AdsGetAOF( pArea->hTable, pucFilter, &usBufLen );
|
|
|
|
if( usBufLen == 0 ) /* had no AOF */
|
|
AdsGetFilter( pArea->hTable, pucFilter, &usBufLen );
|
|
|
|
if( usBufLen ) /* had a scope with AOF or filter, walk it. Skips obey filters */
|
|
{
|
|
HB_ULONG ulRecNo;
|
|
UNSIGNED16 u16eof;
|
|
|
|
SELF_RECNO( ( AREAP ) pArea, &ulRecNo );
|
|
AdsGotoTop( hIndex );
|
|
|
|
AdsAtEOF( pArea->hTable, &u16eof );
|
|
|
|
while( AdsSkip( hIndex, 1 ) != AE_NO_CURRENT_RECORD && !u16eof )
|
|
{
|
|
AdsAtEOF( pArea->hTable, &u16eof );
|
|
pulKey++;
|
|
}
|
|
|
|
SELF_GOTO( ( AREAP ) pArea, ulRecNo );
|
|
}
|
|
else
|
|
AdsGetRecordCount( hIndex, usFilterOption, &pulKey );
|
|
}
|
|
else /* no scope set */
|
|
AdsGetRecordCount( hIndex, usFilterOption, &pulKey );
|
|
}
|
|
|
|
hb_retnl( pulKey );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSADDCUSTOMKEY )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
if( hb_pcount() > 0 )
|
|
{
|
|
ADSHANDLE hIndex = 0;
|
|
|
|
if( HB_ISNUM( 1 ) )
|
|
AdsGetIndexHandleByOrder( pArea->hTable, ( UNSIGNED16 ) hb_parni( 1 ) /* ordNum */, &hIndex );
|
|
else
|
|
AdsGetIndexHandle( pArea->hTable, ( UNSIGNED8 * ) hb_parcx( 1 ) /* ordName */, &hIndex );
|
|
|
|
hb_retnl( ( long ) AdsAddCustomKey( hIndex ) );
|
|
}
|
|
else if( pArea->hOrdCurrent != 0 )
|
|
hb_retnl( ( long ) AdsAddCustomKey( pArea->hOrdCurrent ) );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOORDER, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSDELETECUSTOMKEY )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
if( hb_pcount() > 0 )
|
|
{
|
|
ADSHANDLE hIndex = 0;
|
|
|
|
if( HB_ISNUM( 1 ) )
|
|
AdsGetIndexHandleByOrder( pArea->hTable, ( UNSIGNED16 ) hb_parni( 1 ) /* ordNum */, &hIndex );
|
|
else
|
|
AdsGetIndexHandle( pArea->hTable, ( UNSIGNED8 * ) hb_parcx( 1 ) /* ordName */, &hIndex );
|
|
|
|
hb_retnl( ( long ) AdsDeleteCustomKey( hIndex ) );
|
|
}
|
|
else if( pArea->hOrdCurrent != 0 )
|
|
hb_retnl( ( long ) AdsDeleteCustomKey( pArea->hOrdCurrent ) );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOORDER, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSCLEARAOF )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
AdsClearAOF( pArea->hTable );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSEVALAOF )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED16 pusOptLevel = 0;
|
|
|
|
if( HB_ISCHAR( 1 ) )
|
|
{
|
|
char * pucFilter = hb_adsOemToAnsi( hb_parc( 1 ), hb_parclen( 1 ) );
|
|
|
|
AdsEvalAOF( pArea->hTable,
|
|
( UNSIGNED8 * ) pucFilter,
|
|
&pusOptLevel );
|
|
|
|
hb_adsOemAnsiFree( pucFilter );
|
|
}
|
|
|
|
hb_retni( pusOptLevel );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSGETTABLEALIAS )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED8 pucAlias[ HB_RDD_MAX_ALIAS_LEN + 1 ];
|
|
UNSIGNED16 usLen = sizeof( pucAlias );
|
|
|
|
if( AdsGetTableAlias( pArea->hTable,
|
|
pucAlias,
|
|
&usLen ) == AE_SUCCESS )
|
|
hb_retclen( ( char * ) pucAlias, usLen );
|
|
else
|
|
hb_retc_null();
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSGETAOF )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED8 pucFilter[ HARBOUR_MAX_RDD_FILTER_LENGTH + 1 ];
|
|
UNSIGNED8 * pucFilter2 = NULL;
|
|
UNSIGNED16 usLen = sizeof( pucFilter );
|
|
|
|
UNSIGNED32 ulRetVal = AdsGetAOF( pArea->hTable,
|
|
pucFilter,
|
|
&usLen );
|
|
|
|
if( usLen > HARBOUR_MAX_RDD_FILTER_LENGTH )
|
|
{
|
|
pucFilter2 = ( UNSIGNED8 * ) hb_xgrab( usLen + 1 );
|
|
ulRetVal = AdsGetAOF( pArea->hTable,
|
|
pucFilter2,
|
|
&usLen );
|
|
}
|
|
|
|
if( ulRetVal == AE_SUCCESS )
|
|
{
|
|
char * szRet = hb_adsAnsiToOem( ( char * ) ( pucFilter2 ? pucFilter2 : pucFilter ), usLen );
|
|
hb_retc( szRet );
|
|
hb_adsOemAnsiFree( szRet );
|
|
}
|
|
else
|
|
hb_retc_null();
|
|
|
|
if( pucFilter2 )
|
|
hb_xfree( pucFilter2 );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSGETAOFOPTLEVEL )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED16 pusOptLevel = 0;
|
|
|
|
hb_retni( AdsGetAOFOptLevel( pArea->hTable,
|
|
&pusOptLevel,
|
|
NULL,
|
|
NULL ) == AE_SUCCESS ? pusOptLevel : ADS_OPTIMIZED_NONE );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSGETAOFNOOPT )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED16 pusOptLevel;
|
|
UNSIGNED8 pucNonOpt[ HARBOUR_MAX_RDD_FILTER_LENGTH + 1 ];
|
|
UNSIGNED16 usLen = sizeof( pucNonOpt );
|
|
|
|
UNSIGNED32 ulRetVal = AdsGetAOFOptLevel( pArea->hTable,
|
|
&pusOptLevel,
|
|
pucNonOpt,
|
|
&usLen );
|
|
|
|
if( usLen > HARBOUR_MAX_RDD_FILTER_LENGTH )
|
|
{
|
|
UNSIGNED8 * pucNonOpt2 = ( UNSIGNED8 * ) hb_xgrab( usLen + 1 );
|
|
|
|
hb_retc( AdsGetAOFOptLevel( pArea->hTable,
|
|
&pusOptLevel,
|
|
pucNonOpt2,
|
|
&usLen ) == AE_SUCCESS ? ( char * ) pucNonOpt2 : NULL );
|
|
|
|
hb_xfree( pucNonOpt2 );
|
|
}
|
|
else
|
|
hb_retc( ulRetVal == AE_SUCCESS ? ( char * ) pucNonOpt : NULL );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSISRECORDINAOF )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED16 bIsInAOF = 0;
|
|
|
|
hb_retl( AdsIsRecordInAOF( pArea->hTable,
|
|
( UNSIGNED32 ) hb_parnl( 1 ) /* ulRecordNumber */, /* 0 for current record */
|
|
&bIsInAOF ) == AE_SUCCESS && bIsInAOF != 0 );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
/* Does current record match any current filter? */
|
|
HB_FUNC( ADSISRECORDVALID )
|
|
{
|
|
HB_BOOL bReturn = HB_FALSE;
|
|
AREAP pArea = ( AREAP ) hb_rddGetCurrentWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
HB_BOOL fEof = HB_TRUE;
|
|
|
|
if( SELF_EOF( ( AREAP ) pArea, &fEof ) == HB_SUCCESS && ! fEof )
|
|
{
|
|
if( pArea->dbfi.itmCobExpr )
|
|
{
|
|
PHB_ITEM pResult = hb_vmEvalBlock( pArea->dbfi.itmCobExpr );
|
|
|
|
bReturn = HB_IS_LOGICAL( pResult ) && hb_itemGetL( pResult );
|
|
}
|
|
else
|
|
bReturn = HB_TRUE;
|
|
}
|
|
}
|
|
|
|
hb_retl( bReturn );
|
|
}
|
|
|
|
HB_FUNC( ADSREFRESHAOF )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
AdsRefreshAOF( pArea->hTable );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSSETAOF )
|
|
{
|
|
if( HB_ISCHAR( 1 ) )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
char * pucFilter = hb_adsOemToAnsi( hb_parc( 1 ), hb_parclen( 1 ) );
|
|
|
|
UNSIGNED32 ulRetVal = AdsSetAOF( pArea->hTable,
|
|
( UNSIGNED8 * ) pucFilter,
|
|
( UNSIGNED16 ) ( hb_pcount() > 1 ? hb_parni( 2 ) : ADS_RESOLVE_DYNAMIC ) /* usResolve */ ); /* ADS_RESOLVE_IMMEDIATE */
|
|
|
|
hb_adsOemAnsiFree( pucFilter );
|
|
|
|
hb_retl( ulRetVal == AE_SUCCESS );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSGETFILTER )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED8 pucFilter[ HARBOUR_MAX_RDD_FILTER_LENGTH + 1 ];
|
|
UNSIGNED8 * pucFilter2 = NULL;
|
|
UNSIGNED16 usLen = sizeof( pucFilter );
|
|
|
|
UNSIGNED32 ulRetVal = AdsGetFilter( pArea->hTable,
|
|
pucFilter,
|
|
&usLen );
|
|
|
|
if( usLen > HARBOUR_MAX_RDD_FILTER_LENGTH )
|
|
{
|
|
pucFilter2 = ( UNSIGNED8 * ) hb_xgrab( usLen + 1 );
|
|
ulRetVal = AdsGetFilter( pArea->hTable,
|
|
pucFilter2,
|
|
&usLen );
|
|
}
|
|
|
|
if( ulRetVal == AE_SUCCESS )
|
|
{
|
|
char * szRet = hb_adsAnsiToOem( ( char * ) ( pucFilter2 ? pucFilter2 : pucFilter ), usLen );
|
|
hb_retc( szRet );
|
|
hb_adsOemAnsiFree( szRet );
|
|
}
|
|
else
|
|
{
|
|
HB_TRACE(HB_TR_DEBUG, ("adsGetFilter() error %lu", ( HB_ULONG ) ulRetVal));
|
|
hb_retc_null();
|
|
}
|
|
|
|
if( pucFilter2 )
|
|
hb_xfree( pucFilter2 );
|
|
}
|
|
else
|
|
hb_retc_null();
|
|
}
|
|
|
|
HB_FUNC( ADSENABLEENCRYPTION )
|
|
{
|
|
const char * pucPassword = hb_parcx( 1 );
|
|
|
|
if( *pucPassword )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
hb_retnl( AdsEnableEncryption( pArea->hTable,
|
|
( UNSIGNED8 * ) pucPassword ) );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSDISABLEENCRYPTION )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
hb_retnl( AdsDisableEncryption( pArea->hTable ) );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSENCRYPTTABLE )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
hb_retnl( AdsEncryptTable( pArea->hTable ) );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSDECRYPTTABLE )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
hb_retnl( AdsDecryptTable( pArea->hTable ) );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSENCRYPTRECORD )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
hb_retnl( AdsEncryptRecord( pArea->hTable ) );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSDECRYPTRECORD )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
hb_retnl( AdsDecryptRecord( pArea->hTable ) );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSISENCRYPTIONENABLED )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED16 usIsEnabled = 0;
|
|
AdsIsEncryptionEnabled( pArea->hTable, &usIsEnabled );
|
|
hb_retl( usIsEnabled != 0 );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSISRECORDENCRYPTED )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED16 usIsEnabled = 0;
|
|
AdsIsRecordEncrypted( pArea->hTable, &usIsEnabled );
|
|
hb_retl( usIsEnabled != 0 );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSISTABLEENCRYPTED )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
UNSIGNED16 usIsEnabled = 0;
|
|
AdsIsTableEncrypted( pArea->hTable, &usIsEnabled );
|
|
hb_retl( usIsEnabled != 0 );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSCONNECT )
|
|
{
|
|
ADSHANDLE hConnect = 0;
|
|
|
|
if( HB_ISCHAR( 1 ) &&
|
|
AdsConnect( ( UNSIGNED8 * ) hb_parcx( 1 ),
|
|
&hConnect ) == AE_SUCCESS )
|
|
{
|
|
hb_ads_setConnection( hConnect );
|
|
hb_retl( HB_TRUE );
|
|
}
|
|
else
|
|
hb_retl( HB_FALSE );
|
|
}
|
|
|
|
HB_FUNC( ADSDISCONNECT )
|
|
{
|
|
/* NOTE: From ace.hlp:
|
|
*
|
|
* AdsDisconnect() is used to disconnect a connection from the specified server.
|
|
* If tables are currently opened, all data is flushed, locks are released,
|
|
* and open tables are closed before the disconnect occurs.
|
|
*
|
|
* If zero is passed as the connection handle, all connections on the server
|
|
* associated with the user will be disconnected. If AdsDisconnect() is called
|
|
* on a connection with a transaction active, the transaction will be rolled back.
|
|
*/
|
|
|
|
ADSHANDLE hConnect = HB_ADS_PARCONNECTION( 1 );
|
|
|
|
/* NOTE: Only allow disconnect of 0 if explicitly passed.
|
|
The thread default connection handle might be 0 if caller
|
|
accidentally disconnects twice. */
|
|
|
|
if( ( hConnect != 0 || HB_ISNUM( 1 ) ) &&
|
|
AdsDisconnect( hConnect ) == AE_SUCCESS )
|
|
{
|
|
hb_ads_clrConnection( hConnect );
|
|
|
|
hb_retl( HB_TRUE );
|
|
}
|
|
else
|
|
hb_retl( HB_FALSE );
|
|
}
|
|
|
|
HB_FUNC( ADSSTMTSETTABLELOCKTYPE )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
hb_retl( pArea && pArea->hStatement &&
|
|
AdsStmtSetTableLockType( pArea->hStatement,
|
|
( UNSIGNED16 ) hb_parni( 1 ) /* usLockType */ ) == AE_SUCCESS );
|
|
}
|
|
|
|
HB_FUNC( ADSCREATESQLSTATEMENT )
|
|
{
|
|
HB_BOOL fResult = HB_FALSE;
|
|
ADSHANDLE hConnect = HB_ADS_PARCONNECTION( 3 );
|
|
|
|
if( hConnect )
|
|
{
|
|
UNSIGNED32 u32RetVal;
|
|
ADSHANDLE adsStatementHandle = 0;
|
|
|
|
u32RetVal = AdsCreateSQLStatement( hConnect, &adsStatementHandle );
|
|
|
|
if( u32RetVal == AE_SUCCESS )
|
|
{
|
|
if( hb_parni( 2 ) == ADS_CDX )
|
|
AdsStmtSetTableType( adsStatementHandle, ADS_CDX );
|
|
#if ADS_LIB_VERSION >= 900
|
|
else if( hb_parni( 2 ) == ADS_VFP )
|
|
AdsStmtSetTableType( adsStatementHandle, ADS_VFP );
|
|
#endif
|
|
|
|
if( hb_rddInsertAreaNode( "ADS" ) )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
char szAlias[ HB_RDD_MAX_ALIAS_LEN + 1 ];
|
|
|
|
hb_strncpy( szAlias, HB_ISCHAR( 1 ) ? hb_parc( 1 ) : "ADSSQL",
|
|
sizeof( szAlias ) - 1 );
|
|
pArea->area.atomAlias = hb_rddAllocWorkAreaAlias( szAlias,
|
|
pArea->area.uiArea );
|
|
if( pArea->area.atomAlias )
|
|
{
|
|
pArea->hTable = 0;
|
|
pArea->hOrdCurrent = 0;
|
|
pArea->hStatement = adsStatementHandle;
|
|
fResult = HB_TRUE;
|
|
}
|
|
else
|
|
hb_rddReleaseCurrentArea();
|
|
}
|
|
}
|
|
|
|
if( ! fResult )
|
|
AdsCloseSQLStatement( adsStatementHandle );
|
|
}
|
|
}
|
|
|
|
hb_retl( fResult );
|
|
}
|
|
|
|
HB_FUNC( ADSEXECUTESQLDIRECT )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea && pArea->hStatement && HB_ISCHAR( 1 ) )
|
|
{
|
|
ADSHANDLE hCursor = 0;
|
|
|
|
if( AdsExecuteSQLDirect( pArea->hStatement,
|
|
( UNSIGNED8 * ) hb_parc( 1 ) /* pucStmt */,
|
|
&hCursor ) == AE_SUCCESS )
|
|
{
|
|
if( hCursor )
|
|
{
|
|
DBOPENINFO pInfo;
|
|
|
|
memset( &pInfo, 0, sizeof( pInfo ) );
|
|
pInfo.abName = "";
|
|
pInfo.fReadonly = HB_TRUE;
|
|
pArea->hTable = hCursor;
|
|
SELF_OPEN( ( AREAP ) pArea, &pInfo );
|
|
}
|
|
else
|
|
hb_adsCloseCursor( pArea );
|
|
|
|
hb_retl( HB_TRUE );
|
|
}
|
|
else
|
|
{
|
|
HB_TRACE(HB_TR_DEBUG, ("AdsExecuteSQLDirect() error"));
|
|
hb_retl( HB_FALSE );
|
|
}
|
|
}
|
|
else
|
|
hb_retl( HB_FALSE );
|
|
}
|
|
|
|
HB_FUNC( ADSPREPARESQL )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea && pArea->hStatement && HB_ISCHAR( 1 ) )
|
|
{
|
|
if( AdsPrepareSQL( pArea->hStatement,
|
|
( UNSIGNED8 * ) hb_parc( 1 ) /* pucStmt */ ) == AE_SUCCESS )
|
|
hb_retl( HB_TRUE );
|
|
else
|
|
{
|
|
HB_TRACE(HB_TR_DEBUG, ("AdsPrepareSQL() error"));
|
|
hb_retl( HB_FALSE );
|
|
}
|
|
}
|
|
else
|
|
hb_retl( HB_FALSE );
|
|
}
|
|
|
|
HB_FUNC( ADSEXECUTESQL )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea && pArea->hStatement )
|
|
{
|
|
ADSHANDLE hCursor = 0;
|
|
|
|
if( AdsExecuteSQL( pArea->hStatement, &hCursor ) == AE_SUCCESS )
|
|
{
|
|
if( hCursor )
|
|
{
|
|
DBOPENINFO pInfo;
|
|
|
|
memset( &pInfo, 0, sizeof( pInfo ) );
|
|
pInfo.abName = "";
|
|
pInfo.fReadonly = HB_TRUE;
|
|
pArea->hTable = hCursor;
|
|
SELF_OPEN( ( AREAP ) pArea, &pInfo );
|
|
}
|
|
else
|
|
hb_adsCloseCursor( pArea );
|
|
|
|
hb_retl( HB_TRUE );
|
|
}
|
|
else
|
|
{
|
|
HB_TRACE(HB_TR_DEBUG, ("AdsExecuteSQL() error"));
|
|
hb_retl( HB_FALSE );
|
|
}
|
|
}
|
|
else
|
|
hb_retl( HB_FALSE );
|
|
}
|
|
|
|
HB_FUNC( ADSVERIFYSQL )
|
|
{
|
|
#if ADS_LIB_VERSION >= 620
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea && pArea->hStatement && HB_ISCHAR( 1 ) )
|
|
hb_retl( AdsVerifySQL( pArea->hStatement, ( UNSIGNED8 * ) hb_parc( 1 ) /* pucStmt */ ) == AE_SUCCESS );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSCLOSEALLTABLES )
|
|
{
|
|
hb_retnl( AdsCloseAllTables() );
|
|
}
|
|
|
|
HB_FUNC( ADSWRITEALLRECORDS )
|
|
{
|
|
hb_retnl( AdsWriteAllRecords() );
|
|
}
|
|
|
|
HB_FUNC( ADSREFRESHRECORD )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
AdsRefreshRecord( pArea->hTable );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
/* lSuccess := AdsCopyTable( cTargetFile [, nAdsFilterOption ] ) */
|
|
HB_FUNC( ADSCOPYTABLE )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
if( HB_ISCHAR( 1 ) )
|
|
hb_retl( AdsCopyTable( ( pArea->hOrdCurrent ) ? pArea->hOrdCurrent : pArea->hTable /* hIndex */, /* If an index is active copy table in indexed order. */
|
|
( UNSIGNED16 ) hb_parnidef( 2, ADS_RESPECTFILTERS ) /* usFilterOption */,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pucFile */ ) == AE_SUCCESS );
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSCONVERTTABLE )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
{
|
|
if( HB_ISCHAR( 1 ) )
|
|
{
|
|
hb_retl( AdsConvertTable( pArea->hTable,
|
|
ADS_IGNOREFILTERS,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pucFile */,
|
|
( UNSIGNED16 ) hb_parnidef( 2, ADS_ADT ) /* usTableType */ ) == AE_SUCCESS );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
#if !defined( ADS_LINUX )
|
|
UNSIGNED32 WINAPI hb_adsShowPercentageCB( UNSIGNED16 usPercentDone )
|
|
{
|
|
PHB_ITEM pCallBack = hb_ads_getCallBack();
|
|
if( pCallBack )
|
|
{
|
|
PHB_ITEM pPercentDone = hb_itemPutNI( NULL, usPercentDone );
|
|
HB_BOOL fResult = hb_itemGetL( hb_vmEvalBlockV( pCallBack, 1, pPercentDone ) );
|
|
|
|
hb_itemRelease( pPercentDone );
|
|
|
|
return fResult ? 1 : 0;
|
|
}
|
|
#if HB_TR_LEVEL >= HB_TR_DEBUG
|
|
else
|
|
{
|
|
HB_TRACE(HB_TR_DEBUG, ("hb_adsShowPercentageCB(%d) called with no codeblock set.", usPercentDone ));
|
|
}
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
#endif /* !ADS_LINUX */
|
|
|
|
HB_FUNC( ADSREGCALLBACK )
|
|
{
|
|
HB_BOOL fResult = HB_FALSE;
|
|
|
|
#if !defined( ADS_LINUX )
|
|
/* NOTE: current implementation is not thread safe.
|
|
ADS can register multiple callbacks, but one per thread/connection.
|
|
To be thread safe, we need multiple connections.
|
|
The registered function (and its codeblock s_pItmCobCallBack) should
|
|
NOT make any Advantage Client Engine calls. If it does,
|
|
it is possible to get error code 6619 "Communication Layer is busy". */
|
|
|
|
PHB_ITEM pCallBack = hb_param( 1, HB_IT_BLOCK );
|
|
|
|
if( pCallBack )
|
|
{
|
|
hb_ads_setCallBack( pCallBack );
|
|
if( AdsRegisterProgressCallback( hb_adsShowPercentageCB ) == AE_SUCCESS )
|
|
fResult = HB_TRUE;
|
|
else
|
|
hb_ads_setCallBack( NULL );
|
|
}
|
|
#endif /* !ADS_LINUX */
|
|
|
|
hb_retl( fResult );
|
|
}
|
|
|
|
HB_FUNC( ADSCLRCALLBACK )
|
|
{
|
|
#if !defined( ADS_LINUX )
|
|
hb_ads_setCallBack( NULL );
|
|
hb_retnl( AdsClearProgressCallback() );
|
|
#else
|
|
hb_retnl( 0 );
|
|
#endif /* ADS_LINUX */
|
|
}
|
|
|
|
HB_FUNC( ADSISINDEXED )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
hb_retl( pArea && pArea->hOrdCurrent != 0 );
|
|
}
|
|
|
|
/* QUESTION: Shouldn't we generate a NOTABLE/NOARG RTEs like in similar functions? [vszakats] */
|
|
HB_FUNC( ADSISEXPRVALID ) /* cExpr */
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
UNSIGNED16 bValidExpr = 0;
|
|
|
|
if( pArea && HB_ISCHAR( 1 ) )
|
|
AdsIsExprValid( pArea->hTable,
|
|
( UNSIGNED8 * ) hb_parc( 1 ) /* pucExpr */,
|
|
&bValidExpr );
|
|
|
|
hb_retl( bValidExpr != 0 );
|
|
}
|
|
|
|
/* QUESTION: Shouldn't we generate a NOTABLE RTE like in similar functions? [vszakats] */
|
|
HB_FUNC( ADSGETNUMINDEXES )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
UNSIGNED16 pusCnt = 0;
|
|
|
|
if( pArea )
|
|
AdsGetNumIndexes( pArea->hTable, &pusCnt );
|
|
|
|
hb_retni( pusCnt );
|
|
}
|
|
|
|
HB_FUNC( ADSCONNECTION ) /* Get/Set func to switch between connections. */
|
|
{
|
|
HB_ADS_RETCONNECTION( hb_ads_getConnection() );
|
|
|
|
hb_ads_setConnection( HB_ADS_PARCONNECTION( 1 ) );
|
|
}
|
|
|
|
HB_FUNC( ADSISCONNECTIONALIVE ) /* Determine if passed or default connection is still valid */
|
|
{
|
|
#if ADS_LIB_VERSION >= 800
|
|
UNSIGNED16 bConnectionIsAlive = 0;
|
|
|
|
AdsIsConnectionAlive( HB_ADS_PARCONNECTION( 1 ), &bConnectionIsAlive );
|
|
|
|
hb_retl( bConnectionIsAlive != 0 );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSGETHANDLETYPE ) /* DD, admin, table */
|
|
{
|
|
UNSIGNED16 usType = AE_INVALID_HANDLE;
|
|
|
|
hb_retni( AdsGetHandleType( HB_ADS_PARCONNECTION( 1 ) /* hConnect */,
|
|
&usType ) == AE_SUCCESS ? usType : AE_INVALID_HANDLE );
|
|
}
|
|
|
|
/* nLastErr := AdsGetLastError( [ @cLastErr ] ) */
|
|
HB_FUNC( ADSGETLASTERROR )
|
|
{
|
|
UNSIGNED32 ulLastErr = ( UNSIGNED32 ) ~AE_SUCCESS;
|
|
UNSIGNED8 aucError[ ADS_MAX_ERROR_LEN + 1 ];
|
|
UNSIGNED16 usLength = ADS_MAX_ERROR_LEN + 1;
|
|
|
|
AdsGetLastError( &ulLastErr, aucError, &usLength );
|
|
|
|
if( ulLastErr == AE_SUCCESS )
|
|
hb_storc( NULL, 1 );
|
|
else
|
|
hb_storclen( ( char * ) aucError, usLength, 1 );
|
|
|
|
hb_retnl( ulLastErr );
|
|
}
|
|
|
|
HB_FUNC( ADSGETNUMOPENTABLES )
|
|
{
|
|
UNSIGNED16 pusNum = 0;
|
|
|
|
AdsGetNumOpenTables( &pusNum );
|
|
|
|
hb_retni( pusNum );
|
|
}
|
|
|
|
HB_FUNC( ADSSHOWERROR )
|
|
{
|
|
AdsShowError( ( UNSIGNED8 * ) hb_parc( 1 ) );
|
|
}
|
|
|
|
HB_FUNC( ADSBEGINTRANSACTION )
|
|
{
|
|
hb_retl( AdsBeginTransaction( hb_parnl( 1 ) /* hConnect */ ) == AE_SUCCESS );
|
|
}
|
|
|
|
HB_FUNC( ADSCOMMITTRANSACTION )
|
|
{
|
|
hb_retl( AdsCommitTransaction( hb_parnl( 1 ) /* hConnect */ ) == AE_SUCCESS );
|
|
}
|
|
|
|
HB_FUNC( ADSFAILEDTRANSACTIONRECOVERY )
|
|
{
|
|
hb_retl( AdsFailedTransactionRecovery( ( UNSIGNED8 * ) hb_parc( 1 ) /* pucServer */ ) == AE_SUCCESS );
|
|
}
|
|
|
|
HB_FUNC( ADSINTRANSACTION )
|
|
{
|
|
UNSIGNED16 pbInTrans = 0;
|
|
|
|
hb_retl( AdsInTransaction( hb_parnl( 1 ) /* hConnect */,
|
|
&pbInTrans ) == AE_SUCCESS ? pbInTrans != 0 : HB_FALSE );
|
|
}
|
|
|
|
HB_FUNC( ADSROLLBACK )
|
|
{
|
|
hb_retl( AdsRollbackTransaction( hb_parnl( 1 ) /* hConnect */ ) == AE_SUCCESS );
|
|
}
|
|
|
|
/*
|
|
set the number of records to read ahead, for the current work area
|
|
Call: ADSCACHERECORDS( nRecords )
|
|
Returns: True if successful
|
|
*/
|
|
HB_FUNC( ADSCACHERECORDS )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea && AdsCacheRecords( pArea->hTable,
|
|
( UNSIGNED16 ) hb_parni( 1 ) ) == AE_SUCCESS )
|
|
hb_retl( HB_TRUE );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
/*
|
|
Reindex all tags of the currently selected table
|
|
Returns true if successful, false if fails.
|
|
Error code available by calling AdsGetLastError()
|
|
*/
|
|
HB_FUNC( ADSREINDEX )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
hb_retl( AdsReindex( pArea ? pArea->hTable : ( ADSHANDLE ) -1 ) == AE_SUCCESS );
|
|
}
|
|
|
|
HB_FUNC( ADSVERSION )
|
|
{
|
|
UNSIGNED32 ulMajor;
|
|
UNSIGNED32 ulMinor;
|
|
UNSIGNED8 ucLetter;
|
|
UNSIGNED8 ucDesc[ 128 ];
|
|
UNSIGNED16 usDescLen = sizeof( ucDesc ) - 1;
|
|
char ucVersion[ 256 ];
|
|
int iPos;
|
|
|
|
AdsGetVersion( &ulMajor,
|
|
&ulMinor,
|
|
&ucLetter,
|
|
ucDesc,
|
|
&usDescLen );
|
|
|
|
switch( hb_parni( 1 ) /* iVersionType */ )
|
|
{
|
|
case 0:
|
|
hb_snprintf( ucVersion, sizeof( ucVersion ), "%lu.%lu%c",
|
|
( HB_ULONG ) ulMajor, ( HB_ULONG ) ulMinor, ucLetter );
|
|
break;
|
|
case 3:
|
|
hb_snprintf( ucVersion, sizeof( ucVersion ), "%s, v%lu.%lu%c",
|
|
( char * ) ucDesc, ( HB_ULONG ) ulMajor, ( HB_ULONG ) ulMinor, ucLetter );
|
|
break;
|
|
default:
|
|
ucVersion[ 0 ] = '\0';
|
|
}
|
|
|
|
iPos = ( int ) strlen( ucVersion ) - 1;
|
|
while( iPos >= 0 && ucVersion[ iPos ] == ' ' ) /* remove trailing spaces */
|
|
ucVersion[ iPos-- ] = '\0';
|
|
|
|
hb_retc( ucVersion );
|
|
}
|
|
|
|
HB_FUNC( ADSCACHEOPENTABLES )
|
|
{
|
|
hb_retnl( AdsCacheOpenTables( ( UNSIGNED16 ) hb_parni( 1 ) /* usOpen */ ) );
|
|
}
|
|
|
|
HB_FUNC( ADSCACHEOPENCURSORS )
|
|
{
|
|
hb_retnl( AdsCacheOpenCursors( ( UNSIGNED16 ) hb_parni( 1 ) /* usOpen */ ) );
|
|
}
|
|
|
|
/* Use AdsIsEmpty() to determine if the indicated field is NULL for ADTs or empty for DBFs. */
|
|
HB_FUNC( ADSISEMPTY )
|
|
{
|
|
if( HB_ISCHAR( 1 ) || HB_ISNUM( 1 ) )
|
|
{
|
|
UNSIGNED16 pbEmpty = 0;
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea && AdsIsEmpty( pArea->hTable,
|
|
( HB_ISCHAR( 1 ) ? ( UNSIGNED8 * ) hb_parcx( 1 ) : ADSFIELD( hb_parni( 1 ) ) ) /* pucFldName */,
|
|
&pbEmpty ) == AE_SUCCESS )
|
|
hb_retl( pbEmpty != 0 );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
|
|
HB_FUNC( ADSGETNUMACTIVELINKS ) /* Only valid for a DataDict */
|
|
{
|
|
UNSIGNED16 pusNumLinks = 0;
|
|
#if ADS_LIB_VERSION >= 620
|
|
ADSHANDLE hConnect = HB_ADS_PARCONNECTION( 1 );
|
|
|
|
if( hConnect )
|
|
AdsGetNumActiveLinks( hConnect, &pusNumLinks );
|
|
#endif
|
|
hb_retni( pusNumLinks );
|
|
}
|
|
|
|
/* Please add all-version functions above this block */
|
|
|
|
HB_FUNC( ADSDDADDTABLE )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
hb_retl( AdsDDAddTable( HB_ADS_PARCONNECTION( 4 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pTableName */,
|
|
( UNSIGNED8 * ) hb_parcx( 2 ) /* pTableFileName */,
|
|
( UNSIGNED16 ) hb_ads_iFileType,
|
|
( UNSIGNED16 ) hb_ads_iCharType,
|
|
( UNSIGNED8 * ) hb_parcx( 3 ) /* pTableIndexFileName */,
|
|
NULL ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDREMOVETABLE )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
/* TOFIX: Due to bad and very old typo, the connection handle is
|
|
taken from 4th parameter instead of 3rd. [vszakats] */
|
|
hb_retl( AdsDDRemoveTable( HB_ADS_PARCONNECTION( 4 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pTableName */,
|
|
( UNSIGNED16 ) ( HB_ISNUM( 2 ) ? hb_parni( 2 ) : hb_parldef( 2, 0 ) ) /* usDeleteFiles */ ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDADDINDEXFILE )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
hb_retl( AdsDDAddIndexFile( HB_ADS_PARCONNECTION( 4 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pTableName */,
|
|
( UNSIGNED8 * ) hb_parcx( 2 ) /* pIndexName */,
|
|
( UNSIGNED8 * ) hb_parcx( 3 ) /* pucComment */ ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDREMOVEINDEXFILE )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
hb_retl( AdsDDRemoveIndexFile( HB_ADS_PARCONNECTION( 4 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pTableName */,
|
|
( UNSIGNED8 * ) hb_parcx( 2 ) /* pIndexName */,
|
|
( UNSIGNED16 ) ( HB_ISNUM( 3 ) ? hb_parni( 3 ) : hb_parldef( 3, 0 ) ) /* usDeleteFiles */ ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDADDUSERTOGROUP )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
hb_retl( AdsDDAddUserToGroup( HB_ADS_PARCONNECTION( 3 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pGroup */,
|
|
( UNSIGNED8 * ) hb_parcx( 2 ) /* pName */ ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDREMOVEUSERFROMGROUP )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
hb_retl( AdsDDRemoveUserFromGroup( HB_ADS_PARCONNECTION( 3 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pGroup */,
|
|
( UNSIGNED8 * ) hb_parcx( 2 ) /* pName */ ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSCONNECT60 )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
ADSHANDLE hConnect = 0;
|
|
|
|
if( AdsConnect60( ( UNSIGNED8 * ) hb_parcx( 1 ) /* pucServerPath */,
|
|
( UNSIGNED16 ) hb_parni( 2 ) /* usServerTypes */,
|
|
( UNSIGNED8 * ) hb_parc( 3 ) /* pucUserName */,
|
|
( UNSIGNED8 * ) hb_parc( 4 ) /* pucPassword */,
|
|
( UNSIGNED32 ) hb_parnldef( 5, ADS_DEFAULT ) /* ulOptions */,
|
|
&hConnect ) == AE_SUCCESS )
|
|
{
|
|
hb_ads_setConnection( hConnect ); /* set new default */
|
|
|
|
hb_stornint( hConnect, 6 );
|
|
|
|
hb_retl( HB_TRUE );
|
|
}
|
|
else
|
|
hb_retl( HB_FALSE );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDCREATE )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
ADSHANDLE hConnect = 0;
|
|
|
|
if( AdsDDCreate( ( UNSIGNED8 * ) hb_parcx( 1 ) /* pucDictionaryPath */,
|
|
( UNSIGNED16 ) hb_parl( 2 ) /* usEncrypt */,
|
|
( UNSIGNED8 * ) hb_parc( 3 ) /* pucDescription */,
|
|
&hConnect ) == AE_SUCCESS )
|
|
{
|
|
hb_ads_setConnection( hConnect );
|
|
hb_retl( HB_TRUE );
|
|
}
|
|
else
|
|
hb_retl( HB_FALSE );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDCREATEUSER )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
hb_retl( AdsDDCreateUser( HB_ADS_PARCONNECTION( 5 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parc( 1 ) /* pucGroupName */,
|
|
( UNSIGNED8 * ) hb_parc( 2 ) /* pucUserName */,
|
|
( UNSIGNED8 * ) hb_parc( 3 ) /* pucPassword */,
|
|
( UNSIGNED8 * ) hb_parc( 4 ) /* pucDescription */ ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDDELETEUSER )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
hb_retl( AdsDDDeleteUser( HB_ADS_PARCONNECTION( 2 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parc( 1 ) /* pucUserName */ ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDGETDATABASEPROPERTY )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
UNSIGNED16 ulProperty = ( UNSIGNED16 ) hb_parni( 1 );
|
|
ADSHANDLE hConnect = HB_ADS_PARCONNECTION( 2 );
|
|
|
|
switch( ulProperty )
|
|
{
|
|
/* String properties */
|
|
case ADS_DD_COMMENT:
|
|
case ADS_DD_DEFAULT_TABLE_PATH:
|
|
case ADS_DD_USER_DEFINED_PROP:
|
|
case ADS_DD_TEMP_TABLE_PATH:
|
|
case ADS_DD_VERSION:
|
|
case ADS_DD_ENCRYPT_TABLE_PASSWORD:
|
|
#if ADS_LIB_VERSION >= 710
|
|
case ADS_DD_FTS_DELIMITERS:
|
|
case ADS_DD_FTS_NOISE:
|
|
case ADS_DD_FTS_DROP_CHARS:
|
|
case ADS_DD_FTS_CONDITIONAL_CHARS:
|
|
case ADS_DD_LOGINS_DISABLED_ERRSTR:
|
|
#endif
|
|
{
|
|
char sBuffer[ ADS_MAX_PARAMDEF_LEN ];
|
|
UNSIGNED16 ulLength = sizeof( sBuffer );
|
|
|
|
if( AdsDDGetDatabaseProperty( hConnect,
|
|
ulProperty,
|
|
( VOID * ) sBuffer,
|
|
&ulLength ) != AE_SUCCESS )
|
|
{
|
|
/* TODO: Better error handling. */
|
|
sBuffer[ 0 ] = '\0';
|
|
ulLength = 0;
|
|
}
|
|
hb_retclen( sBuffer, ulLength );
|
|
break;
|
|
}
|
|
/* Boolean properties */
|
|
case ADS_DD_LOG_IN_REQUIRED:
|
|
case ADS_DD_VERIFY_ACCESS_RIGHTS:
|
|
case ADS_DD_ENCRYPT_NEW_TABLE:
|
|
#if ADS_LIB_VERSION >= 710
|
|
case ADS_DD_ENCRYPTED:
|
|
case ADS_DD_LOGINS_DISABLED:
|
|
#endif
|
|
#if ADS_LIB_VERSION >= 800
|
|
case ADS_DD_ENCRYPT_INDEXES:
|
|
case ADS_DD_ENCRYPT_COMMUNICATION:
|
|
#endif
|
|
{
|
|
UNSIGNED16 ulBuffer;
|
|
UNSIGNED16 ulLength = sizeof( ulBuffer );
|
|
|
|
AdsDDGetDatabaseProperty( hConnect,
|
|
ulProperty,
|
|
( VOID * ) &ulBuffer,
|
|
&ulLength );
|
|
hb_retl( ulBuffer != 0 );
|
|
break;
|
|
}
|
|
/* Integer properties */
|
|
#if ADS_LIB_VERSION >= 620
|
|
case ADS_DD_VERSION_MAJOR:
|
|
case ADS_DD_VERSION_MINOR:
|
|
{
|
|
UNSIGNED16 ulBuffer;
|
|
UNSIGNED16 ulLength = sizeof( ulBuffer );
|
|
|
|
AdsDDGetDatabaseProperty( hConnect,
|
|
ulProperty,
|
|
( VOID * ) &ulBuffer,
|
|
&ulLength );
|
|
hb_retni( ulBuffer );
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
HB_FUNC( ADSDDSETDATABASEPROPERTY )
|
|
{
|
|
UNSIGNED32 ulRetVal;
|
|
UNSIGNED16 ulBuffer;
|
|
UNSIGNED16 ulProperty = ( UNSIGNED16 ) hb_parni( 1 );
|
|
PHB_ITEM pParam = hb_param( 2, HB_IT_ANY );
|
|
ADSHANDLE hConnect = HB_ADS_PARCONNECTION( 3 );
|
|
|
|
switch( ulProperty )
|
|
{
|
|
/* String properties (NULL accepted) */
|
|
case ADS_DD_COMMENT:
|
|
case ADS_DD_DEFAULT_TABLE_PATH:
|
|
case ADS_DD_USER_DEFINED_PROP:
|
|
case ADS_DD_TEMP_TABLE_PATH:
|
|
case ADS_DD_ADMIN_PASSWORD:
|
|
case ADS_DD_ENCRYPT_TABLE_PASSWORD:
|
|
{
|
|
ulRetVal = AdsDDSetDatabaseProperty( hConnect,
|
|
ulProperty,
|
|
HB_IS_STRING( pParam ) ? ( VOID * ) hb_itemGetCPtr( pParam ) : NULL,
|
|
( UNSIGNED16 ) hb_itemGetCLen( pParam ) + 1 );
|
|
break;
|
|
}
|
|
/* String properties (NULL not accepted) */
|
|
#if ADS_LIB_VERSION >= 710
|
|
case ADS_DD_FTS_DELIMITERS:
|
|
case ADS_DD_FTS_NOISE:
|
|
case ADS_DD_FTS_DROP_CHARS:
|
|
case ADS_DD_FTS_CONDITIONAL_CHARS:
|
|
case ADS_DD_LOGINS_DISABLED_ERRSTR:
|
|
{
|
|
ulRetVal = AdsDDSetDatabaseProperty( hConnect,
|
|
ulProperty,
|
|
( VOID * ) hb_itemGetCPtr( pParam ),
|
|
( UNSIGNED16 ) hb_itemGetCLen( pParam ) + 1 );
|
|
break;
|
|
}
|
|
#endif
|
|
/* Boolean properties */
|
|
case ADS_DD_LOG_IN_REQUIRED:
|
|
case ADS_DD_VERIFY_ACCESS_RIGHTS:
|
|
case ADS_DD_ENCRYPT_NEW_TABLE:
|
|
case ADS_DD_ENABLE_INTERNET:
|
|
#if ADS_LIB_VERSION >= 710
|
|
case ADS_DD_LOGINS_DISABLED:
|
|
#endif
|
|
#if ADS_LIB_VERSION >= 800
|
|
case ADS_DD_DISABLE_DLL_CACHING:
|
|
case ADS_DD_ENCRYPT_INDEXES:
|
|
case ADS_DD_ENCRYPT_COMMUNICATION:
|
|
#endif
|
|
{
|
|
ulBuffer = ( UNSIGNED16 ) hb_itemGetL( pParam );
|
|
ulRetVal = AdsDDSetDatabaseProperty( hConnect,
|
|
ulProperty,
|
|
( VOID * ) &ulBuffer,
|
|
sizeof( ulBuffer ) );
|
|
break;
|
|
}
|
|
/* Integer properties */
|
|
case ADS_DD_MAX_FAILED_ATTEMPTS:
|
|
case ADS_DD_INTERNET_SECURITY_LEVEL:
|
|
#if ADS_LIB_VERSION >= 620
|
|
case ADS_DD_VERSION_MAJOR:
|
|
case ADS_DD_VERSION_MINOR:
|
|
#endif
|
|
{
|
|
if( HB_IS_NUMERIC( pParam ) )
|
|
{
|
|
ulBuffer = ( UNSIGNED16 ) hb_itemGetNI( pParam );
|
|
ulRetVal = AdsDDSetDatabaseProperty( hConnect,
|
|
ulProperty,
|
|
( VOID * ) &ulBuffer,
|
|
sizeof( ulBuffer ) );
|
|
}
|
|
else
|
|
{
|
|
ulRetVal = AdsDDSetDatabaseProperty( hConnect,
|
|
ulProperty,
|
|
NULL,
|
|
0 );
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
ulRetVal = ( UNSIGNED32 ) ~AE_SUCCESS;
|
|
break;
|
|
}
|
|
}
|
|
|
|
hb_retl( ulRetVal == AE_SUCCESS );
|
|
}
|
|
|
|
HB_FUNC( ADSDDGETUSERPROPERTY )
|
|
{
|
|
if( HB_ISBYREF( 3 ) /* fPropertyByRef */ )
|
|
{
|
|
UNSIGNED8 pvProperty[ ADS_MAX_PARAMDEF_LEN ] = { 0 };
|
|
UNSIGNED16 usPropertyLen = sizeof( pvProperty );
|
|
|
|
UNSIGNED32 ulRetVal = AdsDDGetUserProperty( HB_ADS_PARCONNECTION( 4 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pucUserName */,
|
|
( UNSIGNED16 ) hb_parni( 2 ) /* usPropertyID */,
|
|
pvProperty,
|
|
&usPropertyLen );
|
|
|
|
hb_storc( ulRetVal == AE_SUCCESS ? ( char * ) pvProperty : NULL, 3 );
|
|
|
|
hb_retl( ulRetVal == AE_SUCCESS );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
/*
|
|
Verify if a username/password combination is valid for this database
|
|
Call : ADSTESTLOGIN( cServerPath, nServerTypes, cUserName, cPassword, options,
|
|
[ nUserProperty, @cBuffer ] )
|
|
Returns : True if login succeeds
|
|
|
|
Notes: This creates a temporary connection only during the execution of this
|
|
function, without disturbing the stored one for any existing connection
|
|
|
|
If the optional last 3 parameters are supplied, then it queries the
|
|
requested user property and returns it in the buffer. This is useful
|
|
fo example to get the groups of which the user is a member
|
|
*/
|
|
HB_FUNC( ADSTESTLOGIN )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
UNSIGNED8 * pucUserName = ( UNSIGNED8 * ) hb_parc( 3 );
|
|
ADSHANDLE adsTestHandle = 0;
|
|
|
|
if( AdsConnect60( ( UNSIGNED8 * ) hb_parcx( 1 ) /* pucServerPath */,
|
|
( UNSIGNED16 ) hb_parni( 2 ) /* usServerTypes */,
|
|
pucUserName,
|
|
( UNSIGNED8 * ) hb_parc( 4 ) /* pucPassword */,
|
|
( UNSIGNED32 ) hb_parnldef( 5, ADS_DEFAULT ) /* ulOptions */,
|
|
&adsTestHandle ) == AE_SUCCESS )
|
|
{
|
|
if( HB_ISBYREF( 7 ) )
|
|
{
|
|
UNSIGNED8 pvProperty[ ADS_MAX_PARAMDEF_LEN ] = { 0 };
|
|
UNSIGNED16 usPropertyLen = sizeof( pvProperty );
|
|
|
|
hb_storc( AdsDDGetUserProperty( adsTestHandle,
|
|
pucUserName,
|
|
( UNSIGNED16 ) hb_parni( 6 ) /* usPropertyID */,
|
|
pvProperty,
|
|
&usPropertyLen ) == AE_SUCCESS ? ( char * ) pvProperty : NULL, 7 );
|
|
}
|
|
|
|
AdsDisconnect( adsTestHandle );
|
|
|
|
hb_retl( HB_TRUE );
|
|
}
|
|
else
|
|
hb_retl( HB_FALSE );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSRESTRUCTURETABLE )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
hb_retl( AdsRestructureTable( HB_ADS_PARCONNECTION( 5 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pTableName */,
|
|
NULL /* pucAlias */,
|
|
( UNSIGNED16 ) hb_ads_iFileType,
|
|
( UNSIGNED16 ) hb_ads_iCharType,
|
|
( UNSIGNED16 ) hb_ads_iLockType,
|
|
( UNSIGNED16 ) hb_ads_iCheckRights,
|
|
( UNSIGNED8 * ) hb_parcx( 2 ) /* pucAddFields */,
|
|
( UNSIGNED8 * ) hb_parcx( 3 ) /* pucDeleteFields */,
|
|
( UNSIGNED8 * ) hb_parcx( 4 ) /* pucChangeFields */ ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSCOPYTABLECONTENTS )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer(); /* Source */
|
|
|
|
if( pArea )
|
|
{
|
|
int iOldArea = hb_rddGetCurrentWorkAreaNumber();
|
|
|
|
if( hb_rddSelectWorkAreaAlias( hb_parcx( 1 ) /* szAliasDest */ ) == HB_SUCCESS )
|
|
{
|
|
ADSAREAP pDest = hb_adsGetWorkAreaPointer();
|
|
|
|
hb_rddSelectWorkAreaNumber( iOldArea );
|
|
|
|
if( pDest )
|
|
hb_retl( AdsCopyTableContents( pArea->hTable,
|
|
pDest->hTable,
|
|
ADS_IGNOREFILTERS ) == AE_SUCCESS );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDIRECTORY )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
UNSIGNED32 ulRetVal;
|
|
UNSIGNED8 ucFileName[ ADS_MAX_TABLE_NAME ];
|
|
UNSIGNED16 usFileNameLen = sizeof( ucFileName );
|
|
#if ADS_LIB_VERSION >= 900
|
|
ADSHANDLE sHandle = 0;
|
|
#else
|
|
SIGNED32 sHandle = 0;
|
|
#endif
|
|
PHB_ITEM pitmDir;
|
|
ADSHANDLE hConnect = HB_ADS_PARCONNECTION( 2 );
|
|
|
|
pitmDir = hb_itemArrayNew( 0 );
|
|
|
|
ulRetVal = AdsFindFirstTable( hConnect,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ),
|
|
( UNSIGNED8 * ) ucFileName,
|
|
&usFileNameLen,
|
|
&sHandle );
|
|
|
|
if( ulRetVal == AE_SUCCESS ||
|
|
ulRetVal == AE_NO_FILE_FOUND )
|
|
{
|
|
while( ulRetVal == AE_SUCCESS )
|
|
{
|
|
PHB_ITEM pitmFileName = hb_itemPutCL( NULL, ( char * ) ucFileName, usFileNameLen );
|
|
hb_arrayAddForward( pitmDir, pitmFileName );
|
|
|
|
usFileNameLen = sizeof( ucFileName );
|
|
|
|
ulRetVal = AdsFindNextTable( hConnect,
|
|
sHandle,
|
|
ucFileName,
|
|
&usFileNameLen );
|
|
}
|
|
|
|
AdsFindClose( hConnect, sHandle );
|
|
}
|
|
|
|
hb_itemReturnRelease( pitmDir );
|
|
#else
|
|
hb_reta( 0 );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSCHECKEXISTENCE )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
UNSIGNED16 usExist = 0;
|
|
|
|
hb_retl( AdsCheckExistence( HB_ADS_PARCONNECTION( 2 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pucFilename */,
|
|
&usExist ) == AE_SUCCESS && usExist != 0 );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDELETEFILE )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
hb_retl( AdsDeleteFile( HB_ADS_PARCONNECTION( 2 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 1 ) /* pucFilename */ ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSSTMTSETTABLEPASSWORD )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
const char * pucTableName = hb_parcx( 1 );
|
|
const char * pucPassword = hb_parcx( 2 );
|
|
|
|
if( *pucTableName && *pucPassword )
|
|
{
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea && pArea->hStatement )
|
|
hb_retnl( AdsStmtSetTablePassword( pArea->hStatement,
|
|
( UNSIGNED8 * ) pucTableName,
|
|
( UNSIGNED8 * ) pucPassword ) );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
}
|
|
else
|
|
hb_errRT_DBCMD( EG_ARG, 1014, NULL, HB_ERR_FUNCNAME );
|
|
#else
|
|
hb_retnl( 0 );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSGETSERVERNAME )
|
|
{
|
|
#if ADS_LIB_VERSION >= 600
|
|
UNSIGNED8 buf[ 256 ];
|
|
UNSIGNED16 usLen = sizeof( buf );
|
|
|
|
if( AdsGetServerName( HB_ADS_PARCONNECTION( 1 ) /* hConnect */,
|
|
buf,
|
|
&usLen ) == AE_SUCCESS )
|
|
hb_retclen( ( char * ) buf, usLen );
|
|
#endif
|
|
/* QUESTION: Design decision or mistake to return NIL on error? [vszakats] */
|
|
}
|
|
|
|
HB_FUNC( ADSCLOSECACHEDTABLES )
|
|
{
|
|
#if ADS_LIB_VERSION >= 700
|
|
ADSHANDLE hConnect = HB_ADS_PARCONNECTION( 1 );
|
|
|
|
if( hConnect )
|
|
{
|
|
AdsCloseCachedTables( hConnect );
|
|
hb_retl( HB_TRUE );
|
|
}
|
|
else
|
|
hb_retl( HB_FALSE );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSCREATEFTSINDEX )
|
|
{
|
|
#if ADS_LIB_VERSION >= 700
|
|
ADSAREAP pArea = hb_adsGetWorkAreaPointer();
|
|
|
|
if( pArea )
|
|
hb_retnl( AdsCreateFTSIndex( pArea->hTable,
|
|
( UNSIGNED8 * ) hb_parc( 1 ) /* pucFileName */ , /* if NULL or the base name is the same as the table, then creates a compound AutoOpen index. */
|
|
( UNSIGNED8 * ) hb_parc( 2 ) /* pucTag */ ,
|
|
( UNSIGNED8 * ) hb_parc( 3 ) /* pucField */ ,
|
|
( UNSIGNED32 ) hb_parnldef( 4, ADS_DEFAULT ) /* ulPageSize */ ,
|
|
( UNSIGNED32 ) hb_parnldef( 5, 3 ) /* ulMinWordLen */ ,
|
|
( UNSIGNED32 ) hb_parnldef( 6, 30 ) /* ulMaxWordLen */ ,
|
|
( UNSIGNED16 ) hb_parldef( 7, 1 ) /* usUseDefaultDelim */ ,
|
|
( UNSIGNED8 * ) hb_parc( 8 ) /* pucDelimiters */ ,
|
|
( UNSIGNED16 ) hb_parldef( 9, 1 ) /* usUseDefaultNoise */ ,
|
|
( UNSIGNED8 * ) hb_parc( 10 ) /* pucNoiseWords */ ,
|
|
( UNSIGNED16 ) hb_parldef( 11, 1 ) /* usUseDefaultDrop */ ,
|
|
( UNSIGNED8 * ) hb_parc( 12 ) /* pucDropChars */ ,
|
|
( UNSIGNED16 ) hb_parldef( 13, 1 ) /* usUseDefaultConditionals */ ,
|
|
( UNSIGNED8 * ) hb_parc( 14 ) /* pucConditionalChars */ ,
|
|
( UNSIGNED8 * ) hb_parc( 15 ) /* pucReserved1 */ ,
|
|
( UNSIGNED8 * ) hb_parc( 16 ) /* pucReserved2 */ ,
|
|
( UNSIGNED32 ) hb_parnldef( 17, ADS_DEFAULT ) /* ulOptions */ ) );
|
|
else
|
|
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, HB_ERR_FUNCNAME );
|
|
#else
|
|
hb_retnl( 0 );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSCREATESAVEPOINT )
|
|
{
|
|
#if ADS_LIB_VERSION >= 800
|
|
hb_retnl( AdsCreateSavepoint( HB_ADS_PARCONNECTION( 1 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parc( 2 ) /* pucSavepoint */,
|
|
( UNSIGNED32 ) hb_parnldef( 3, ADS_DEFAULT ) /* ulOptions */ ) );
|
|
#else
|
|
hb_retnl( 0 );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSROLLBACKSAVEPOINT )
|
|
{
|
|
#if ADS_LIB_VERSION >= 800
|
|
hb_retnl( AdsRollbackTransaction80( HB_ADS_PARCONNECTION( 1 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parc( 2 ) /* pucSavepoint */,
|
|
( UNSIGNED32 ) hb_parnldef( 3, ADS_DEFAULT ) /* ulOptions */ ) );
|
|
#else
|
|
hb_retnl( 0 );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDCREATELINK )
|
|
{
|
|
#if ADS_LIB_VERSION >= 900
|
|
hb_retl( AdsDDCreateLink( HB_ADS_PARCONNECTION( 1 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 2 ) /* pucLinkAlias */,
|
|
( UNSIGNED8 * ) hb_parcx( 3 ) /* pucServerPath */,
|
|
( UNSIGNED8 * ) hb_parc( 4 ) /* pucUserName */,
|
|
( UNSIGNED8 * ) hb_parc( 5 ) /* pucPassword */,
|
|
( UNSIGNED32 ) hb_parnldef( 6, ADS_DEFAULT ) /* ulOptions */ ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDMODIFYLINK )
|
|
{
|
|
#if ADS_LIB_VERSION >= 900
|
|
hb_retl( AdsDDModifyLink( HB_ADS_PARCONNECTION( 1 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 2 ) /* pucLinkAlias */,
|
|
( UNSIGNED8 * ) hb_parcx( 3 ) /* pucServerPath */,
|
|
( UNSIGNED8 * ) hb_parc( 4 ) /* pucUserName */,
|
|
( UNSIGNED8 * ) hb_parc( 5 ) /* pucPassword */,
|
|
( UNSIGNED32 ) hb_parnldef( 6, ADS_DEFAULT ) /* ulOptions */ ) == AE_SUCCESS );
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|
|
|
|
HB_FUNC( ADSDDDROPLINK )
|
|
{
|
|
#if ADS_LIB_VERSION >= 900
|
|
hb_retl( AdsDDDropLink( HB_ADS_PARCONNECTION( 1 ) /* hConnect */,
|
|
( UNSIGNED8 * ) hb_parcx( 2 ) /* pucLinkAlias */,
|
|
( UNSIGNED16 ) hb_parl( 3 ) /* usDropGlobal */ ) == AE_SUCCESS ); /* NOTE: Defaults to 0/HB_FALSE for non logical parameters. */
|
|
#else
|
|
hb_retl( HB_FALSE );
|
|
#endif
|
|
}
|