SQLWriteDSNToIni.c [plain text]
#include <iodbc.h>
#include <odbcinst.h>
#include <unicode.h>
#include "inifile.h"
#include "misc.h"
#include "iodbc_error.h"
extern BOOL ValidDSN (LPCSTR lpszDSN);
extern BOOL ValidDSNW (LPCWSTR lpszDSN);
extern int GetPrivateProfileString (LPCSTR lpszSection, LPCSTR lpszEntry,
LPCSTR lpszDefault, LPSTR lpszRetBuffer, int cbRetBuffer,
LPCSTR lpszFilename);
BOOL
WriteDSNToIni (LPCSTR lpszDSN, LPCSTR lpszDriver)
{
char szBuffer[4096];
BOOL retcode = FALSE;
PCONFIG pCfg = NULL;
if (_iodbcdm_cfg_search_init (&pCfg, "odbc.ini", TRUE))
{
PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED);
goto done;
}
if (strcmp (lpszDSN, "Default"))
{
#ifdef WIN32
if (_iodbcdm_cfg_write (pCfg, "ODBC 32 bit Data Sources",
(LPSTR) lpszDSN, (LPSTR) lpszDriver))
#else
if (_iodbcdm_cfg_write (pCfg, "ODBC Data Sources", (LPSTR) lpszDSN,
(LPSTR) lpszDriver))
#endif
{
PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED);
goto done;
}
}
if (_iodbcdm_cfg_write (pCfg, (LPSTR) lpszDSN, NULL, NULL))
{
PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED);
goto done;
}
wSystemDSN = USERDSN_ONLY;
if (!GetPrivateProfileString ((LPSTR) lpszDriver, "Driver", "", szBuffer,
sizeof (szBuffer) - 1, "odbcinst.ini"))
{
wSystemDSN = SYSTEMDSN_ONLY;
if (!GetPrivateProfileString ((LPSTR) lpszDriver, "Driver", "",
szBuffer, sizeof (szBuffer) - 1, "odbcinst.ini"))
{
PUSH_ERROR (ODBC_ERROR_INVALID_NAME);
goto done;
}
}
if (_iodbcdm_cfg_write (pCfg, (LPSTR) lpszDSN, "Driver", szBuffer)
|| _iodbcdm_cfg_commit (pCfg))
{
PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED);
goto done;
}
retcode = TRUE;
done:
wSystemDSN = USERDSN_ONLY;
configMode = ODBC_BOTH_DSN;
if (pCfg)
_iodbcdm_cfg_done (pCfg);
return retcode;
}
BOOL INSTAPI
SQLWriteDSNToIni_Internal (SQLPOINTER lpszDSN, SQLPOINTER lpszDriver,
SQLCHAR waMode)
{
char *_driver_u8 = NULL;
char *_dsn_u8 = NULL;
BOOL retcode = FALSE;
CLEAR_ERROR ();
if (waMode == 'A')
{
if (!lpszDSN || !ValidDSN (lpszDSN) || !STRLEN (lpszDSN))
{
PUSH_ERROR (ODBC_ERROR_INVALID_DSN);
goto quit;
}
}
else
{
if (!lpszDSN || !ValidDSNW (lpszDSN) || !WCSLEN (lpszDSN))
{
PUSH_ERROR (ODBC_ERROR_INVALID_DSN);
goto quit;
}
}
if (waMode == 'W')
{
_dsn_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszDSN, SQL_NTS);
if (_dsn_u8 == NULL && lpszDSN)
{
PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM);
goto quit;
}
}
else
_dsn_u8 = (SQLCHAR *) lpszDSN;
if (waMode == 'W')
{
_driver_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszDriver, SQL_NTS);
if (_driver_u8 == NULL && lpszDriver)
{
PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM);
goto quit;
}
}
else
_driver_u8 = (SQLCHAR *) lpszDriver;
if (!_driver_u8 || !STRLEN (_driver_u8))
{
PUSH_ERROR (ODBC_ERROR_INVALID_NAME);
goto quit;
}
switch (configMode)
{
case ODBC_USER_DSN:
wSystemDSN = USERDSN_ONLY;
retcode = WriteDSNToIni (_dsn_u8, _driver_u8);
goto quit;
case ODBC_SYSTEM_DSN:
wSystemDSN = SYSTEMDSN_ONLY;
retcode = WriteDSNToIni (_dsn_u8, _driver_u8);
goto quit;
case ODBC_BOTH_DSN:
wSystemDSN = USERDSN_ONLY;
retcode = WriteDSNToIni (_dsn_u8, _driver_u8);
if (!retcode)
{
CLEAR_ERROR ();
wSystemDSN = SYSTEMDSN_ONLY;
retcode = WriteDSNToIni (_dsn_u8, _driver_u8);
}
goto quit;
}
PUSH_ERROR (ODBC_ERROR_GENERAL_ERR);
goto quit;
quit:
if (_dsn_u8 != lpszDSN)
MEM_FREE (_dsn_u8);
if (_driver_u8 != lpszDriver)
MEM_FREE (_driver_u8);
wSystemDSN = USERDSN_ONLY;
configMode = ODBC_BOTH_DSN;
return retcode;
}
BOOL INSTAPI
SQLWriteDSNToIni (LPCSTR lpszDSN, LPCSTR lpszDriver)
{
return SQLWriteDSNToIni_Internal ((SQLPOINTER) lpszDSN,
(SQLPOINTER) lpszDriver, 'A');
}
BOOL INSTAPI
SQLWriteDSNToIniW (LPCWSTR lpszDSN, LPCWSTR lpszDriver)
{
return SQLWriteDSNToIni_Internal ((SQLPOINTER) lpszDSN,
(SQLPOINTER) lpszDriver, 'W');
}