/*
 * Xailer source code:
 *
 * DbfDataSource.prg
 * Clase TDbfDataSource()
 *
 * Copyright 2003, 2007 Ignacio Ortiz de Zúñiga
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"
#include "dbinfo.ch"


//--------------------------------------------------------------------------

CLASS XDbfDataSource FROM TDataSource

PUBLISHED:
   PROPERTY cDriver     INIT RddSetDefault()
   PROPERTY cConnect    INIT "." EDITOR PE_DbfDataSource
   PROPERTY cPassword   INIT ""
   PROPERTY nTimeOut    INIT 5
   PROPERTY lOptimize   INIT .T. WRITE SetOptimize
   PROPERTY nLockScheme INIT dlDEFAULT VALUES dlDEFAULT, dlCLIP, dlCL53, dlVFP, dlCL53EXT, dlXHB64 ;
                        WRITE SetLockScheme
   PROPERTY nMemoType   INIT dmDBT VALUES dmDBT, dmSMT, dmFPT_FP, dmFPT_SIX, dmFPT_FLEX ;
                        WRITE SetMemoType
   PROPERTY nMemoSize   INIT 512 WRITE SetMemoSize

PUBLIC:
   PROPERTY lConnected  INIT .T.

PUBLIC:
   METHOD New( oParent ) CONSTRUCTOR

   EVENT OnConnect( oSender ) // --> Nil
   EVENT OnDisconnect( oSender ) // --> Nil
   EVENT OnConnected( oSender ) // --> Nil
   EVENT OnDisconnected( oSender ) // --> Nil

   METHOD NewDataSet( cName, cProcess ) // --> oDbfDataSet
   METHOD CommitAll() INLINE DbCommitAll() // --> Nil

   METHOD DefDataExtension() INLINE "Dbf" // --> cExtension
   METHOD DefIdxExtension()  INLINE "Ntx" // --> cExtension
   METHOD DefMemoExtension() INLINE "Dbt" // --> cExtension

   METHOD GetRecords() VIRTUAL
   METHOD CreateTable( aStructure, cTable ) // --> oDataSet
   METHOD DelTable( cTable ) INLINE FErase( cTable ) // --> nResult
   METHOD GetDataSet( cName, cProcess ) // --> oDataSet | Nil

RESERVED:
   METHOD SetOptimize( Value )
   METHOD SetLockScheme( Value )
   METHOD SetMemoType( Value )
   METHOD SetMemoSize( Value )
   METHOD OnOpen( oDataSet )
   METHOD OnOpened( oDataSet )

ENDCLASS

//--------------------------------------------------------------------------

METHOD New( oParent ) CLASS XDbfDataSource

   ::FlOptimize   := rddInfo( RDDI_OPTIMIZE,, ::cDriver )
   ::FnLockScheme := rddInfo( RDDI_LOCKSCHEME,, ::cDriver )
   ::FnMemoType   := rddInfo( RDDI_MEMOTYPE,, ::cDriver )
   IF ::FnMemoType == DB_MEMO_FPT
      ::FnMemoType += Round( rddInfo( RDDI_MEMOVERSION,, ::cDriver ) / 10, 1 )
   ENDIF
   ::FnMemoSize := rddInfo( RDDI_MEMOBLOCKSIZE,, ::cDriver )

RETURN ::Super:New( oParent )

//--------------------------------------------------------------------------

METHOD NewDataSet( cName, cProcess ) CLASS XDbfDataSource

   LOCAL oDataSet

   IF Empty( cName )
      RETURN Nil
   ENDIF

   UPDATE ::cProcess TO cProcess

   oDataSet := TDbfDataSet():Create( ::oParent, Self, cName, Upper( ::cProcess ) )

RETURN oDataSet

//--------------------------------------------------------------------------

METHOD CreateTable( aStructure, cFile ) CLASS XDbfDataSource

   LOCAL oDataSet

   DEFAULT cFile TO GetTempFileName()

   DbCreate( cFile, aStructure, ::cDriver )

   IF File( cFile )
      oDataSet := ::NewDataSet( cFile )
   ENDIF

RETURN oDataSet

//--------------------------------------------------------------------------

METHOD SetOptimize( Value ) CLASS XDbfDataSource

   DEFAULT Value TO ::FlOptimize

   IF Value != ::FlOptimize
      rddInfo( RDDI_OPTIMIZE, Value, ::cDriver )
      ::FlOptimize := Value
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD SetLockScheme( Value ) CLASS XDbfDataSource

   DEFAULT Value TO ::FnLockScheme

   IF Value != ::FnLockScheme
      rddInfo( RDDI_LOCKSCHEME, Value, ::cDriver )
      ::FnLockScheme := Value
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD SetMemoType( Value ) CLASS XDbfDataSource

   LOCAL nVersion

   DEFAULT Value TO ::FnMemoType

   IF Value != ::FnMemoType
      rddInfo( RDDI_MEMOTYPE, Int( Value ), ::cDriver )
      nVersion := Value - Int( Value ) * 10
      IF nVersion > 0
         rddInfo( RDDI_MEMOVERSION, nVersion, ::cDriver )
      ENDIF
      ::FnMemoType := Value
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD SetMemoSize( Value ) CLASS XDbfDataSource

   DEFAULT Value TO ::FnMemoSize

   IF Value != ::FnMemoSize
      rddInfo( RDDI_MEMOBLOCKSIZE, Value, ::cDriver )
      ::FnMemoSize := Value
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD OnOpen( oDataSet ) CLASS XDbfDataSource

   ::SetOptimize()
   ::SetLockScheme()
   ::SetMemoType()
   ::SetMemoSize()

RETURN ::Super:OnOpen( oDataSet )

//--------------------------------------------------------------------------

METHOD OnOpened( oDataSet ) CLASS XDbfDataSource

   IF ! Empty( oDataSet:cPassword )
      oDataSet:SetPassword()
   ELSEIF !Empty( ::cPassword )
      oDataSet:SetPassword( ::cPassword )
   ENDIF

RETURN ::Super:OnOpened( oDataSet )

//--------------------------------------------------------------------------

METHOD GetDataSet( cName, cProcess ) CLASS XDbfDataSource

   LOCAL nFor

   IF cProcess != Nil
      cProcess := Upper( cProcess )
   ENDIF

   cName := Upper( cName )

   FOR nFor := 1 TO Len( ::aDataSet )
      WITH OBJECT ::aDataSet[ nFor ]
         IF ( cProcess = Nil .OR. :cProcess == cProcess ) .AND. ( cName $ Upper( :cName ) .OR. cName == Upper( :cAlias ) )
            RETURN ::aDataSet[ nFor ]
         ENDIF
      END OBJECT
   NEXT

RETURN Nil

//--------------------------------------------------------------------------

