Parameters caction
Note choices are LIST, TABLE
If Type("cAction")<>"C"
cAction="LIST"
Else
cAction=Upper(cAction)
EndIf
If cAction<>"LIST" .and. cAction<>"TABLE"
cAction="LIST"
EndIf
nCurrentWorkArea=Select(0)
#DEFINE ODBC_BOTH_DSN 0 && BOTH may not work as expected
#DEFINE ODBC_USER_DSN 1
#DEFINE ODBC_SYSTEM_DSN 2
DO decl
LOCAL nConfigMode, cSources, cSource, cParamNames, cParam, ii, jj
* saving current value for SQLConfigMode
nConfigMode = GetConfigMode()
= SQLSetConfigMode(ODBC_SYSTEM_DSN)
cSources = Chr(0) + GetPS("ODBC Data Sources", Null) + Chr(0)
CREATE CURSOR csResult (odbcsource C(30), prmname C(20), prmvalue C(200))
ii=1
DO WHILE .T.
cSource = GetSubstr(cSources, ii, Chr(0))
IF EMPTY(cSource)
EXIT
ENDIF
cParamNames = GetPS(cSource, Null)
INSERT INTO csResult VALUES (cSource, "All parameters",;
STRTRAN(cParamNames, Chr(0), " "))
cParamNames = Chr(0) + GetPS(cSource, Null) + Chr(0)
jj = 1
DO WHILE .T.
cParam = GetSubstr(cParamNames, jj, Chr(0))
IF EMPTY(cParam)
EXIT
ENDIF
= AddParam(cSource, cParam)
jj = jj + 1
ENDDO
ii = ii + 1
ENDDO
* restoring SQLConfigMode value
= SQLSetConfigMode(m.nConfigMode)
If cAction="LIST"
Select odbcsource DISTINCT from csResult into cursor dsnresult
cOdbcdsnlist=""
Scan
cOdbcdsnlist=cOdbcdsnlist+Alltrim(dsnresult.odbcsource)+Chr(10)
EndScan
retValue=Left(Alltrim(cOdbcdsnlist),Len(Alltrim(cOdbcdsnlist))-1)
Use in csResult
Use in dsnresult
Select (nCurrentWorkArea)
Return (retValue)
Else
GO TOP
BROWSE NORMAL NOWAIT
EndIf
* end of main
PROCEDURE AddParam(cKey, pname)
LOCAL pvalue
pvalue = GetPS(cKey, m.pname)
pvalue = STRTRAN(pvalue, Chr(0),"")
IF Not EMPTY(pvalue)
INSERT INTO csResult VALUES (m.cKey,;
m.pname, m.pvalue)
ENDIF
FUNCTION GetPS(section, entry)
LOCAL cBuffer, nLen
cBuffer = Repli(Chr(0), 250)
nLen = SQLGetPrivateProfileString(section, entry, "",;
@cBuffer, Len(cBuffer), "ODBC.INI")
RETURN Iif(nLen=0, "", SUBSTR(cBuffer, 1, nLen))
FUNCTION GetSubstr(cSource, nIndex, cChar)
LOCAL nPos1, nPos2
nPos1 = AT(cChar, cSource, nIndex)
nPos2 = AT(cChar, cSource, nIndex+1)
IF MIN(nPos1, nPos2) <> 0
RETURN SUBSTR(cSource, nPos1+1, nPos2-nPos1-1)
ENDIF
RETURN ""
FUNCTION GetConfigMode
LOCAL nMode
nMode=0
= SQLGetConfigMode(@nMode)
RETURN m.nMode
PROCEDURE decl
DECLARE INTEGER SQLSetConfigMode IN odbccp32 LONG wConfigMode
DECLARE INTEGER SQLGetConfigMode IN odbccp32 LONG @pwConfigMode
DECLARE INTEGER SQLGetPrivateProfileString IN odbccp32;
STRING lpszSection, STRING lpszEntry, STRING lpszDefault,;
STRING @RetBuffer, INTEGER cbRetBuffer, STRING lpszFilename