SQLGetTranslator.c [plain text]
#include <iodbc.h>
#include <iodbcinst.h>
#include "dlf.h"
#include "inifile.h"
#include "misc.h"
#include "iodbc_error.h"
#ifndef WIN32
#include <unistd.h>
#define CALL_CONFIG_TRANSLATOR(path) \
if ((handle = DLL_OPEN(path)) != NULL) \
{ \
if ((pConfigTranslator = (pConfigTranslatorFunc)DLL_PROC(handle, "ConfigTranslator")) != NULL) \
{ \
if (pConfigTranslator(hwndParent, pvOption)) \
{ \
DLL_CLOSE(handle); \
finish = retcode = TRUE; \
goto done; \
} \
else \
{ \
PUSH_ERROR(ODBC_ERROR_GENERAL_ERR); \
DLL_CLOSE(handle); \
retcode = FALSE; \
goto done; \
} \
} \
DLL_CLOSE(handle); \
}
#endif
extern SQLRETURN _iodbcdm_trschoose_dialbox(HWND, LPSTR, DWORD, int FAR*);
BOOL INSTAPI GetTranslator (HWND hwndParent, LPSTR lpszName, WORD cbNameMax,
WORD FAR *pcbNameOut, LPSTR lpszPath, WORD cbPathMax,
WORD FAR *pcbPathOut, DWORD FAR *pvOption)
{
pConfigTranslatorFunc pConfigTranslator;
BOOL retcode = FALSE, finish = FALSE;
PCONFIG pCfg;
UWORD configMode;
RETCODE ret;
void *handle;
char translator[1024];
do
{
#ifdef GUI
ret =
_iodbcdm_trschoose_dialbox (hwndParent, translator,
sizeof (translator), NULL);
#else
ret = SQL_NO_DATA;
#endif
if (ret == SQL_NO_DATA)
{
if (pcbNameOut)
*pcbNameOut = 0;
if (pcbPathOut)
*pcbPathOut = 0;
finish = TRUE;
}
if (ret == SQL_SUCCESS)
{
STRNCPY (lpszName, translator + STRLEN ("TranslationName="),
cbNameMax - 1);
if (pcbNameOut)
*pcbNameOut = STRLEN (lpszName);
wSystemDSN = USERDSN_ONLY;
if (!_iodbcdm_cfg_search_init (&pCfg, "odbcinst.ini", TRUE))
{
if (!_iodbcdm_cfg_find (pCfg, (char *) lpszName, "Setup"))
CALL_CONFIG_TRANSLATOR (pCfg->value);
if (!_iodbcdm_cfg_find (pCfg, (char *) lpszName, "Translator"))
CALL_CONFIG_TRANSLATOR (pCfg->value);
if (!access (lpszName, X_OK))
CALL_CONFIG_TRANSLATOR (lpszName);
if (!_iodbcdm_cfg_find (pCfg, "Default", "Setup"))
CALL_CONFIG_TRANSLATOR (pCfg->value);
if (!_iodbcdm_cfg_find (pCfg, "Default", "Translator"))
CALL_CONFIG_TRANSLATOR (pCfg->value);
}
if (pCfg)
{
_iodbcdm_cfg_done (pCfg);
pCfg = NULL;
}
wSystemDSN = SYSTEMDSN_ONLY;
if (!_iodbcdm_cfg_search_init (&pCfg, "odbcinst.ini", TRUE))
{
if (!_iodbcdm_cfg_find (pCfg, (char *) lpszName, "Setup"))
CALL_CONFIG_TRANSLATOR (pCfg->value);
if (!_iodbcdm_cfg_find (pCfg, (char *) lpszName, "Translator"))
CALL_CONFIG_TRANSLATOR (pCfg->value);
if (!access (lpszName, X_OK))
CALL_CONFIG_TRANSLATOR (lpszName);
if (!_iodbcdm_cfg_find (pCfg, "Default", "Setup"))
CALL_CONFIG_TRANSLATOR (pCfg->value);
if (!_iodbcdm_cfg_find (pCfg, "Default", "Translator"))
CALL_CONFIG_TRANSLATOR (pCfg->value);
}
CALL_CONFIG_TRANSLATOR ("libtranslator.so");
PUSH_ERROR (ODBC_ERROR_LOAD_LIB_FAILED);
done:
STRNCPY (lpszPath, pCfg->fileName, cbPathMax - 1);
if (pcbPathOut)
*pcbPathOut = STRLEN (lpszPath);
_iodbcdm_cfg_done (pCfg);
}
}
while (!finish);
retcode = TRUE;
quit:
wSystemDSN = USERDSN_ONLY;
configMode = ODBC_BOTH_DSN;
return retcode;
}
BOOL INSTAPI
SQLGetTranslator (
HWND hwnd,
LPSTR lpszName,
WORD cbNameMax,
WORD FAR * pcbNameOut,
LPSTR lpszPath,
WORD cbPathMax,
WORD FAR * pcbPathOut,
DWORD FAR * pvOption)
{
BOOL retcode = FALSE;
CLEAR_ERROR ();
if (!hwnd)
{
PUSH_ERROR (ODBC_ERROR_INVALID_HWND);
goto quit;
}
if (!lpszName || !lpszPath || cbNameMax < 1 || cbPathMax < 1)
{
PUSH_ERROR (ODBC_ERROR_INVALID_BUFF_LEN);
goto quit;
}
retcode = GetTranslator (hwnd, lpszName, cbNameMax, pcbNameOut, lpszPath,
cbPathMax, pcbPathOut, pvOption);
quit:
return retcode;
}