BOOL WritePrivateProfileString (LPCSTR lpszSection, LPCSTR lpszEntry, LPCSTR lpszString, LPCSTR lpszFilename) { BOOL retcode = FALSE; PCONFIG pCfg = NULL; /* Check Input parameters */ if (lpszSection == NULL || *lpszSection == '\0') { PUSH_ERROR (ODBC_ERROR_INVALID_REQUEST_TYPE); goto fail; } /* If error during reading the file */ if (_iodbcdm_cfg_search_init (&pCfg, lpszFilename, TRUE)) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto fail; } /* Check if the section must be deleted */ if (!lpszEntry) { _iodbcdm_cfg_write (pCfg, (LPSTR) lpszSection, NULL, NULL); goto done; } /* Check if the entry must be deleted */ if (!lpszString) { _iodbcdm_cfg_write (pCfg, (LPSTR) lpszSection, (LPSTR) lpszEntry, NULL); goto done; } /* Else add the entry */ _iodbcdm_cfg_write (pCfg, (LPSTR) lpszSection, (LPSTR) lpszEntry, (LPSTR) lpszString); done: if (!_iodbcdm_cfg_commit (pCfg)) retcode = TRUE; else { PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED); goto fail; } fail: if (pCfg) _iodbcdm_cfg_done (pCfg); return retcode; }
BOOL INSTAPI SQLRemoveTranslator (LPCSTR lpszTranslator, LPDWORD lpdwUsageCount) { BOOL retcode = FALSE; PCONFIG pCfg; /* Check input parameter */ CLEAR_ERROR (); if (!lpszTranslator || !STRLEN (lpszTranslator)) { PUSH_ERROR (ODBC_ERROR_INVALID_NAME); goto quit; } if (_iodbcdm_cfg_search_init (&pCfg, "odbcinst.ini", FALSE)) { PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED); goto quit; } /* deletes the translator */ _iodbcdm_cfg_write (pCfg, "ODBC Translators", (LPSTR) lpszTranslator, NULL); _iodbcdm_cfg_write (pCfg, (LPSTR) lpszTranslator, NULL, NULL); if (_iodbcdm_cfg_commit (pCfg)) { PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED); goto done; } retcode = TRUE; done: _iodbcdm_cfg_done (pCfg); quit: return retcode; }
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")) { /* adds a DSN=Driver to the [ODBC data sources] section */ #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; } } /* deletes the DSN section in odbc.ini */ if (_iodbcdm_cfg_write (pCfg, (LPSTR) lpszDSN, NULL, NULL)) { PUSH_ERROR (ODBC_ERROR_REQUEST_FAILED); goto done; } /* gets the file of the driver if lpszDriver is a valid description */ 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; } } /* adds a [DSN] section with Driver key */ 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 SQLRemoveDriver (LPCSTR lpszDriver, BOOL fRemoveDSN, LPDWORD lpdwUsageCount) { /*char *szDriverFile = NULL; */ BOOL retcode = FALSE; PCONFIG pCfg = NULL, pInstCfg = NULL; LPSTR entries = (LPSTR) malloc (sizeof (char) * 65535), curr; int len = 0, i = 0; /* Check input parameters */ CLEAR_ERROR (); if (!lpszDriver || !STRLEN (lpszDriver)) { PUSH_ERROR (ODBC_ERROR_INVALID_NAME); goto quit; } /* Else go through user/system odbcinst.ini */ switch (configMode) { case ODBC_BOTH_DSN: case ODBC_USER_DSN: wSystemDSN = USERDSN_ONLY; break; case ODBC_SYSTEM_DSN: wSystemDSN = SYSTEMDSN_ONLY; break; } if (_iodbcdm_cfg_search_init (&pCfg, "odbc.ini", FALSE)) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto done; } if (_iodbcdm_cfg_search_init (&pInstCfg, "odbcinst.ini", FALSE)) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto done; } if (fRemoveDSN) { #ifdef WIN32 if (entries && (len = _iodbcdm_list_entries (pCfg, "ODBC 32 bit Data Sources", entries, 65535))) #else if (entries && (len = _iodbcdm_list_entries (pCfg, "ODBC Data Sources", entries, 65535))) #endif { for (curr = entries; i < len; i += (STRLEN (curr) + 1), curr += (STRLEN (curr) + 1)) { int nCursor = pCfg->cursor; if (_iodbcdm_cfg_rewind (pCfg)) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto done; } #ifdef WIN32 if (_iodbcdm_cfg_find (pCfg, "ODBC 32 bit Data Sources", curr)) #else if (_iodbcdm_cfg_find (pCfg, "ODBC Data Sources", curr)) #endif { if (_iodbcdm_cfg_rewind (pCfg)) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto done; } pCfg->cursor = nCursor; continue; } if (!strcmp (pCfg->value, lpszDriver)) { if (_iodbcdm_cfg_write (pCfg, curr, NULL, NULL)) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto done; } #ifdef WIN32 if (_iodbcdm_cfg_write (pCfg, "ODBC 32 bit Data Sources", curr, NULL)) #else if (_iodbcdm_cfg_write (pCfg, "ODBC Data Sources", curr, NULL)) #endif { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto done; } } pCfg->cursor = nCursor; } } } if (_iodbcdm_cfg_write (pInstCfg, (char *) lpszDriver, NULL, NULL)) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto done; } #ifdef WIN32 if (_iodbcdm_cfg_write (pInstCfg, "ODBC 32 bit Drivers", lpszDriver, NULL)) #else if (_iodbcdm_cfg_write (pInstCfg, "ODBC Drivers", (LPSTR) lpszDriver, NULL)) #endif { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto done; } if (_iodbcdm_cfg_commit (pCfg) || _iodbcdm_cfg_commit (pInstCfg)) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto done; } retcode = TRUE; done: if (pCfg) _iodbcdm_cfg_done (pCfg); if (pInstCfg) _iodbcdm_cfg_done (pInstCfg); if (entries) free (entries); quit: 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 SQLInstallTranslatorEx (LPCSTR lpszTranslator, LPCSTR lpszPathIn, LPSTR lpszPathOut, WORD cbPathOutMax, WORD * pcbPathOut, WORD fRequest, LPDWORD lpdwUsageCount) { PCONFIG pCfg = NULL, pOdbcCfg = NULL; BOOL retcode = FALSE; CLEAR_ERROR (); if (lpszPathIn && access (lpszPathIn, R_OK | W_OK | X_OK)) { PUSH_ERROR (ODBC_ERROR_INVALID_PATH); goto quit; } switch (fRequest) { case ODBC_INSTALL_INQUIRY: if (lpszPathIn) { if (pcbPathOut) *pcbPathOut = STRLEN (lpszPathIn); retcode = TRUE; } else retcode = InstallDriverPathLength (pcbPathOut, "ODBCTRANSLATORS"); goto quit; case ODBC_INSTALL_COMPLETE: break; default: PUSH_ERROR (ODBC_ERROR_INVALID_REQUEST_TYPE); goto quit; } /* Check input parameters */ if (!lpszTranslator || !STRLEN (lpszTranslator)) { PUSH_ERROR (ODBC_ERROR_INVALID_PARAM_SEQUENCE); goto quit; } if (!lpszPathOut || !cbPathOutMax) { PUSH_ERROR (ODBC_ERROR_INVALID_BUFF_LEN); goto quit; } /* Write the out path */ if (!InstallDriverPath (lpszPathOut, cbPathOutMax, pcbPathOut, "ODBCTRANSLATORS")) goto quit; /* Else go through user/system odbcinst.ini */ switch (configMode) { case ODBC_BOTH_DSN: case ODBC_USER_DSN: wSystemDSN = USERDSN_ONLY; break; case ODBC_SYSTEM_DSN: wSystemDSN = SYSTEMDSN_ONLY; break; } if (_iodbcdm_cfg_search_init (&pCfg, "odbcinst.ini", TRUE)) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto quit; } if (_iodbcdm_cfg_search_init (&pOdbcCfg, "odbc.ini", TRUE)) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); pOdbcCfg = NULL; goto done; } if (!install_from_string (pCfg, pOdbcCfg, (char *) lpszTranslator, FALSE)) { PUSH_ERROR (ODBC_ERROR_INVALID_KEYWORD_VALUE); goto done; } if (_iodbcdm_cfg_commit (pCfg) || _iodbcdm_cfg_commit (pOdbcCfg)) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto done; } retcode = TRUE; done: _iodbcdm_cfg_done (pCfg); if (pOdbcCfg) _iodbcdm_cfg_done (pOdbcCfg); quit: wSystemDSN = USERDSN_ONLY; configMode = ODBC_BOTH_DSN; return retcode; }
static int _fix_home_odbc(PCONFIG pconf, char *lib_odbcini, int bIsInst) { char pathbuf[1024]; char *home_odbcini = _getinifilename (pathbuf, sizeof (pathbuf), bIsInst, TRUE); if (home_odbcini && lib_odbcini) { PCONFIG pCfg = NULL; stat_t home_stat; stat_t lib_stat; if (access(home_odbcini, R_OK)!=0) { symlink(lib_odbcini, home_odbcini); return 0; } else { char buf[4096]; int rc; if (stat(home_odbcini, &home_stat)) return -1; /* * if $HOME/.odbc[inst].ini is link * to $HOME/Library/ODBC/odbc[inst].ini */ if ((home_stat.st_mode & S_IFLNK) && (rc = readlink(home_odbcini, buf, sizeof(buf)))>0) { buf[rc]=0; if (strcmp(buf,lib_odbcini)==0) return 0; /* OK $HOME/.odbc.ini is linked to odbc.ini */ } if (stat(lib_odbcini, &lib_stat)) return -1; /* if $HOME/Library/ODBC/odbc[inst].ini is link * to $HOME/.odbc[inst].ini */ if ((lib_stat.st_mode & S_IFLNK) && (rc = readlink(lib_odbcini, buf, sizeof(buf)))>0) { buf[rc]=0; if (strcmp(buf,home_odbcini)==0) return 0; /* OK $HOME/.odbc.ini is linked to odbc.ini */ } } /* * import $HOME/.odbc[inst].ini and replace it with link * to $HOME/Library/ODBC/odbc[inst].ini */ if (!_iodbcdm_cfg_init (&pCfg, home_odbcini, FALSE)) { int len = 0; char root_buf[4096] = {0}; char *proot; char *root_val = NULL; int was_error = FALSE; char *root_lst = bIsInst?DRV_LST:DSN_LST; /* Move DSN/Driver list*/ len = _iodbcdm_list_entries (pCfg, root_lst, root_buf, sizeof(root_buf)); if (len >0) { /* move [ODBC Data Sources] section */ for(proot = root_buf; *proot; proot += STRLEN(proot) + 1) { if (!_iodbcdm_cfg_find (pCfg, root_lst, proot)) root_val = pCfg->value; else root_val = NULL; if (!proot || !root_val) continue; if (_iodbcdm_cfg_write (pconf, root_lst, proot, root_val) || _iodbcdm_cfg_commit (pconf)) { was_error = TRUE; break; } } /* move DSN defines */ for(proot = root_buf; *proot; proot += STRLEN(proot) + 1) { char buffer[4096]; char *pattr; char *pattr_val; len = _iodbcdm_list_entries (pCfg, proot, buffer, sizeof(buffer)); if (len>0) { /* move [DSN] description */ for(pattr = buffer; *pattr; pattr += STRLEN(pattr) + 1) { if (!_iodbcdm_cfg_find (pCfg, proot, pattr)) pattr_val = pCfg->value; else pattr_val = NULL; if (!pattr || !pattr_val) continue; if (_iodbcdm_cfg_write (pconf, proot, pattr, pattr_val) || _iodbcdm_cfg_commit (pconf)) { was_error = TRUE; break; } } } } } if (was_error) return -1; } /* make link */ if (access(home_odbcini, R_OK)==0) { if (unlink(home_odbcini)) return -1; } if (symlink(lib_odbcini, home_odbcini)) return -1; } return 0; }