The base object for a data environment. What's cool about this... create other data environments based on the database and use those to connect to the other data sources.
An Oracle example follows below.
#INCLUDE "f:\devel\src\include\dal.h"
DEFINE CLASS debase AS dataenvironment
AutoOpenTables = .F.
AutoCloseTables = .F.
DataSource = .NULL.
osession = ""
cdataenvironment = ""
Name = "debase"
PROCEDURE encrypt
LPARAMETER tcIn, tlDecrypt
LOCAL lcKey, lnLoop, lcOut, lnPosition, lcChar, lnAdjustment, lnAscii, lnAsciiNew
IF PCOUNT() < 1 OR EMPTY(tcIn)
RETURN ""
ENDIF
lcKey = "Any Letter character combination: about 10 characters"
lcOut = ""
FOR lnLoop = 1 TO LEN(TRIM(tcIn))
lnPosition = MOD(lnLoop-1, LEN(lcKey)) + 1
lnAscii = ASC(SUBSTR(tcIn, lnLoop, 1)) - 32 - 1
lnAdjustment = (ASC(SUBSTR(lcKey, lnPosition, 1)) + lnLoop) * IIF(tlDecrypt,-1,1)
lnAsciiNew = lnAscii + lnAdjustment
lcChar = CHR(MOD(lnAsciiNew, 94) + 32 + 1)
lcOut = lcOut + lcChar
ENDFOR
RETURN lcOut
ENDPROC
PROCEDURE Destroy
IF VARTYPE(THIS.oSession) = 'O'
THIS.oSession.Destroy()
ENDIF
THIS.oSession = null
DODEFAULT()
ENDPROC
PROCEDURE BeforeOpenTables
SET DATASESSION TO THIS.oSession.DataSessionID
DODEFAULT()
ENDPROC
PROCEDURE Init
LPARAMETERS tcDataEnvironment AS String, toSession AS Session
SET CLASSLIB TO dal ADDITIVE
DODEFAULT()
IF PCOUNT() >= 2 AND VARTYPE(toSession) = 'O'
THIS.oSession = toSession
ELSE
THIS.oSession = NEWOBJECT("Session")
ENDIF
THIS.cDataEnvironment = tcDataEnvironment
ENDPROC
ENDDEFINE
Oracle Example...
#INCLUDE "f:\devel\src\include\dal.h"
DEFINE CLASS deoracle AS debase
Tag = ""
DataSourceType = "ODBC"
cconnection = ""
Name = "deoracle"
PROCEDURE getoracledriver
LOCAL loRegEdit AS odbcreg OF registry
LOCAL loAPIInterface AS APIInterface OF util
LOCAL lcDriver, oError, lcINIDir, lcIniFile, lcPreferredDriver
STORE "" TO lcDriver, lcINIDir, lcIniFile, lcPreferredDriver
TRY
loRegEdit = CREATEOBJECT("odbcreg")
CATCH TO oError
ENDTRY
TRY
loAPIInterface = CREATEOBJECT('APIInterface')
CATCH TO oError
ENDTRY
IF VARTYPE(loAPIInterface) = 'O'
lcINIDir = loAPIInterface.GetWinDir()
IF EMPTY(lcINIDir)
lcINIDir = ALLTRIM(FULLPATH(CURDIR()))
ENDIF
lcIniFile = ADDBS(lcINIDir) + INIFILE
IF FILE(lcIniFile)
lcPreferredDriver = loAPIInterface.GetPrivStr(lcIniFile, INI_DB_SECTION, DRIVER_KEY)
ENDIF
ENDIF
IF EMPTY(lcPreferredDriver) AND VARTYPE(loRegEdit) = "O"
LOCAL lnArrayLen
DIMENSION a_Drivers(1)
a_Drivers[1] = ""
loRegEdit.GetOdbcDrvrs(@a_Drivers, .F.)
IF !EMPTY(a_Drivers[1,1])
lnArrayLen = ALEN(a_Drivers, 1)
FOR i = 1 TO lnArrayLen
IF UPPER(ALLTRIM(a_Drivers[i, 1])) == ALLTRIM(UPPER(lcPreferredDriver))
lcDriver = a_Drivers[i, 1]
EXIT
ENDIF
ENDFOR
IF EMPTY(lcDriver)
FOR i = 1 TO lnArrayLen
IF "MICROSOFT"$UPPER(a_Drivers[i, 1])
LOOP
ENDIF
IF SUBSTR(UPPER(a_Drivers[i, 1]), 1, 6) = "ORACLE"
lcDriver = a_Drivers[i, 1]
EXIT
ENDIF
ENDFOR
ENDIF
IF EMPTY(lcDriver)
FOR i = 1 TO lnArrayLen
IF "MICROSOFT"$UPPER(a_Drivers[i, 1])
LOOP
ENDIF
IF "ORACLE"$UPPER(a_Drivers[i, 1])
lcDriver = a_Drivers[i, 1]
EXIT
ENDIF
ENDFOR
ENDIF
IF EMPTY(lcDriver)
FOR i = 1 TO lnArrayLen
IF "ORACLE"$UPPER(a_Drivers[i, 1])
lcDriver = a_Drivers[i, 1]
EXIT
ENDIF
ENDFOR
ENDIF
ENDIF
ELSE
lcDriver = lcPreferredDriver
ENDIF
RETURN lcDriver
ENDPROC
PROCEDURE Destroy
IF VARTYPE(THIS.DataSource) = 'N' AND THIS.DataSource > 0
= SQLDISCONNECT(THIS.DataSource)
ENDIF
DODEFAULT()
ENDPROC
PROCEDURE BeforeOpenTables
DODEFAULT()
IF VARTYPE(THIS.DataSource) = 'X' OR (VARTYPE(THIS.DATASOURCE) = 'N' AND THIS.DATASOURCE < 1)
THIS.DATASOURCE = SQLSTRINGCONNECT(THIS.cConnection)
ENDIF
ENDPROC
PROCEDURE Init
LPARAMETERS tcConnection AS String, toSession AS Session
LOCAL loAPIInterface as APIInterface OF util
LOCAL lcBuffer, lcIniFile, lcConnection, lcDriver
LOCAL oError
STORE "" TO lcBuffer, lcIniFile, lcConnection, lcDriver
SET CLASSLIB TO registry ADDITIVE
TRY
loAPIInterface = CREATEOBJECT('APIInterface')
CATCH TO oError
ENDTRY
IF PCOUNT() >= 1 AND !ISNULL(tcConnection) AND !EMPTY(tcConnection)
lcConnection = LOWER(ALLTRIM(tcConnection))
ELSE
lcConnection = PROD_CONNECTION_STRING
ENDIF
IF VARTYPE(loAPIInterface) = "O"
lcIniFile = ADDBS(ALLT(FULLPATH(CURDIR()))) + DBINIFILE
IF !FILE(lcIniFile)
IF FILE(DBINIFILE)
lcIniFile = FULLPATH(DBINIFILE)
ELSE
lcIniFile = ""
ENDIF
ENDIF
IF !EMPTY(lcIniFile)
lcBuffer = loAPIInterface.GetPrivStr(lcIniFile, INI_DB_SECTION, lcConnection)
lcDriver = "DRIVER={" + THIS.GetOracleDriver() + "}"
IF !EMPTY(lcBuffer) AND !EMPTY(lcDriver)
THIS.cConnection = lcDriver + ";DBQ=" + lcBuffer + ";UID=UsErId;PWD=" + THIS.Encrypt(ORACLE_PWD, .T.)
ENDIF
ENDIF
ENDIF
IF VARTYPE(loAPIInterface) <> "O" OR EMPTY(THIS.cConnection) OR ISNULL(THIS.cConnection)
THIS.cConnection = "DSN=" + lcConnection + ";UID=UsErId;PWD=" + THIS.Encrypt(ORACLE_PWD, .T.)
ENDIF
THIS.Tag = THIS.cConnection
RETURN DODEFAULT(tcConnection, toSession)
ENDPROC
ENDDEFINE