/* * Xailer source code: * * AdsDataSource.prg * Clase TAdsDataSource() * * Copyright 2003, 2007 Ignacio Ortiz de Zúñiga * Copyright 2003, 2007 Xailer.com * All rights reserved * */ #include "Xailer.ch" #include "ads.ch" REQUEST AdsGetRelKeyPos, AdsSetRelKeyPos, AdsKeyCount, AdsKeyNo, AdsIsExprValid //-------------------------------------------------------------------------- CLASS XAdsDataSource FROM TDbfDataSource PUBLISHED: PROPERTY cUser INIT "" WRITE METHOD SetUser PROPERTY cPassword INIT "" WRITE METHOD SetPassword PROPERTY nFileType INIT afCDX WRITE METHOD SetFileType VALUES afNTX, afCDX, afADT, afVFP PROPERTY nServerType INIT asDEFAULT WRITE METHOD SetServerType VALUES asDEFAULT, asLOCAL, asREMOTE, asAIS, asREMOTE_AIS, asANY PROPERTY nCharType INIT acANSI WRITE METHOD SetCharType VALUES acANSI, acOEM PROPERTY nConnectionFlags INIT 0 PROPERTY lAdsLocking INIT .T. WRITE METHOD SetAdsLocking PROPERTY lRightsCheck INIT .T. WRITE METHOD SetRightsCheck PROPERTY lUseDictionary INIT .F. PROPERTY lConnected INIT .F. WRITE INLINE IIf( Value, ::Connect(), ::DisConnect() ) PROPERTY lConnected // para forzar que este al final en los xfm EVENT OnConnect( oSender ) // --> Nil EVENT OnConnected( oSender ) // --> Nil EVENT OnDisconnect( oSender ) // --> Nil EVENT OnDisconnected( oSender ) // --> Nil PUBLIC: PROPERTY cDriver INIT "ADS" READONLY PROPERTY hConnect INIT 0 READONLY PROTECTED: PROPERTY nLockScheme PROPERTY nMemoType PROPERTY nMemoSize PUBLIC: METHOD Create( oParent, cConnect ) CONSTRUCTOR METHOD Connect() // --> lSuccess METHOD Disconnect() // --> Nil METHOD CommitAll() INLINE AdsWriteAllRecords() // --> Nil METHOD BeginTrans() INLINE AdsBeginTransaction() // --> Nil METHOD CommitTrans() INLINE AdsCommitTransaction() // --> Nil METHOD RollBackTrans() INLINE AdsRollback() // --> Nil METHOD DefDataExtension() INLINE { "dbf", "dbf", "adt" }[ ::nFileType ] // --> cExtension METHOD DefIdxExtension() INLINE { "ntx", "cdx", "adi" }[ ::nFileType ] // --> cExtension METHOD DefMemoExtension() INLINE { "dbt", "fpt", "adm" }[ ::nFileType ] // --> cExtension METHOD QueryArray( cCommand, aHeaders ) // --> aData METHOD QueryRow( cCommand, aHeaders ) // --> aData METHOD QueryValue( cCommand ) // --> uValue METHOD CreateTable( aStructure, cTable ) // --> oDataSet RESERVED: METHOD SetFileType( cType ) METHOD SetServerType( nType ) METHOD SetCharType( nType ) METHOD SetRightsCheck( lType ) METHOD OnOpen( oDataSet ) METHOD OnOpened( oDataSet ) METHOD SetUser( Value ) METHOD SetPassword( Value ) METHOD SetAdsLocking( Value ) METHOD ResetTypes() INLINE ( ::SetFileType( ::FnFileType ),; ::SetServerType( ::FnServerType ),; ::SetCharType( ::FnCharType ),; ::SetRightsCheck( ::FlRightsCheck ),; AdsLocking( ::FlAdsLocking ) ) ENDCLASS //-------------------------------------------------------------------------- METHOD Create( oParent, cConnect ) CLASS XAdsDataSource ::SetFileType( ::FnFileType ) ::SetServerType( ::FnServerType ) ::SetCharType( ::FnCharType ) ::SetRightsCheck( ::FlRightsCheck ) AdsLocking( ::FlAdsLocking ) ::Super:Create( oParent, cConnect ) RETURN Self //-------------------------------------------------------------------------- METHOD Connect() CLASS XAdsDataSource LOCAL cUser, cPassword LOCAL hConnect LOCAL nConType ::OnConnect() IF ! Empty( ::cUser ) cUser := ::cUser IF ! Empty( ::cPassword ) cPassword := ::cPassword ENDIF ENDIF ::FlConnected := AdsConnect60( ::cConnect, ::nServerType, cUser, cPassword, ::nConnectionFlags, @hConnect ) IF ! Empty( hConnect ) ::hConnect := hConnect nConType := AdsGetHandleType( hConnect ) ::lUseDictionary := ( nConType == ADS_DATABASE_CONNECTION .OR. nConType == ADS_SYS_ADMIN_CONNECTION ) ELSEIF Empty( ::cUser ) ::FlConnected := .T. ::hConnect := 0 ::lUseDictionary := .F. ENDIF ::OnConnected() RETURN ::FlConnected //-------------------------------------------------------------------------- METHOD DisConnect() CLASS XAdsDataSource ::OnDisconnect() ::FlConnected := .F. ::hConnect := 0 // IF ! Empty( ::cUser ) AdsDisconnect() // ENDIF ::OnDisconnected() RETURN Nil //-------------------------------------------------------------------------- METHOD SetFileType( nType ) CLASS XAdsDataSource AdsSetFileType( nType ) ::FnFileType := nType RETURN Nil //-------------------------------------------------------------------------- METHOD SetServerType( nType ) CLASS XAdsDataSource IF nType != asDEFAULT AdsSetServerType( nType ) ENDIF ::FnServerType := nType RETURN Nil //-------------------------------------------------------------------------- METHOD SetAdsLocking( Value ) CLASS XAdsDataSource ::FlAdsLocking := Value AdsLocking( ::FlAdsLocking ) RETURN Value //-------------------------------------------------------------------------- METHOD SetCharType( nType ) CLASS XAdsDataSource DEFAULT nType TO ::FnCharType AdsSetCharType( nType ) ::FnCharType := nType RETURN Nil //-------------------------------------------------------------------------- METHOD SetRightsCheck( lType ) CLASS XAdsDataSource AdsRightsCheck( lType ) ::FlRightsCheck := lType RETURN Nil //-------------------------------------------------------------------------- METHOD OnOpen( oDataSet ) CLASS XAdsDataSource ::SetCharType() RETURN Nil //-------------------------------------------------------------------------- METHOD OnOpened( oDataSet ) CLASS XAdsDataSource IF ! ::lUseDictionary .AND. ! Empty( ::cPassword ) AdsEnableEncryption( ::cPassword ) ENDIF RETURN Nil //-------------------------------------------------------------------------- METHOD SetUser( Value ) CLASS XAdsDataSource ::FcUser := Value IF ::lConnected ::Disconnect() ::Connect() ENDIF RETURN Nil //-------------------------------------------------------------------------- METHOD SetPassword( Value ) CLASS XAdsDataSource ::FcPassword := Value IF ::lConnected ::Disconnect() ::Connect() ENDIF RETURN Nil //-------------------------------------------------------------------------- METHOD QueryArray( cCommand, aHeaders ) CLASS XAdsDataSource LOCAL aData LOCAL cAlias LOCAL nRecno, nField, nFields cAlias := Select() IF AdsCreateSqlStatement( "ADSSQL", ::nFileType ) .AND. AdsExecuteSqlDirect( cCommand ) DbSelectArea( "ADSSQL" ) nRecno := 1 nFields := FCount() IF Pcount() > 1 aHeaders := Array( nFields ) FOR nField := 1 TO nFields aHeaders[ nField ] := FieldName( nField ) NEXT ENDIF aData := Array( RecCount(), nFields ) DO WHILE ! Eof() FOR nField := 1 TO nFields aData[ nRecno, nField ] := FieldGet( nField ) NEXT nRecno ++ DbSkip() ENDDO DbCloseArea() IF ! Empty( cAlias ) DbSelectArea( cAlias ) ENDIF ENDIF RETURN aData //-------------------------------------------------------------------------- METHOD QueryRow( cCommand, aHeaders ) CLASS XAdsDataSource LOCAL aData LOCAL cAlias LOCAL nField, nFields cAlias := Select() IF AdsCreateSqlStatement( "ADSSQL", ::nFileType ) .AND. AdsExecuteSqlDirect( cCommand ) DbSelectArea( "ADSSQL" ) nFields := FCount() IF Pcount() > 1 aHeaders := Array( nFields ) FOR nField := 1 TO nFields aHeaders[ nField ] := FieldName( nField ) NEXT ENDIF aData := Array( nFields ) FOR nField := 1 TO nFields aData[ nField ] := FieldGet( nField ) NEXT DbCloseArea() IF ! Empty( cAlias ) DbSelectArea( cAlias ) ENDIF ENDIF RETURN aData //-------------------------------------------------------------------------- METHOD QueryValue( cCommand ) CLASS XAdsDataSource LOCAL Value LOCAL cAlias cAlias := Select() IF AdsCreateSqlStatement( "ADSSQL", ::nFileType ) .AND. AdsExecuteSqlDirect( cCommand ) DbSelectArea( "ADSSQL" ) Value := FieldGet( 1 ) DbCloseArea() IF ! Empty( cAlias ) DbSelectArea( cAlias ) ENDIF ENDIF RETURN Value //-------------------------------------------------------------------------- METHOD CreateTable( aStructure, cFile ) CLASS XAdsDataSource LOCAL oDataSet // LOCAL cDriver // // DO CASE // CASE ::nFileType == afCDX // cDriver := "ADSCDX" // CASE ::nFileType == afNTX // cDriver := "ADSNTX" // CASE ::nFileType == afADT // cDriver := "ADSADT" // END CASE DEFAULT cFile TO GetTempFileName() ::ResetTypes() DbCreate( cFile, aStructure ) IF File( cFile ) oDataSet := ::NewDataSet( cFile ) ENDIF RETURN oDataSet