/* write back contents of scheduler queue to database (internal function) */ static int ta_flush(ta_t *ta, bool wr) { int ret = TA_OK; ta_iter_t *tmp, *iter = ta->head; while (iter) { if (wr) { switch (iter->kind) { case TA_DELETE: ret |= ds_delete(iter->vhandle, iter->word); break; case TA_WRITE: set_date(iter->dsvval->date); /* wrong date otherwise! */ ret |= ds_write(iter->vhandle, iter->word, iter->dsvval); break; } } word_free(iter->word); xfree(iter->dsvval); tmp = iter; iter = iter->next; xfree(tmp); } xfree(ta); return ret; }
/* Entry point for GUI prompting from SQLDriverConnect(). */ BOOL Driver_Prompt(HWND hWnd, SQLWCHAR *instr, SQLUSMALLINT completion, SQLWCHAR *outstr, SQLSMALLINT outmax, SQLSMALLINT *outlen) { DataSource *ds= ds_new(); BOOL rc= FALSE; /* parse the attr string, dsn lookup will have already been done in the driver */ if (instr && *instr) { if (ds_from_kvpair(ds, instr, (SQLWCHAR)';')) { rc= FALSE; goto exit; } } /* Show the dialog and handle result */ if (ShowOdbcParamsDialog(ds, hWnd, TRUE) == 1) { int len; /* serialize to outstr */ if ((len= ds_to_kvpair(ds, outstr, outmax, (SQLWCHAR)';')) == -1) { /* truncated, up to caller to see outmax < *outlen */ if (outlen) { *outlen= ds_to_kvpair_len(ds); } /* Prevent access violation if outstr is NULL */ if (outstr) { outstr[outmax]= 0; } } else if (outlen) *outlen= len; rc= TRUE; } exit: ds_delete(ds); return rc; }
/* 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; }