/*------------------------------------------------------------*/ boolean io_fget_ds (FILE *file, dynstring *ds) /* Read one complete line (up to, but excluding, the '\n' character). Return TRUE if successful. */ { int ch; /* pre */ assert (file); assert (ds); assert (ds_valid_state (ds)); ds_reset (ds); while ((ch = fgetc (file))) { if (ch == '\n') break; if (ch == EOF) break; ds_add (ds, ch); } 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; }