SQLConfigDataSource.c [plain text]
#include <iodbc.h>
#include <iodbcinst.h>
#ifdef _MACX
# include <Carbon/Carbon.h>
#endif
#include "dlf.h"
#include "inifile.h"
#include "misc.h"
#include "iodbc_error.h"
#ifndef WIN32
#include <unistd.h>
#define CALL_CONFIG_DSN(path) \
if ((handle = DLL_OPEN(path)) != NULL) \
{ \
if ((pConfigDSN = (pConfigDSNFunc)DLL_PROC(handle, "ConfigDSN")) != NULL) \
{ \
if (pConfigDSN(hwndParent, fRequest, lpszDriver, lpszAttributes)) \
{ \
DLL_CLOSE(handle); \
retcode = TRUE; \
goto done; \
} \
else \
{ \
PUSH_ERROR(ODBC_ERROR_REQUEST_FAILED); \
DLL_CLOSE(handle); \
retcode = FALSE; \
goto done; \
} \
} \
DLL_CLOSE(handle); \
}
#endif
extern BOOL RemoveDSNFromIni (LPCSTR lpszDSN);
BOOL
RemoveDefaultDataSource (void)
{
BOOL retcode = FALSE;
PCONFIG pCfg = NULL;
if (!RemoveDSNFromIni ("Default"))
{
PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED);
goto quit;
}
if (_iodbcdm_cfg_search_init (&pCfg, "odbcinst.ini", TRUE))
{
PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED);
goto quit;
}
_iodbcdm_cfg_write (pCfg, "Default", NULL, NULL);
if (!_iodbcdm_cfg_commit (pCfg))
retcode = TRUE;
else
{
PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED);
goto quit;
}
if (wSystemDSN != SYSTEMDSN_ONLY)
{
if (pCfg)
{
_iodbcdm_cfg_done (pCfg);
pCfg = NULL;
}
wSystemDSN = SYSTEMDSN_ONLY;
if (_iodbcdm_cfg_search_init (&pCfg, "odbcinst.ini", TRUE))
goto quit;
_iodbcdm_cfg_write (pCfg, "Default", NULL, NULL);
_iodbcdm_cfg_commit (pCfg);
}
quit:
if (pCfg)
_iodbcdm_cfg_done (pCfg);
return retcode;
}
BOOL INSTAPI
SQLConfigDataSource (HWND hwndParent, WORD fRequest, LPCSTR lpszDriver,
LPCSTR lpszAttributes)
{
PCONFIG pCfg = NULL;
BOOL retcode = FALSE;
void *handle;
pConfigDSNFunc pConfigDSN;
#ifdef _MACX
CFStringRef libname;
CFBundleRef bundle;
CFURLRef liburl;
char name[1024] = { 0 };
#endif
CLEAR_ERROR ();
switch (fRequest)
{
case ODBC_ADD_DSN:
case ODBC_CONFIG_DSN:
case ODBC_REMOVE_DSN:
configMode = ODBC_USER_DSN;
break;
case ODBC_ADD_SYS_DSN:
case ODBC_CONFIG_SYS_DSN:
case ODBC_REMOVE_SYS_DSN:
configMode = ODBC_SYSTEM_DSN;
fRequest = fRequest - ODBC_ADD_SYS_DSN + ODBC_ADD_DSN;
break;
case ODBC_REMOVE_DEFAULT_DSN:
retcode = RemoveDefaultDataSource ();
goto resetdsnmode;
default:
PUSH_ERROR (ODBC_ERROR_INVALID_REQUEST_TYPE);
goto resetdsnmode;
};
if (!lpszDriver || !STRLEN (lpszDriver))
{
PUSH_ERROR (ODBC_ERROR_INVALID_NAME);
goto resetdsnmode;
}
wSystemDSN = USERDSN_ONLY;
if (!_iodbcdm_cfg_search_init (&pCfg, "odbcinst.ini", TRUE))
{
if (!_iodbcdm_cfg_find (pCfg, (char *) lpszDriver, "Setup"))
CALL_CONFIG_DSN (pCfg->value);
if (!_iodbcdm_cfg_find (pCfg, (char *) lpszDriver, "Driver"))
CALL_CONFIG_DSN (pCfg->value);
if (!access (lpszDriver, X_OK))
CALL_CONFIG_DSN (lpszDriver);
if (!_iodbcdm_cfg_find (pCfg, "Default", "Setup"))
CALL_CONFIG_DSN (pCfg->value);
if (!_iodbcdm_cfg_find (pCfg, "Default", "Driver"))
CALL_CONFIG_DSN (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 *) lpszDriver, "Setup"))
CALL_CONFIG_DSN (pCfg->value);
if (!_iodbcdm_cfg_find (pCfg, (char *) lpszDriver, "Driver"))
CALL_CONFIG_DSN (pCfg->value);
if (!access (lpszDriver, X_OK))
CALL_CONFIG_DSN (lpszDriver);
if (!_iodbcdm_cfg_find (pCfg, "Default", "Setup"))
CALL_CONFIG_DSN (pCfg->value);
if (!_iodbcdm_cfg_find (pCfg, "Default", "Driver"))
CALL_CONFIG_DSN (pCfg->value);
}
#ifdef _MACX
bundle = CFBundleGetBundleWithIdentifier (CFSTR ("org.iodbc.core"));
if (bundle)
{
liburl =
CFBundleCopyResourceURL (bundle, CFSTR ("iODBCdrvproxy.bundle"),
NULL, NULL);
if (liburl
&& (libname =
CFURLCopyFileSystemPath (liburl, kCFURLPOSIXPathStyle)))
{
CFStringGetCString (libname, name, sizeof (name),
kCFStringEncodingASCII);
strcat (name, "/Contents/MacOS/iODBCdrvproxy");
CALL_CONFIG_DSN (name);
}
if (liburl)
CFRelease (liburl);
if (libname)
CFRelease (libname);
CFRelease (bundle);
}
#else
CALL_CONFIG_DSN ("libdrvproxy.so");
#endif
PUSH_ERROR (ODBC_ERROR_LOAD_LIB_FAILED);
done:
if (pCfg)
_iodbcdm_cfg_done (pCfg);
resetdsnmode:
wSystemDSN = USERDSN_ONLY;
configMode = ODBC_BOTH_DSN;
return retcode;
}