/*-------- * SetDSNAttributes * * Description: Write data source attributes to ODBC.INI * Input : hwnd - Parent window handle (plus globals) * Output : TRUE if successful, FALSE otherwise *-------- */ static BOOL SetDSNAttributes(HWND hwndParent, LPSETUPDLG lpsetupdlg, DWORD *errcode) { LPCSTR lpszDSN; /* Pointer to data source name */ lpszDSN = lpsetupdlg->ci.dsn; if (errcode) *errcode = 0; /* Validate arguments */ if (lpsetupdlg->fNewDSN && !*lpsetupdlg->ci.dsn) return FALSE; /* Write the data source name */ if (!SQLWriteDSNToIni(lpszDSN, lpsetupdlg->lpszDrvr)) { RETCODE ret = SQL_ERROR; DWORD err = SQL_ERROR; char szMsg[SQL_MAX_MESSAGE_LENGTH]; ret = SQLInstallerError(1, &err, szMsg, sizeof(szMsg), NULL); if (hwndParent) { char szBuf[MAXPGPATH]; if (SQL_SUCCESS != ret) { LoadString(s_hModule, IDS_BADDSN, szBuf, sizeof(szBuf)); wsprintf(szMsg, szBuf, lpszDSN); } LoadString(s_hModule, IDS_MSGTITLE, szBuf, sizeof(szBuf)); MessageBox(hwndParent, szMsg, szBuf, MB_ICONEXCLAMATION | MB_OK); } if (errcode) *errcode = err; return FALSE; } /* Update ODBC.INI */ writeDriverCommoninfo(ODBC_INI, lpsetupdlg->ci.dsn, &(lpsetupdlg->ci.drivers)); writeDSNinfo(&lpsetupdlg->ci); /* If the data source name has changed, remove the old name */ if (lstrcmpi(lpsetupdlg->szDSN, lpsetupdlg->ci.dsn)) SQLRemoveDSNFromIni(lpsetupdlg->szDSN); return TRUE; }
/*-------- * ConfigDSN * * Description: ODBC Setup entry point * This entry point is called by the ODBC Installer * (see file header for more details) * Input : hwnd ----------- Parent window handle * fRequest ------- Request type (i.e., add, config, or remove) * lpszDriver ----- Driver name * lpszAttributes - data source attribute string * Output : TRUE success, FALSE otherwise *-------- */ BOOL CALLBACK ConfigDSN(HWND hwnd, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes) { BOOL fSuccess; /* Success/fail flag */ GLOBALHANDLE hglbAttr; LPSETUPDLG lpsetupdlg; /* Allocate attribute array */ hglbAttr = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(SETUPDLG)); if (!hglbAttr) return FALSE; lpsetupdlg = (LPSETUPDLG) GlobalLock(hglbAttr); /* Parse attribute string */ if (lpszAttributes) ParseAttributes(lpszAttributes, lpsetupdlg); /* Save original data source name */ if (lpsetupdlg->ci.dsn[0]) lstrcpy(lpsetupdlg->szDSN, lpsetupdlg->ci.dsn); else lpsetupdlg->szDSN[0] = '\0'; /* Remove data source */ if (ODBC_REMOVE_DSN == fRequest) { /* Fail if no data source name was supplied */ if (!lpsetupdlg->ci.dsn[0]) fSuccess = FALSE; /* Otherwise remove data source from ODBC.INI */ else fSuccess = SQLRemoveDSNFromIni(lpsetupdlg->ci.dsn); } /* Add or Configure data source */ else { /* Save passed variables for global access (e.g., dialog access) */ lpsetupdlg->hwndParent = hwnd; lpsetupdlg->lpszDrvr = lpszDriver; lpsetupdlg->fNewDSN = (ODBC_ADD_DSN == fRequest); lpsetupdlg->fDefault = !lstrcmpi(lpsetupdlg->ci.dsn, INI_DSN); /* * Display the appropriate dialog (if parent window handle * supplied) */ if (hwnd) { /* Display dialog(s) */ fSuccess = (IDOK == DialogBoxParam(s_hModule, MAKEINTRESOURCE(DLG_CONFIG), hwnd, ConfigDlgProc, (LONG) (LPSTR) lpsetupdlg)); } else if (lpsetupdlg->ci.dsn[0]) fSuccess = SetDSNAttributes(hwnd, lpsetupdlg, NULL); else fSuccess = FALSE; } GlobalUnlock(hglbAttr); GlobalFree(hglbAttr); return fSuccess; }
BOOL INSTAPI ConfigDSN ( HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes) { char *dsn = NULL, *connstr = NULL, *curr, *cour = NULL; char dsnread[4096] = { 0 }; char prov[4096] = { 0 }; int driver_type = -1, flags = 0; BOOL retcode = FALSE; UWORD confMode = ODBC_USER_DSN; /* Map the request User/System */ if (fRequest < ODBC_ADD_DSN || fRequest > ODBC_REMOVE_DSN) { SQLPostInstallerError (ODBC_ERROR_INVALID_REQUEST_TYPE, NULL); goto done; } if (!lpszDriver || !STRLEN (lpszDriver)) { SQLPostInstallerError (ODBC_ERROR_INVALID_NAME, NULL); goto done; } /* Retrieve the config mode */ SQLGetConfigMode (&confMode); /* Retrieve the DSN if one exist */ for (curr = (LPSTR) lpszAttributes; curr && *curr; curr += (STRLEN (curr) + 1)) { if (!strncmp (curr, "DSN=", STRLEN ("DSN="))) { dsn = curr + STRLEN ("DSN="); break; } } /* Retrieve the corresponding driver */ if (strstr (lpszDriver, "OpenLink") || strstr (lpszDriver, "Openlink") || strstr (lpszDriver, "oplodbc")) { driver_type = 0; for (curr = (LPSTR) lpszAttributes, cour = prov; curr && *curr; curr += (STRLEN (curr) + 1), cour += (STRLEN (cour) + 1)) { if (!strncasecmp (curr, "Host=", STRLEN ("Host=")) && STRLEN (curr + STRLEN ("Host="))) { STRCPY (cour, curr); flags |= 0x1; continue; } if (!strncasecmp (curr, "ServerType=", STRLEN ("ServerType=")) && STRLEN (curr + STRLEN ("ServerType="))) { STRCPY (cour, curr); flags |= 0x2; continue; } STRCPY (cour, curr); } if (cour && !(flags & 1)) { STRCPY (cour, "Host=localhost\0"); cour += (STRLEN (cour) + 1); } if (cour && !(flags & 2)) { STRCPY (cour, "ServerType=Proxy\0"); cour += (STRLEN (cour) + 1); } if (cour) *cour = 0; } else if ((strstr (lpszDriver, "Virtuoso") || strstr (lpszDriver, "virtodbc"))) driver_type = 1; /* For each request */ switch (fRequest) { case ODBC_ADD_DSN: /* Check if the DSN with this name already exists */ SQLSetConfigMode (confMode); #ifdef WIN32 if (hwndParent && dsn && SQLGetPrivateProfileString ("ODBC 32 bit Data Sources", dsn, "", dsnread, sizeof (dsnread), NULL) && !create_confirm (hwndParent, dsn, "Are you sure you want to overwrite this DSN ?")) #else if (hwndParent && dsn && SQLGetPrivateProfileString ("ODBC Data Sources", dsn, "", dsnread, sizeof (dsnread), NULL) && !create_confirm (hwndParent, dsn, "Are you sure you want to overwrite this DSN ?")) #endif goto done; /* Call the right setup function */ connstr = create_gensetup (hwndParent, dsn, STRLEN (prov) ? prov : lpszAttributes, TRUE); /* Check output parameters */ if (!connstr) { SQLPostInstallerError (ODBC_ERROR_OUT_OF_MEM, NULL); goto done; } if (connstr == (LPSTR) - 1L) goto done; /* Add the DSN to the ODBC Data Sources */ SQLSetConfigMode (confMode); if (!SQLWriteDSNToIni (dsn = connstr + STRLEN ("DSN="), lpszDriver)) goto done; /* Add each keyword and values */ for (curr = connstr; *curr; curr += (STRLEN (curr) + 1)) { if (strncmp (curr, "DSN=", STRLEN ("DSN="))) { STRCPY (dsnread, curr); cour = strchr (dsnread, '='); if (cour) *cour = 0; SQLSetConfigMode (confMode); if (!SQLWritePrivateProfileString (dsn, dsnread, (cour && STRLEN (cour + 1)) ? cour + 1 : NULL, NULL)) goto done; } } break; case ODBC_CONFIG_DSN: if (!dsn || !STRLEN (dsn)) { SQLPostInstallerError (ODBC_ERROR_INVALID_KEYWORD_VALUE, NULL); goto done; } /* Call the right setup function */ connstr = create_gensetup (hwndParent, dsn, STRLEN (prov) ? prov : lpszAttributes, FALSE); /* Check output parameters */ if (!connstr) { SQLPostInstallerError (ODBC_ERROR_OUT_OF_MEM, NULL); goto done; } if (connstr == (LPSTR) - 1L) goto done; /* Compare if the DSN changed */ if (strcmp (connstr + STRLEN ("DSN="), dsn)) { /* Remove the previous DSN */ SQLSetConfigMode (confMode); if (!SQLRemoveDSNFromIni (dsn)) goto done; /* Add the new DSN section */ SQLSetConfigMode (confMode); if (!SQLWriteDSNToIni (dsn = connstr + STRLEN ("DSN="), lpszDriver)) goto done; } /* Add each keyword and values */ for (curr = connstr; *curr; curr += (STRLEN (curr) + 1)) { if (strncmp (curr, "DSN=", STRLEN ("DSN="))) { STRCPY (dsnread, curr); cour = strchr (dsnread, '='); if (cour) *cour = 0; SQLSetConfigMode (confMode); if (!SQLWritePrivateProfileString (dsn, dsnread, (cour && STRLEN (cour + 1)) ? cour + 1 : NULL, NULL)) goto done; } } break; case ODBC_REMOVE_DSN: if (!dsn || !STRLEN (dsn)) { SQLPostInstallerError (ODBC_ERROR_INVALID_KEYWORD_VALUE, NULL); goto done; } /* Just remove the DSN */ SQLSetConfigMode (confMode); if (!SQLRemoveDSNFromIni (dsn)) goto done; break; }; quit: retcode = TRUE; done: if (connstr && connstr != (LPSTR) - 1L && connstr != lpszAttributes && connstr != prov) free (connstr); return retcode; }
bool CPropSheet::UpdateDSN( void ) { char* lpszDSN; char szBuf[ _MAX_PATH]; lpszDSN = aAttr[ KEY_DSN].szAttr; // if the data source name has changed, remove the old name if( !bNewDSN && strcmp( szDSN, lpszDSN) != 0) { SQLRemoveDSNFromIni( szDSN); // remove File Data Source Name DeleteFileDSN( szDSN ); } if(strcmp( szDSN, lpszDSN )!=0) { WritePrivateProfileString( lpszDSN, INI_KDESC, aAttr[ KEY_DESC].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_KSN, aAttr[ KEY_SERVICE_NAME].szAttr, ODBC_INI); // update File DSN lstrcpy(szBuf, lpszDSN ); lstrcat(szBuf, " (not sharable)"); SQLWriteFileDSN( szBuf, "ODBC", "DSN", lpszDSN ); SQLWritePrivateProfileString( lpszDSN, INI_KDESC, aAttr[ KEY_DESC].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_KSN, aAttr[ KEY_SERVICE_NAME].szAttr, ODBC_INI); } // write data source name if( !SQLWriteDSNToIni( lpszDSN, lpszDrvr)) { char szMsg[ MAXPATHLEN]; CString szBuf; szBuf.LoadString(IDS_BADDSN); wsprintf( szMsg, szBuf, lpszDSN); AfxMessageBox( szMsg); return FALSE; } // update ODBC.INI // save the value if the data source is new, edited, or explicitly supplied WritePrivateProfileString( lpszDSN, INI_KDESC, aAttr[ KEY_DESC].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_KSN, aAttr[ KEY_SERVICE_NAME].szAttr, ODBC_INI); // update File DSN lstrcpy(szBuf, lpszDSN ); lstrcat(szBuf, " (not sharable)"); SQLWriteFileDSN( szBuf, "ODBC", "DSN", lpszDSN ); SQLWritePrivateProfileString( lpszDSN, INI_KDESC, aAttr[ KEY_DESC].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_KSN, aAttr[ KEY_SERVICE_NAME].szAttr, ODBC_INI); // the following are the localization (internationalization) attributes WritePrivateProfileString( lpszDSN, INI_ERRORLANG, aAttr[ KEY_ERRORLANG].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_ERRORLANG, aAttr[ KEY_ERRORLANG].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_DATALANG, aAttr[ KEY_DATALANG].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_DATALANG, aAttr[ KEY_DATALANG].szAttr, ODBC_INI); // Association Service (IP Address and Port Number) wsprintf(szBuf, "%s%s/%s", TCP_STR, aAttr[ KEY_IPADDRESS].szAttr, aAttr[ KEY_PORTNUM].szAttr); WritePrivateProfileString( lpszDSN, INI_NETWORK, szBuf, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_NETWORK, szBuf, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_LOGIN, aAttr[ KEY_LOGIN].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_LOGIN, aAttr[ KEY_LOGIN].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_CONNECTION, aAttr[ KEY_CONNECTION].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_CONNECTION, aAttr[ KEY_CONNECTION].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_QUERY, aAttr[ KEY_QUERY].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_QUERY, aAttr[ KEY_QUERY].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_CATALOG, aAttr[ KEY_CATALOG].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_CATALOG, aAttr[ KEY_CATALOG].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_SCHEMA, aAttr[ KEY_SCHEMA].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_SCHEMA, aAttr[ KEY_SCHEMA].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_TRANSLATION_DLL, aAttr[ KEY_TRANSLATION_DLL].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_TRANSLATION_DLL, aAttr[ KEY_TRANSLATION_DLL].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_TRANSLATION_OPTION, aAttr[ KEY_TRANSLATION_OPTION].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_TRANSLATION_OPTION, aAttr[ KEY_TRANSLATION_OPTION].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_FETCH_BUFFER_SIZE, aAttr[ KEY_FETCH_BUFFER_SIZE].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_FETCH_BUFFER_SIZE, aAttr[ KEY_FETCH_BUFFER_SIZE].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_REPLACEMENT_CHAR, aAttr[ KEY_REPLACEMENT_CHAR].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_REPLACEMENT_CHAR, aAttr[ KEY_REPLACEMENT_CHAR].szAttr, ODBC_INI); WritePrivateProfileString( lpszDSN, INI_COMPRESSION, aAttr[ KEY_COMPRESSION].szAttr, ODBC_INI); SQLWritePrivateProfileString( lpszDSN, INI_COMPRESSION, aAttr[ KEY_COMPRESSION].szAttr, ODBC_INI); WriteTraceRegistry( INI_TRACE_FILE,aAttr[ KEY_TRACE_FILE].szAttr); WriteTraceRegistry( INI_TRACE_FLAGS,aAttr[ KEY_TRACE_FLAGS].szAttr); return TRUE; }
/** * Add, remove, or modify a data source * \param hwndParent parent for dialog, NULL for batch ops * \param fRequest request type * \param lpszDriver driver name (for humans, not DLL name) * \param lpszAttributes attribute list */ BOOL INSTAPI ConfigDSN(HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes) { int result; DSNINFO *di; const char *errmsg; /* * Initialize Windows sockets. This is necessary even though * ConfigDSN() only looks up addresses and names, and never actually * uses any sockets. */ INITSOCKET(); /* Create a blank login struct */ di = alloc_dsninfo(); /* * Parse the attribute string. If this contains a DSN name, then it * also reads the current parameters of that DSN. */ parse_wacky_dsn_string(lpszAttributes, di); /* Maybe allow the user to edit it */ if (hwndParent && fRequest != ODBC_REMOVE_DSN) { result = DialogBoxParam(hinstFreeTDS, MAKEINTRESOURCE(IDD_DSN), hwndParent, (DLGPROC) DSNDlgProc, (LPARAM) di); if (result < 0) { DWORD errorcode = GetLastError(); char buf[1000]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorcode, 0, buf, 1000, NULL); } /* if user hit [Cancel] then clean up and return FALSE */ if (result == 0) { goto Fail; } } switch (fRequest) { case ODBC_ADD_DSN: errmsg = validate(di); if (errmsg != NULL) { SQLPostInstallerError(ODBC_ERROR_REQUEST_FAILED, errmsg); goto Fail; } if (!SQLWriteDSNToIni(tds_dstr_cstr(&di->dsn), lpszDriver)) { goto Fail; } if (!write_all_strings(di)) { goto Fail; } break; case ODBC_CONFIG_DSN: errmsg = validate(di); if (errmsg != NULL) { SQLPostInstallerError(ODBC_ERROR_REQUEST_FAILED, errmsg); goto Fail; } /* * if the DSN name has changed, then delete the old entry and * add the new one. */ if (strcasecmp(tds_dstr_cstr(&di->origdsn), tds_dstr_cstr(&di->dsn))) { if (!SQLRemoveDSNFromIni(tds_dstr_cstr(&di->origdsn)) || !SQLWriteDSNToIni(tds_dstr_cstr(&di->dsn), lpszDriver)) { goto Fail; } } if (!write_all_strings(di)) { goto Fail; } break; case ODBC_REMOVE_DSN: if (!SQLRemoveDSNFromIni(tds_dstr_cstr(&di->dsn))) { goto Fail; } break; } /* Clean up and return TRUE, indicating that the change took place */ free_dsninfo(di); DONESOCKET(); return TRUE; Fail: free_dsninfo(di); DONESOCKET(); return FALSE; }
BOOL SQLWriteDSNToIni( LPCSTR pszDSN, LPCSTR pszDriver ) { HINI hIni; char szFileName[ODBC_FILENAME_MAX+1]; SQLRemoveDSNFromIni( pszDSN ); /* SANITY CHECKS */ if ( pszDSN == NULL ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); return FALSE; } if ( pszDSN[0] == '\0' ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); return FALSE; } if ( (strcasecmp( pszDSN, "DEFAULT" ) != 0 ) && (pszDriver == NULL ) ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_NAME, "" ); return FALSE; } if ( (strcasecmp( pszDSN, "DEFAULT" ) != 0 ) && (pszDriver[0] == '\0') ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_NAME, "" ); return FALSE; } if ( SQLValidDSN( pszDSN ) == FALSE ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_DSN, "" ); return FALSE; } /* OK */ if ( _odbcinst_ConfigModeINI( szFileName ) == FALSE ) { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_REQUEST_FAILED, "" ); return FALSE; } #ifdef __OS2__ if ( iniOpen( &hIni, szFileName, "#;", '[', ']', '=', TRUE, 1L ) != INI_SUCCESS ) #else if ( iniOpen( &hIni, szFileName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS ) #endif { inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_REQUEST_FAILED, "" ); return FALSE; } iniObjectInsert( hIni, (char *)pszDSN ); if ( pszDriver != NULL ) { iniPropertyInsert( hIni, "Driver", (char *)pszDriver ); } if ( iniCommit( hIni ) != INI_SUCCESS ) { iniClose( hIni ); inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_REQUEST_FAILED, "" ); return FALSE; } iniClose( hIni ); return TRUE; }
/* {{{ MADB_SaveDSN */ my_bool MADB_SaveDSN(MADB_Dsn *Dsn) { int i= 1; char Value[32]; my_bool ret; DWORD ErrNum; if (!SQLValidDSN(Dsn->DSNName)) { strcpy_s(Dsn->ErrorMsg, SQL_MAX_MESSAGE_LENGTH, "Invalid Data Source Name"); return FALSE; } if (!SQLRemoveDSNFromIni(Dsn->DSNName)) { SQLInstallerError(1,&ErrNum, Dsn->ErrorMsg, SQL_MAX_MESSAGE_LENGTH, NULL); return FALSE; } if (!SQLWriteDSNToIni(Dsn->DSNName, Dsn->Driver)) { SQLInstallerError(1,&ErrNum, Dsn->ErrorMsg, SQL_MAX_MESSAGE_LENGTH, NULL); return FALSE; } while(DsnKeys[i].DsnKey) { ret= TRUE; switch(DsnKeys[i].Type){ case DSN_TYPE_BOOL: ret= SQLWritePrivateProfileString(Dsn->DSNName, DsnKeys[i].DsnKey, *(my_bool *)((char *)Dsn + DsnKeys[i].DsnOffset) ? "1" : "0", "ODBC.INI"); break; case DSN_TYPE_INT: { my_snprintf(Value ,32, "%d", *(int *)((char *)Dsn + DsnKeys[i].DsnOffset)); ret= SQLWritePrivateProfileString(Dsn->DSNName, DsnKeys[i].DsnKey, Value, "ODBC.INI"); } break; case DSN_TYPE_STRING: case DSN_TYPE_COMBO: { char *Val= *(char **)((char *)Dsn + DsnKeys[i].DsnOffset); if (Val && Val[0]) ret= SQLWritePrivateProfileString(Dsn->DSNName, DsnKeys[i].DsnKey, Val, "ODBC.INI"); } break; } if (!ret) { SQLInstallerError(1,&ErrNum, Dsn->ErrorMsg, SQL_MAX_MESSAGE_LENGTH, NULL); return FALSE; } i++; } /* Save Options */ my_snprintf(Value ,32, "%d", Dsn->Options); if (!(ret= SQLWritePrivateProfileString(Dsn->DSNName, "OPTIONS", Value, "ODBC.INI"))) { SQLInstallerError(1,&ErrNum, Dsn->ErrorMsg, SQL_MAX_MESSAGE_LENGTH, NULL); return FALSE; } return TRUE; }
/* Add, edit, or remove a Data Source Name (DSN). This function is called by "Data Source Administrator" on Windows, or similar application on Unix. */ BOOL INSTAPI ConfigDSNW(HWND hWnd, WORD nRequest, LPCWSTR pszDriver, LPCWSTR pszAttributes) { DataSource *ds= ds_new(); BOOL rc= TRUE; Driver *driver= NULL; SQLWCHAR *origdsn= NULL; if (pszAttributes && *pszAttributes) { SQLWCHAR delim= ';'; #ifdef _WIN32 /* if there's no ;, then it's most likely null-delimited NOTE: the double null-terminated strings are not working * with UnixODBC-GUI-Qt (posted a bug ) */ if (!sqlwcharchr(pszAttributes, delim)) delim= 0; #endif if (ds_from_kvpair(ds, pszAttributes, delim)) { SQLPostInstallerError(ODBC_ERROR_INVALID_KEYWORD_VALUE, W_INVALID_ATTR_STR); rc= FALSE; goto exitConfigDSN; } if (ds_lookup(ds) && nRequest != ODBC_ADD_DSN) { /* ds_lookup() will already set SQLInstallerError */ rc= FALSE; goto exitConfigDSN; } origdsn= sqlwchardup(ds->name, SQL_NTS); } switch (nRequest) { case ODBC_ADD_DSN: driver= driver_new(); memcpy(driver->name, pszDriver, (sqlwcharlen(pszDriver) + 1) * sizeof(SQLWCHAR)); if (driver_lookup(driver)) { rc= FALSE; break; } if (hWnd) { /* hWnd means we will at least try to prompt, at which point the driver lib will be replaced by the name */ ds_set_strattr(&ds->driver, driver->lib); } else { /* no hWnd is a likely a call from an app w/no prompting so we put the driver name immediately */ ds_set_strattr(&ds->driver, driver->name); } case ODBC_CONFIG_DSN: #ifdef _WIN32 /* for windows, if hWnd is NULL, we try to add the dsn with what information was given */ if (!hWnd || ShowOdbcParamsDialog(ds, hWnd, FALSE) == 1) #else if (ShowOdbcParamsDialog(ds, hWnd, FALSE) == 1) #endif { /* save datasource */ if (ds_add(ds)) rc= FALSE; /* if the name is changed, remove the old dsn */ if (origdsn && memcmp(origdsn, ds->name, (sqlwcharlen(origdsn) + 1) * sizeof(SQLWCHAR))) SQLRemoveDSNFromIni(origdsn); } break; case ODBC_REMOVE_DSN: if (SQLRemoveDSNFromIni(ds->name) != TRUE) rc= FALSE; break; } exitConfigDSN: x_free(origdsn); ds_delete(ds); if (driver) driver_delete(driver); return rc; }