BOOL INSTAPI SQLReadFileDSNW (LPCWSTR lpszFileName, LPCWSTR lpszAppName, LPCWSTR lpszKeyName, LPWSTR lpszString, WORD cbString, WORD * pcbString) { char *_filename_u8 = NULL; char *_appname_u8 = NULL; char *_keyname_u8 = NULL; char *_string_u8 = NULL; BOOL retcode = FALSE; _filename_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszFileName, SQL_NTS); if (_filename_u8 == NULL && lpszFileName) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _appname_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszAppName, SQL_NTS); if (_appname_u8 == NULL && lpszAppName) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _keyname_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszKeyName, SQL_NTS); if (_keyname_u8 == NULL && lpszKeyName) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } if (cbString > 0) { if ((_string_u8 = malloc (cbString * UTF8_MAX_CHAR_LEN + 1)) == NULL) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } } retcode = SQLReadFileDSN (_filename_u8, _appname_u8, _keyname_u8, _string_u8, cbString * UTF8_MAX_CHAR_LEN, pcbString); if (retcode == TRUE) { dm_StrCopyOut2_U8toW (_string_u8, lpszString, cbString, pcbString); } done: MEM_FREE (_filename_u8); MEM_FREE (_appname_u8); MEM_FREE (_keyname_u8); MEM_FREE (_string_u8); return retcode; }
BOOL INSTAPI SQLWritePrivateProfileStringW (LPCWSTR lpszSection, LPCWSTR lpszEntry, LPCWSTR lpszString, LPCWSTR lpszFilename) { char *_section_u8 = NULL; char *_entry_u8 = NULL; char *_string_u8 = NULL; char *_filename_u8 = NULL; BOOL retcode = FALSE; _section_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszSection, SQL_NTS); if (_section_u8 == NULL && lpszSection) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _entry_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszEntry, SQL_NTS); if (_entry_u8 == NULL && lpszEntry) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _string_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszString, SQL_NTS); if (_string_u8 == NULL && lpszString) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _filename_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszFilename, SQL_NTS); if (_filename_u8 == NULL && lpszFilename) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } retcode = SQLWritePrivateProfileString (_section_u8, _entry_u8, _string_u8, _filename_u8); done: MEM_FREE (_section_u8); MEM_FREE (_entry_u8); MEM_FREE (_string_u8); MEM_FREE (_filename_u8); return retcode; }
BOOL INSTAPI SQLWriteFileDSNW (LPCWSTR lpszFileName, LPCWSTR lpszAppName, LPCWSTR lpszKeyName, LPWSTR lpszString) { char *_filename_u8 = NULL; char *_appname_u8 = NULL; char *_keyname_u8 = NULL; char *_string_u8 = NULL; BOOL retcode = FALSE; _filename_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszFileName, SQL_NTS); if (_filename_u8 == NULL && lpszFileName) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _appname_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszAppName, SQL_NTS); if (_appname_u8 == NULL && lpszAppName) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _keyname_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszKeyName, SQL_NTS); if (_keyname_u8 == NULL && lpszKeyName) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _string_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszString, SQL_NTS); if (_string_u8 == NULL && lpszString) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } retcode = SQLWriteFileDSN (_filename_u8, _appname_u8, _keyname_u8, _string_u8); done: MEM_FREE (_filename_u8); MEM_FREE (_appname_u8); MEM_FREE (_keyname_u8); MEM_FREE (_string_u8); return retcode; }
BOOL create_confirmw (HWND hwnd, LPCWSTR dsn, LPCWSTR text) { LPSTR _dsn = NULL; LPSTR _text = NULL; _dsn = dm_SQL_WtoU8(dsn, SQL_NTS); _text = dm_SQL_WtoU8(text, SQL_NTS); create_message(hwnd, _dsn, _text); if (_dsn) free(_dsn); if (_text) free(_text); }
void create_errorw (HWND hwnd, LPCWSTR dsn, LPCWSTR text, LPCWSTR errmsg) { LPSTR _dsn = NULL; LPSTR _text = NULL; LPSTR _errmsg = NULL; _dsn = dm_SQL_WtoU8(dsn, SQL_NTS); _text = dm_SQL_WtoU8(text, SQL_NTS); _errmsg = dm_SQL_WtoU8(errmsg, SQL_NTS); create_error(hwnd, _dsn, _text, _errmsg); if (_dsn) free(_dsn); if (_text) free(_text); if (_errmsg) free(_errmsg); }
BOOL INSTAPI SQLGetAvailableDriversW (LPCWSTR lpszInfFile, LPWSTR lpszBuf, WORD cbBufMax, WORD FAR * pcbBufOut) { BOOL retcode = FALSE; char *_inf_u8 = NULL; char *_buffer_u8 = NULL; SQLCHAR *ptr; SQLWCHAR *ptrW; WORD len = 0, length; _inf_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszInfFile, SQL_NTS); if (_inf_u8 == NULL && lpszInfFile) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } if (cbBufMax > 0) { if ((_buffer_u8 = malloc (cbBufMax * UTF8_MAX_CHAR_LEN + 1)) == NULL) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } } retcode = SQLGetAvailableDrivers (_inf_u8, _buffer_u8, cbBufMax * UTF8_MAX_CHAR_LEN, pcbBufOut); if (retcode == TRUE) { length = 0; for (ptr = _buffer_u8, ptrW = lpszBuf; *ptr; ptr += STRLEN (ptr) + 1, ptrW += WCSLEN (ptrW) + 1) { dm_StrCopyOut2_U8toW (ptr, ptrW, cbBufMax - 1, &len); length += len; } *ptrW = L'\0'; if (pcbBufOut) *pcbBufOut = length + 1; } done: MEM_FREE (_inf_u8); MEM_FREE (_buffer_u8); return retcode; }
BOOL INSTAPI SQLInstallODBCW (HWND hwndParent, LPCWSTR lpszInfFile, LPCWSTR lpszSrcPath, LPCWSTR lpszDrivers) { char *_inf_u8 = NULL; char *_srcpath_u8 = NULL; char *_drivers_u8 = NULL; BOOL retcode = FALSE; _inf_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszInfFile, SQL_NTS); if (_inf_u8 == NULL && lpszInfFile) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _srcpath_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszSrcPath, SQL_NTS); if (_srcpath_u8 == NULL && lpszSrcPath) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _drivers_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszDrivers, SQL_NTS); if (_drivers_u8 == NULL && lpszDrivers) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } retcode = SQLInstallODBC (hwndParent, _inf_u8, _srcpath_u8, _drivers_u8); done: MEM_FREE (_inf_u8); MEM_FREE (_srcpath_u8); MEM_FREE (_drivers_u8); return retcode; }
/* * Parse a configuration from string */ int _iodbcdm_cfg_parse_str (PCONFIG pconfig, void *str, int size, int wide) { int ret; char *_str; _str = wide ? (char *) dm_SQL_WtoU8 (str, size) : str; ret = _iodbcdm_cfg_parse_str_Internal (pconfig, _str); if (wide) MEM_FREE (_str); return ret; }
RETCODE INSTAPI SQLPostInstallerErrorW (DWORD fErrorCode, LPWSTR szErrorMsg) { char *_errormsg_u8 = NULL; RETCODE retcode = SQL_ERROR; _errormsg_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) szErrorMsg, SQL_NTS); if (_errormsg_u8 == NULL && szErrorMsg) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } retcode = SQLPostInstallerError (fErrorCode, _errormsg_u8); done: MEM_FREE (_errormsg_u8); return retcode; }
BOOL INSTAPI SQLRemoveDriverW (LPCWSTR lpszDriver, BOOL fRemoveDSN, LPDWORD lpdwUsageCount) { char *_driver_u8 = NULL; BOOL retcode = FALSE; _driver_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszDriver, SQL_NTS); if (_driver_u8 == NULL && lpszDriver) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } retcode = SQLRemoveDriver (_driver_u8, fRemoveDSN, lpdwUsageCount); done: MEM_FREE (_driver_u8); return retcode; }
BOOL INSTAPI SQLRemoveTranslatorW (LPCWSTR lpszTranslator, LPDWORD lpdwUsageCount) { char *_translator_u8 = NULL; BOOL retcode = FALSE; _translator_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszTranslator, SQL_NTS); if (_translator_u8 == NULL && lpszTranslator) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } retcode = SQLRemoveTranslator (_translator_u8, lpdwUsageCount); done: MEM_FREE (_translator_u8); return retcode; }
char * get_full_pathname (long dirID, short volID) { FSVolumeInfoParam vol; HFSUniStr255 volname; CInfoPBRec pb; OSErr result; Str255 dir; char *pathname = NULL; char *prov = NULL; SInt16 vdefNum; SInt32 dummy; pb.dirInfo.ioNamePtr = dir; pb.dirInfo.ioVRefNum = volID; pb.dirInfo.ioDrParID = dirID; pb.dirInfo.ioFDirIndex = -1; do { pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrParID; result = PBGetCatInfo (&pb, false); if (result != noErr) return NULL; if (pb.dirInfo.ioDrDirID != fsRtDirID) { prov = pathname; pathname = (char *) malloc ((pathname ? strlen (pathname) : 0) + (unsigned char) dir[0] + 2); strcpy (pathname, PATH_SEPARATOR); strncat (pathname, (char *) dir + 1, (unsigned char) dir[0]); } #ifdef macintosh else { prov = pathname; pathname = (char *) malloc ((pathname ? strlen (pathname) : 0) + (unsigned char) dir[0] + 1); pathname[0] = 0; strncat (pathname, (char *) dir + 1, (unsigned char) dir[0]); } #endif if (prov) { strcat (pathname, prov); free (prov); prov = NULL; } } while (pb.dirInfo.ioDrDirID != fsRtDirID); #ifdef __APPLE__ /* Get also the volume name */ FindFolder (kOnSystemDisk, kSystemFolderType, FALSE, &vdefNum, &dummy); if(vdefNum != volID) { vol.ioVRefNum = volID; vol.volumeIndex = 0; vol.whichInfo = kFSVolInfoNone; vol.volumeName = &volname; vol.ref = NULL; PBGetVolumeInfoSync(&vol); if(volname.length) { wchar_t volwchar[1024]; char *volutf8 = NULL; /* Convert the UniString255 to wchar */ for(dummy = 0 ; dummy < volname.length ; dummy++) volwchar[dummy] = volname.unicode[dummy]; volwchar[dummy] = L'\0'; /* Then transform it in UTF8 */ volutf8 = dm_SQL_WtoU8 (volwchar, SQL_NTS); if(volutf8) { prov = pathname; pathname = (char*) malloc ((pathname ? strlen (pathname) : 0) + volname.length + strlen("/Volumes/") + 2); strcpy(pathname, "/Volumes/"); strcat(pathname, volutf8); if(prov) { strcat(pathname, prov); free(prov); } free(volutf8); } } } #endif return pathname; }
BOOL INSTAPI SQLWriteDSNToIni_Internal (SQLPOINTER lpszDSN, SQLPOINTER lpszDriver, SQLCHAR waMode) { char *_driver_u8 = NULL; char *_dsn_u8 = NULL; BOOL retcode = FALSE; /* Check input parameters */ 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 RemoveDSNFromIni (SQLPOINTER lpszDSN, SQLCHAR waMode) { BOOL retcode = FALSE; char *_dsn_u8 = NULL; PCONFIG pCfg; /* Check dsn */ if (waMode == 'A') { if (!lpszDSN || !ValidDSN (lpszDSN) || !STRLEN (lpszDSN)) { PUSH_ERROR (ODBC_ERROR_INVALID_DSN); goto quit; } _dsn_u8 = lpszDSN; } else { if (!lpszDSN || !ValidDSNW (lpszDSN) || !WCSLEN (lpszDSN)) { PUSH_ERROR (ODBC_ERROR_INVALID_DSN); goto quit; } _dsn_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszDSN, SQL_NTS); if (_dsn_u8 == NULL && lpszDSN) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto quit; } } if (_iodbcdm_cfg_search_init (&pCfg, "odbc.ini", TRUE)) { PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED); goto quit; } if (strcmp (_dsn_u8, "Default")) { /* deletes a DSN from [ODBC data sources] section */ #ifdef WIN32 _iodbcdm_cfg_write (pCfg, "ODBC 32 bit Data Sources", (LPSTR) _dsn_u8, NULL); #else _iodbcdm_cfg_write (pCfg, "ODBC Data Sources", (LPSTR) _dsn_u8, NULL); #endif } /* deletes the DSN section in odbc.ini */ _iodbcdm_cfg_write (pCfg, (LPSTR) _dsn_u8, NULL, NULL); if (_iodbcdm_cfg_commit (pCfg)) { PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED); goto done; } retcode = TRUE; done: _iodbcdm_cfg_done (pCfg); quit: if (_dsn_u8 != lpszDSN) MEM_FREE (_dsn_u8); return retcode; }
BOOL INSTAPI SQLInstallTranslatorW (LPCWSTR lpszInfFile, LPCWSTR lpszTranslator, LPCWSTR lpszPathIn, LPWSTR lpszPathOut, WORD cbPathOutMax, WORD FAR * pcbPathOut, WORD fRequest, LPDWORD lpdwUsageCount) { char *_inf_u8 = NULL; char *_translator_u8 = NULL; char *_pathin_u8 = NULL; char *_pathout_u8 = NULL; BOOL retcode = FALSE; _inf_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszInfFile, SQL_NTS); if (_inf_u8 == NULL && lpszInfFile) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _translator_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszTranslator, SQL_NTS); if (_translator_u8 == NULL && lpszTranslator) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _pathin_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszPathIn, SQL_NTS); if (_pathin_u8 == NULL && lpszPathIn) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } if (cbPathOutMax > 0) { if ((_pathout_u8 = malloc (cbPathOutMax * UTF8_MAX_CHAR_LEN + 1)) == NULL) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } } retcode = SQLInstallTranslator (_inf_u8, _translator_u8, _pathin_u8, _pathout_u8, cbPathOutMax * UTF8_MAX_CHAR_LEN, pcbPathOut, fRequest, lpdwUsageCount); if (retcode == TRUE) { dm_StrCopyOut2_U8toW (_pathout_u8, lpszPathOut, cbPathOutMax, pcbPathOut); } done: MEM_FREE (_inf_u8); MEM_FREE (_translator_u8); MEM_FREE (_pathin_u8); MEM_FREE (_pathout_u8); return retcode; }
BOOL INSTAPI SQLInstallTranslatorExW (LPCWSTR lpszTranslator, LPCWSTR lpszPathIn, LPWSTR lpszPathOut, WORD cbPathOutMax, WORD * pcbPathOut, WORD fRequest, LPDWORD lpdwUsageCount) { char *_translator_u8 = NULL; char *_pathin_u8 = NULL; char *_pathout_u8 = NULL; BOOL retcode = FALSE; int length; SQLWCHAR *ptr; char *ptr_u8; for (length = 0, ptr = (SQLWCHAR *) lpszTranslator; *ptr; length += WCSLEN (ptr) + 1, ptr += WCSLEN (ptr) + 1); if (length > 0) { if ((_translator_u8 = malloc (length * UTF8_MAX_CHAR_LEN + 1)) != NULL) { for (ptr = (SQLWCHAR *) lpszTranslator, ptr_u8 = _translator_u8; *ptr; ptr += WCSLEN (ptr) + 1, ptr_u8 += STRLEN (ptr_u8) + 1) dm_StrCopyOut2_W2A (ptr, ptr_u8, WCSLEN (ptr) * UTF8_MAX_CHAR_LEN, NULL); *ptr_u8 = '\0'; } } else _translator_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszTranslator, SQL_NTS); if (_translator_u8 == NULL && lpszTranslator) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } _pathin_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszPathIn, SQL_NTS); if (_pathin_u8 == NULL && lpszPathIn) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } if (cbPathOutMax > 0) { if ((_pathout_u8 = malloc (cbPathOutMax * UTF8_MAX_CHAR_LEN + 1)) == NULL) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } } retcode = SQLInstallTranslatorEx (_translator_u8, _pathin_u8, _pathout_u8, cbPathOutMax * UTF8_MAX_CHAR_LEN, pcbPathOut, fRequest, lpdwUsageCount); if (retcode == TRUE) { dm_StrCopyOut2_U8toW (_pathout_u8, lpszPathOut, cbPathOutMax, pcbPathOut); } done: MEM_FREE (_translator_u8); MEM_FREE (_pathin_u8); MEM_FREE (_pathout_u8); return retcode; }
BOOL INSTAPI SQLConfigDriver_Internal (HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszArgs, LPSTR lpszMsg, WORD cbMsgMax, WORD FAR * pcbMsgOut, SQLCHAR waMode) { PCONFIG pCfg; BOOL retcode = FALSE; void *handle; pConfigDriverFunc pConfigDriver; pConfigDriverWFunc pConfigDriverW; #if defined (__APPLE__) && !(defined (NO_FRAMEWORKS) || defined (_LP64)) CFStringRef libname = NULL; CFBundleRef bundle; CFURLRef liburl; char name[1024] = { 0 }; #endif char *_drv_u8 = NULL; /* Check input parameters */ CLEAR_ERROR (); if (waMode == 'W') { _drv_u8 = (char *) dm_SQL_WtoU8 ((SQLWCHAR *) lpszDriver, SQL_NTS); if (_drv_u8 == NULL && lpszDriver) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto quit; } } else _drv_u8 = (char *) lpszDriver; if (!_drv_u8 || !STRLEN (_drv_u8)) { PUSH_ERROR (ODBC_ERROR_INVALID_NAME); goto quit; } /* Map the request User/System */ if (fRequest < ODBC_INSTALL_DRIVER || fRequest > ODBC_CONFIG_DRIVER_MAX) { PUSH_ERROR (ODBC_ERROR_INVALID_REQUEST_TYPE); goto quit; } /* Get it from the user odbcinst file */ wSystemDSN = USERDSN_ONLY; if (!_iodbcdm_cfg_search_init (&pCfg, "odbcinst.ini", TRUE)) { if (!_iodbcdm_cfg_find (pCfg, (char *) _drv_u8, "Setup")) { if (waMode == 'A') { CALL_CONFIG_DRIVER (pCfg->value); } else { CALL_CONFIG_DRIVERW (pCfg->value); } } if (!_iodbcdm_cfg_find (pCfg, (char *) _drv_u8, "Driver")) { if (waMode == 'A') { CALL_CONFIG_DRIVER (pCfg->value); } else { CALL_CONFIG_DRIVERW (pCfg->value); } } if (!access (_drv_u8, X_OK)) { if (waMode == 'A') { CALL_CONFIG_DRIVER (_drv_u8); } else { CALL_CONFIG_DRIVERW (_drv_u8); } } if (!_iodbcdm_cfg_find (pCfg, "Default", "Setup")) { if (waMode == 'A') { CALL_CONFIG_DRIVER (pCfg->value); } else { CALL_CONFIG_DRIVERW (pCfg->value); } } if (!_iodbcdm_cfg_find (pCfg, "Default", "Driver")) { if (waMode == 'A') { CALL_CONFIG_DRIVER (pCfg->value); } else { CALL_CONFIG_DRIVERW (pCfg->value); } } } /* Get it from the system odbcinst file */ 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 *) _drv_u8, "Setup")) { if (waMode == 'A') { CALL_CONFIG_DRIVER (pCfg->value); } else { CALL_CONFIG_DRIVERW (pCfg->value); } } if (!_iodbcdm_cfg_find (pCfg, (char *) _drv_u8, "Driver")) { if (waMode == 'A') { CALL_CONFIG_DRIVER (pCfg->value); } else { CALL_CONFIG_DRIVERW (pCfg->value); } } if (!access (_drv_u8, X_OK)) { if (waMode == 'A') { CALL_CONFIG_DRIVER (_drv_u8); } else { CALL_CONFIG_DRIVERW (_drv_u8); } } if (!_iodbcdm_cfg_find (pCfg, "Default", "Setup")) { if (waMode == 'A') { CALL_CONFIG_DRIVER (pCfg->value); } else { CALL_CONFIG_DRIVERW (pCfg->value); } } if (!_iodbcdm_cfg_find (pCfg, "Default", "Driver")) { if (waMode == 'A') { CALL_CONFIG_DRIVER (pCfg->value); } else { CALL_CONFIG_DRIVERW (pCfg->value); } } } /* The last ressort, a proxy driver */ #if defined (__APPLE__) && !(defined (NO_FRAMEWORKS) || defined (_LP64)) bundle = CFBundleGetBundleWithIdentifier (CFSTR ("org.iodbc.inst")); if (bundle) { /* Search for the drvproxy library */ 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"); if (waMode == 'A') { CALL_CONFIG_DRIVER (name); } else { CALL_CONFIG_DRIVERW (name); } } if (liburl) CFRelease (liburl); if (libname) CFRelease (libname); } #else if (waMode == 'A') { CALL_CONFIG_DRIVER ("libdrvproxy.so.2"); } else { CALL_CONFIG_DRIVERW ("libdrvproxy.so.2"); } #endif /* Error : ConfigDriver could no be found */ PUSH_ERROR (ODBC_ERROR_LOAD_LIB_FAILED); done: if (pCfg) _iodbcdm_cfg_done (pCfg); quit: if (_drv_u8 != lpszDriver) MEM_FREE (_drv_u8); wSystemDSN = USERDSN_ONLY; configMode = ODBC_BOTH_DSN; if (pcbMsgOut) *pcbMsgOut = 0; return retcode; }
/* Changed ... Have to implement the same for translators */ void adddrivers_to_list (ControlRef widget, WindowRef dlg, BOOL addNotify) { wchar_t drvdesc[1024], drvattrs[1024], driver[1024]; DataBrowserItemID item = DBITEM_ID + 1; DataBrowserCallbacks dbCallbacks; ThemeDrawingState outState = NULL; UInt16 colSize[5] = { 150, 150, 100, 50 , 50}; void *handle; SInt16 outBaseline; Point ioBound; struct stat _stat; SQLSMALLINT len, len1; SQLRETURN ret; HENV henv, drv_henv; HDBC drv_hdbc; pSQLGetInfoFunc funcHdl; pSQLAllocHandle allocHdl; pSQLAllocEnv allocEnvHdl = NULL; pSQLAllocConnect allocConnectHdl = NULL; pSQLFreeHandle freeHdl; pSQLFreeEnv freeEnvHdl; pSQLFreeConnect freeConnectHdl; char *_drv_u8 = NULL; int i; if (!widget) return; GetThemeDrawingState (&outState); /* Install an event handler on the component databrowser */ dbCallbacks.version = kDataBrowserLatestCallbacks; InitDataBrowserCallbacks (&dbCallbacks); if (addNotify) dbCallbacks.u.v1.itemNotificationCallback = NewDataBrowserItemNotificationUPP (drivers_notification_item); /* On Mac OS X 10.0.x : clientDataCallback */ dbCallbacks.u.v1.itemDataCallback = NewDataBrowserItemDataUPP (drivers_getset_item); SetDataBrowserCallbacks (widget, &dbCallbacks); /* Begin the draw of the data browser */ SetDataBrowserTarget (widget, DBITEM_ID); /* Make the clean up */ for (i = 0; i < Drivers_nrows; i++, item++) { CFRelease (Drivers_array[0][i]); Drivers_array[0][i] = NULL; CFRelease (Drivers_array[1][i]); Drivers_array[1][i] = NULL; CFRelease (Drivers_array[2][i]); Drivers_array[2][i] = NULL; CFRelease (Drivers_array[3][i]); Drivers_array[3][i] = NULL; CFRelease (Drivers_array[4][i]); Drivers_array[4][i] = NULL; RemoveDataBrowserItems (widget, DBITEM_ID, 1, &item, DBNAME_ID); } /* Global Initialization */ Drivers_nrows = 0; item = DBITEM_ID + 1; /* Create a HENV to get the list of drivers then */ ret = SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) { _iodbcdm_nativeerrorbox (dlg, henv, SQL_NULL_HANDLE, SQL_NULL_HANDLE); goto end; } /* Set the version ODBC API to use */ SQLSetEnvAttr (henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER); /* Get the list of drivers */ ret = SQLDriversW (henv, SQL_FETCH_FIRST, drvdesc, sizeof (drvdesc)/sizeof(wchar_t), &len, drvattrs, sizeof (drvattrs)/sizeof(wchar_t), &len1); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO && ret != SQL_NO_DATA) { _iodbcdm_nativeerrorbox (dlg, henv, SQL_NULL_HANDLE, SQL_NULL_HANDLE); goto error; } while (ret != SQL_NO_DATA) { Drivers_array[0][Drivers_nrows] = convert_wchar_to_CFString(drvdesc); /* Get the driver library name */ SQLSetConfigMode (ODBC_BOTH_DSN); SQLGetPrivateProfileStringW (drvdesc, L"Driver", L"", driver, sizeof (driver)/sizeof(wchar_t), L"odbcinst.ini"); if (driver[0] == L'\0') SQLGetPrivateProfileStringW (L"Default", L"Driver", L"", driver, sizeof (driver)/sizeof(wchar_t), L"odbcinst.ini"); if (driver[0] == L'\0') { if (Drivers_array[0][Drivers_nrows]) { CFRelease (Drivers_array[0][Drivers_nrows]); Drivers_array[0][Drivers_nrows] = NULL; } goto skip; } Drivers_array[1][Drivers_nrows] = convert_wchar_to_CFString(driver); /* Alloc a connection handle */ drv_hdbc = NULL; drv_henv = NULL; _drv_u8 = (char *) dm_SQL_WtoU8((SQLWCHAR*)driver, SQL_NTS); if (_drv_u8 == NULL) goto skip; if ((handle = DLL_OPEN(_drv_u8)) != NULL) { if ((allocHdl = (pSQLAllocHandle)DLL_PROC(handle, "SQLAllocHandle")) != NULL) { ret = allocHdl(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &drv_henv); if (ret == SQL_ERROR) goto nodriverver; ret = allocHdl(SQL_HANDLE_DBC, drv_henv, &drv_hdbc); if (ret == SQL_ERROR) goto nodriverver; } else { if ((allocEnvHdl = (pSQLAllocEnv)DLL_PROC(handle, "SQLAllocEnv")) != NULL) { ret = allocEnvHdl(&drv_henv); if (ret == SQL_ERROR) goto nodriverver; } else goto nodriverver; if ((allocConnectHdl = (pSQLAllocConnect)DLL_PROC(handle, "SQLAllocConnect")) != NULL) { ret = allocConnectHdl(drv_henv, &drv_hdbc); if (ret == SQL_ERROR) goto nodriverver; } else goto nodriverver; } /* * Use SQLGetInfoA for Unicode drivers * and SQLGetInfo for ANSI drivers */ funcHdl = (pSQLGetInfoFunc)DLL_PROC(handle, "SQLGetInfoA"); if (!funcHdl) funcHdl = (pSQLGetInfoFunc)DLL_PROC(handle, "SQLGetInfo"); if (funcHdl) { /* Retrieve some informations */ ret = funcHdl (drv_hdbc, SQL_DRIVER_VER, drvattrs, sizeof(drvattrs), &len); if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { char *p = drvattrs; /* Find the description if one provided */ for (; *p ; p++) { if (*p == ' ') { *p++ = '\0'; break; } } /* * Store Version */ Drivers_array[2][Drivers_nrows] = CFStringCreateWithCString(NULL, (char *)drvattrs, kCFStringEncodingUTF8); } else goto nodriverver; } else if ((funcHdl = (pSQLGetInfoFunc)DLL_PROC(handle, "SQLGetInfoW")) != NULL) { /* Retrieve some informations */ ret = funcHdl (drv_hdbc, SQL_DRIVER_VER, drvattrs, sizeof(drvattrs), &len); if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { wchar_t *p = drvattrs; /* Find the description if one provided */ for (; *p ; p++) { if (*p == L' ') { *p++ = L'\0'; break; } } /* * Store Version */ Drivers_array[2][Drivers_nrows] = convert_wchar_to_CFString(drvattrs); } else goto nodriverver; } else goto nodriverver; } else { nodriverver: Drivers_array[2][Drivers_nrows] = CFStringCreateWithCString(NULL, "##.##", kCFStringEncodingUTF8); } if(drv_hdbc || drv_henv) { if(allocConnectHdl && (freeConnectHdl = (pSQLFreeConnect)DLL_PROC(handle, "SQLFreeConnect")) != NULL) { freeConnectHdl(drv_hdbc); drv_hdbc = NULL; } if(allocEnvHdl && (freeEnvHdl = (pSQLFreeEnv)DLL_PROC(handle, "SQLFreeEnv")) != NULL) { freeEnvHdl(drv_henv); drv_henv = NULL; } } if ((drv_hdbc || drv_henv) && (freeHdl = (pSQLFreeHandle)DLL_PROC(handle, "SQLFreeHandle")) != NULL) { if(drv_hdbc) freeHdl(SQL_HANDLE_DBC, drv_hdbc); if(drv_henv) freeHdl(SQL_HANDLE_ENV, drv_henv); } DLL_CLOSE(handle); /* Get the size and date of the driver */ if (!stat (_drv_u8, &_stat)) { CFStringRef strRef; struct tm drivertime; char buf[100]; Drivers_array[3][Drivers_nrows] = CFStringCreateWithFormat(NULL, NULL, strRef = CFStringCreateWithCString(NULL, "%d Kb", kCFStringEncodingUTF8), (int) (_stat.st_size / 1024)); CFRelease(strRef); localtime_r (&_stat.st_mtime, &drivertime); strftime (buf, sizeof (buf), "%c", &drivertime); Drivers_array[4][Drivers_nrows] = CFStringCreateWithCString(NULL, buf, kCFStringEncodingUTF8); } else { Drivers_array[3][Drivers_nrows] = CFStringCreateWithCString(NULL, "-", kCFStringEncodingUTF8); Drivers_array[4][Drivers_nrows] = CFStringCreateWithCString(NULL, "-", kCFStringEncodingUTF8); } for(i = 0 ; i < 5 ; i++) { GetThemeTextDimensions (Drivers_array[i][Drivers_nrows], kThemeSystemFont, kThemeStateActive, false, &ioBound, &outBaseline); if(colSize[i] < ioBound.h) colSize[i] = ioBound.h; } AddDataBrowserItems (widget, DBITEM_ID, 1, &item, DBNAME_ID); item++; Drivers_nrows++; /* Process next one */ skip: MEM_FREE (_drv_u8); _drv_u8 = NULL; ret = SQLDriversW (henv, SQL_FETCH_NEXT, drvdesc, sizeof (drvdesc)/sizeof(wchar_t), &len, drvattrs, sizeof (drvattrs)/sizeof(wchar_t), &len1); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO && ret != SQL_NO_DATA) { _iodbcdm_nativeerrorbox (dlg, henv, SQL_NULL_HANDLE, SQL_NULL_HANDLE); goto error; } } error: /* Clean all that */ SQLFreeHandle (SQL_HANDLE_ENV, henv); end: ActivateControl (widget); /* Resize the columns to have a good look */ SetDataBrowserTableViewNamedColumnWidth (widget, DBNAME_ID, colSize[0] + 20); SetDataBrowserTableViewNamedColumnWidth (widget, DBFILE_ID, colSize[1] + 20); SetDataBrowserTableViewNamedColumnWidth (widget, DBVERSION_ID, colSize[2] + 20); SetDataBrowserTableViewNamedColumnWidth (widget, DBSIZE_ID, colSize[3] + 20); SetDataBrowserTableViewNamedColumnWidth (widget, DBDATE_ID, colSize[4] + 20); DrawOneControl (widget); /* Remove the DataBrowser callback */ SetDataBrowserCallbacks (NULL, &dbCallbacks); if(outState) DisposeThemeDrawingState (outState); }