int ShowOdbcParamsDialog(DataSource* params, HWND ParentWnd, BOOL isPrompt) { assert(!BusyIndicator); InitStaticValues(); pParams= params; pCaption= L"MySQL Connector/ODBC Data Source Configuration"; g_isPrompt= isPrompt; /* If prompting (with a DSN name), or not prompting (add/edit DSN), we translate the lib path to the actual driver name. */ if (params->name || !isPrompt) { Driver *driver= driver_new(); params->driver && memcpy(driver->lib, params->driver, (sqlwcharlen(params->driver) + 1) * sizeof(SQLWCHAR)); /* TODO Driver lookup is done in driver too, do we really need it there? */ if (!*driver->lib || driver_lookup_name(driver)) { wchar_t msg[256]; swprintf(msg, 256, L"Failure to lookup driver entry at path '%ls'", driver->lib); MessageBox(ParentWnd, msg, L"Cannot find driver entry", MB_OK); driver_delete(driver); return 0; } ds_set_strattr(¶ms->driver, driver->name); driver_delete(driver); } DialogBox(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1), ParentWnd, (DLGPROC)FormMain_DlgProc); BusyIndicator= false; return OkPressed; }
/* 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; }