RETCODE INSTAPI SQLInstallerErrorW (WORD iError, DWORD * pfErrorCode, LPWSTR lpszErrorMsg, WORD cbErrorMsgMax, WORD * pcbErrorMsg) { char *_errormsg_u8 = NULL; RETCODE retcode = SQL_ERROR; if (cbErrorMsgMax > 0) { if ((_errormsg_u8 = malloc (cbErrorMsgMax * UTF8_MAX_CHAR_LEN + 1)) == NULL) { PUSH_ERROR (ODBC_ERROR_OUT_OF_MEM); goto done; } } retcode = SQLInstallerError (iError, pfErrorCode, _errormsg_u8, cbErrorMsgMax * UTF8_MAX_CHAR_LEN, pcbErrorMsg); if (retcode != SQL_ERROR) { dm_StrCopyOut2_U8toW (_errormsg_u8, lpszErrorMsg, cbErrorMsgMax, pcbErrorMsg); } done: MEM_FREE (_errormsg_u8); return retcode; }
void OdbcConnectionUtil::SetupExcelDSN() { char module[MAX_PATH]; char teststr[1024]; DWORD nchars; char* last; m_SetupExcelDSNdone = true; nchars = GetModuleFileName (NULL, module, MAX_PATH); if (0 != nchars) { // scan the string for the last occurrence of a slash last = strrchr (module, '\\'); if (NULL != last) { last++; // move past the slash *last = '\0'; // null terminate it there sprintf (teststr, "DSN=%s%cDescription=Test Excel datastore for FDO ODBC provider%cDBQ=%sMSTest.xls%c%c", (const char*)(FdoStringP)m_SetupValues->GetPropertyValue( L"DSNExcel" ), '\0', '\0', module, '\0', '\0'); if (!SQLConfigDataSource (NULL, ODBC_ADD_DSN, (const char*)EXCEL_ODBC_DRIVER_NAME, teststr)) { DWORD error; WORD count; SQLInstallerError (1, &error, teststr, sizeof (teststr), &count); printf (teststr); throw FdoException::Create (L"Excel DSN setup failed"); } } } }
void OdbcConnectionUtil::SetupDbaseDSN() { const char* module = GetTestDataPath(); if (module != NULL && module[0] != '\0') { // Remove the slash at the end of string char newModule[MAX_PATH]; strcpy(newModule, module); int nLen = strlen(newModule); if (nLen > 0 && newModule[nLen-1] == '\\') newModule[nLen-1] = '\0'; char teststr[1024]; m_SetupDbaseDSNdone = true; FdoStringP dsnNameP = m_SetupValues->GetPropertyValue( L"DSNDbase" ); const char * dsnName = (const char*)dsnNameP; sprintf (teststr, "DSN=%s%cDescription=Test dBASE datastore for FDO ODBC provider%cDefaultDir=%s%c%c", dsnName, '\0', '\0', newModule, '\0', '\0'); if (!SQLConfigDataSource (NULL, ODBC_ADD_DSN, (const char*)DBASE_ODBC_DRIVER_NAME, teststr)) { DWORD error; WORD count; SQLInstallerError (1, &error, teststr, sizeof (teststr), &count); printf (teststr); throw FdoException::Create (L"dBASE DSN setup failed"); } } }
char* COdbcDS::GetLastInstallerError() { RETCODE retVal = SQL_SUCCESS; DWORD fErrorCode; TCHAR szErrorMsg[300] = ""; WORD errorSize; int recNum = 1; int length = 0; char* msg = NULL; retVal = SQLInstallerError(recNum, &fErrorCode, szErrorMsg, sizeof(szErrorMsg), &errorSize); while ((retVal == SQL_SUCCESS || retVal == SQL_SUCCESS_WITH_INFO) && recNum < 9) { recNum++; length = strlen((const char*)szErrorMsg); // New message if (msg == NULL) { msg = (char*) malloc(sizeof(char) * (length + 1)); strcpy(msg, (const char*)szErrorMsg); } // Append to message else { int length2 = strlen((const char*)msg); // include room for null and new line. char* tmp = (char*) malloc(sizeof(char) * (length + length2 + 2)); strcpy(tmp, msg); strcat(tmp, "\n"); strcat(tmp, (const char*)szErrorMsg); free(msg); msg = tmp; } retVal = SQLInstallerError(recNum, &fErrorCode, szErrorMsg, sizeof(szErrorMsg), &errorSize); } return msg; }
void OdbcConnectionUtil::SetupMySqlDSN() { // Get the name of MySQL ODBC Driver char driverDesc[1024]; char driverAttrs[1024]; char theMySQLDriverName[1024] = ""; BOOL ret = false; SQLRETURN rc = SQL_ERROR; SQLHENV sqlenv = SQL_NULL_HENV; rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HENV, &sqlenv); if ( SQLRETURN_OK(rc) ) rc = SQLSetEnvAttr(sqlenv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); if ( SQLRETURN_OK(rc) ) { SQLUSMALLINT direction = SQL_FETCH_FIRST; SQLSMALLINT driverDescLength = 0; SQLSMALLINT driverAttrsLength = 0; do { driverDescLength = 0; driverAttrsLength = 0; rc = SQLDrivers(sqlenv, direction, (SQLCHAR *) driverDesc, (SQLSMALLINT) sizeof(driverDesc), &driverDescLength, (SQLCHAR *) driverAttrs, (SQLSMALLINT) sizeof(driverAttrs), &driverAttrsLength); if (SQLRETURN_OK(rc)) { if (NULL != strstr(driverDesc, "MySQL")) strcpy(theMySQLDriverName, driverDesc); } direction = SQL_FETCH_NEXT; } while ( SQLRETURN_OK(rc) && SQL_NO_DATA != rc && '\0' == theMySQLDriverName[0] ); } if (sqlenv != SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, sqlenv); if ('\0' != theMySQLDriverName[0]) MYSQL_ODBC_DRIVER_NAME = theMySQLDriverName; char teststr[1024]; sprintf (teststr, "DSN=%s%cDescription=Test MySql DSN for FDO ODBC provider%cSERVER=%s%cDATABASE=%ls%cOPTION=3%c%c", (const char*)(FdoStringP)m_SetupValues->GetPropertyValue( L"DSNMySql" ), '\0','\0', (const char*)(FdoStringP)m_SetupValues->GetPropertyValue( L"serviceMySql" ), '\0', (FdoString*)(UnitTestUtil::GetEnviron("datastore", L"")), '\0', '\0', '\0'); m_SetupMySqlDSNdone = true; #if 0 if (!SQLConfigDataSource (NULL, ODBC_ADD_DSN, (const char*)MYSQL_ODBC_DRIVER_NAME, teststr)) { DWORD error; WORD count; SQLInstallerError (1, &error, teststr, sizeof (teststr), &count); printf (teststr); throw FdoException::Create (L"MySql DSN setup failed"); } #endif }
void OdbcConnectionUtil::TeardownSqlServerDSN() { char pString[SQL_MAX_MESSAGE_LENGTH]; DWORD error; WORD count; sprintf( pString, "DSN=%s%c%c", (const char*)(FdoStringP)m_SetupValues->GetPropertyValue( L"DSNSqlServer" ), '\0', '\0'); if (!SQLConfigDataSource (NULL, ODBC_REMOVE_DSN, "SQL Server", pString)) { SQLInstallerError (1, &error, pString, sizeof (pString), &count); printf ("\nSqlServer DSN teardown failed:\n"); printf (pString); } }
void ThrowLastSetupError() { DWORD code; char msg[BUFFER_SIZE]; SQLInstallerError(1, &code, msg, sizeof(msg), NULL); std::stringstream buf; buf << "Message: \"" << msg << "\", Code: " << code; throw IgniteError(IgniteError::IGNITE_ERR_GENERIC, buf.str().c_str()); }
static void test_SQLInstallerError(void) { RETCODE sql_ret; /* MSDN states that the error number should be between 1 and 8. Passing 0 is an error */ sql_ret = SQLInstallerError(0, NULL, NULL, 0, NULL); ok(sql_ret == SQL_ERROR, "SQLInstallerError(0...) failed with %d instead of SQL_ERROR\n", sql_ret); /* However numbers greater than 8 do not return SQL_ERROR. * I am currently unsure as to whether it should return SQL_NO_DATA or "the same as for error 8"; * I have never been able to generate 8 errors to test it */ sql_ret = SQLInstallerError(65535, NULL, NULL, 0, NULL); ok(sql_ret == SQL_NO_DATA, "SQLInstallerError(>8...) failed with %d instead of SQL_NO_DATA\n", sql_ret); /* Force an error to work with. This should generate ODBC_ERROR_INVALID_BUFF_LEN */ ok(!SQLGetInstalledDrivers(0, 0, 0), "Failed to force an error for testing\n"); sql_ret = SQLInstallerError(2, NULL, NULL, 0, NULL); ok(sql_ret == SQL_NO_DATA, "Too many errors when forcing an error for testing\n"); /* Null pointers are acceptable in all obvious places */ sql_ret = SQLInstallerError(1, NULL, NULL, 0, NULL); ok(sql_ret == SQL_SUCCESS_WITH_INFO, "SQLInstallerError(null addresses) failed with %d instead of SQL_SUCCESS_WITH_INFO\n", sql_ret); }
/*-------- * SetDSNAttributes * * Description: Write data source attributes to ODBC.INI * Input : hwnd - Parent window handle (plus globals) * Output : TRUE if successful, FALSE otherwise *-------- */ BOOL INTFUNC 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]; #if (ODBCVER >= 0x0300) ret = SQLInstallerError(1, &err, szMsg, sizeof(szMsg), NULL); #endif /* ODBCVER */ 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; }
void OdbcConnectionUtil::TeardownMySqlDSN() { #if 0 char pString[SQL_MAX_MESSAGE_LENGTH]; DWORD error; WORD count; sprintf( pString, "DSN=%s%c%c", (const char*)(FdoStringP)m_SetupValues->GetPropertyValue( L"DSNMySql" ), '\0', '\0'); if (!SQLConfigDataSource (NULL, ODBC_REMOVE_DSN, (const char*)MYSQL_ODBC_DRIVER_NAME, pString)) { SQLInstallerError (1, &error, pString, sizeof (pString), &count); printf ("\nMySql DSN teardown failed:\n"); printf (pString); } #endif }
void OdbcConnectionUtil::TeardownDbaseDSN() { char pString[SQL_MAX_MESSAGE_LENGTH]; DWORD error; WORD count; FdoStringP dsnNameP = m_SetupValues->GetPropertyValue( L"DSNDbase" ); const char * dsnName = (const char*)dsnNameP; sprintf( pString, "DSN=%s%c%c", dsnName, '\0', '\0'); if (!SQLConfigDataSource (NULL, ODBC_REMOVE_DSN, (const char*)DBASE_ODBC_DRIVER_NAME, pString)) { SQLInstallerError (1, &error, pString, sizeof (pString), &count); printf ("\ndBASE DSN teardown failed:\n"); printf (pString); } }
void OdbcConnectionUtil::SetupSqlServerDSN() { char teststr[1024]; sprintf (teststr, "DSN=%s%cDescription=Test SqlServer DSN for FDO ODBC provider%cSERVER=%s%cDATABASE=%ls%c%c", (const char*)(FdoStringP)m_SetupValues->GetPropertyValue( L"DSNSqlServer" ), '\0', '\0', (const char*)(FdoStringP)m_SetupValues->GetPropertyValue( L"serviceSqlServer" ), '\0', (FdoString*)(UnitTestUtil::GetEnviron("datastore", L"")), '\0', '\0', '\0'); m_SetupSqlServerDSNdone = true; if (!SQLConfigDataSource (NULL, ODBC_ADD_DSN, "SQL Server", teststr)) { DWORD error; WORD count; SQLInstallerError (1, &error, teststr, sizeof (teststr), &count); printf (teststr); throw FdoException::Create (L"SqlServer DSN setup failed"); } }
int CODBCInst::showErrors( QWidget *pwidgetParent, const QString &stringConsequence ) { DWORD nCode; char szMessage[FILENAME_MAX+1]; int nMessage = 1; for ( ; nMessage <= 10; nMessage++ ) { if ( SQLInstallerError( nMessage, &nCode, szMessage, FILENAME_MAX, NULL ) != SQL_SUCCESS ) break; QMessageBox::critical( pwidgetParent, QObject::tr( "ODBC Administrator" ), szMessage ); } if ( !stringConsequence.isEmpty() ) QMessageBox::warning( pwidgetParent, QObject::tr( "ODBC Administrator" ), stringConsequence ); return (nMessage - 1); }
void OdbcConnectionUtil::TeardownOracleDSN() { if (m_SetupValues->PropertyExist( L"enableOracleSetup" )) { FdoStringP pValue = m_SetupValues->GetPropertyValue( L"enableOracleSetup" ); if (pValue != L"true") return; } char pString[SQL_MAX_MESSAGE_LENGTH]; DWORD error; WORD count; sprintf( pString, "DSN=%s%c%c", (const char*)(FdoStringP)m_SetupValues->GetPropertyValue( L"DSNOracle" ), '\0', '\0'); if (!SQLConfigDataSource (NULL, ODBC_REMOVE_DSN, theOracleDriverName, pString)) { SQLInstallerError (1, &error, pString, sizeof (pString), &count); printf ("\nOracle DSN teardown failed:\n"); printf (pString); } }
void OdbcConnectionUtil::SetupAccessDSN() { const char* module = GetTestDataPath(); if (module != NULL && module[0] != '\0') { char teststr[1024]; m_SetupAccessDSNdone = true; sprintf (teststr, "DSN=%s%cDescription=Test Access datastore for FDO ODBC provider%cDBQ=%sMSTest.mdb%c%c", (const char*)(FdoStringP)m_SetupValues->GetPropertyValue( L"DSNAccess" ), '\0', '\0', module, '\0', '\0'); if (!SQLConfigDataSource (NULL, ODBC_ADD_DSN, (const char*)ACCESS_ODBC_DRIVER_NAME, teststr)) { DWORD error; WORD count; SQLInstallerError (1, &error, teststr, sizeof (teststr), &count); printf (teststr); throw FdoException::Create (L"Access DSN setup failed"); } } }
static BOOL ProcessErrorMessages(char *name) { WORD err = 1; DWORD code; char errmsg[301]; WORD errlen, errmax = sizeof (errmsg) - 1; int rc; BOOL ret = FALSE; do { errmsg[0] = '\0'; rc = SQLInstallerError(err, &code, errmsg, errmax, &errlen); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { MessageBox(NULL, errmsg, name, MB_ICONSTOP|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND); ret = TRUE; } err++; } while (rc != SQL_NO_DATA); return ret; }
static BOOL ProcessSQLErrorMessages(const char *func) { WORD errnr = 1; DWORD errcode; char errmsg[300]; WORD errmsglen; int rc; BOOL func_rc = FALSE; do { errmsg[0] = '\0'; rc = SQLInstallerError(errnr, &errcode, errmsg, sizeof(errmsg), &errmsglen); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { MessageBox(NULL, errmsg, func, MB_ICONSTOP | MB_OK | MB_TASKMODAL | MB_SETFOREGROUND); func_rc = TRUE; } errnr++; } while (rc != SQL_NO_DATA); return func_rc; }
void CFileList::Add() { // odbc.ini INFO /* QString qsDataSourceName = ""; QString qsDataSourceDescription = ""; */ QString qsDataSourceDriver = ""; QString qsDriverName = ""; CDriverPrompt *pDriverPrompt; CPropertiesFrame *pProperties; HODBCINSTPROPERTY hFirstProperty = NULL; HODBCINSTPROPERTY hCurProperty = NULL; DWORD nErrorCode; char szErrorMsg[101]; QString qsError = ""; int ret; pDriverPrompt = new CDriverPrompt( this ); if ( pDriverPrompt->exec() ) { qsDriverName = pDriverPrompt->qsDriverName; qsDataSourceDriver = qsDriverName; delete pDriverPrompt; // // can we call SQLDriverConnect // // GET PROPERTY LIST FROM DRIVER if ( ODBCINSTConstructProperties( (char*)qsDataSourceDriver.ascii(), &hFirstProperty ) != ODBCINST_SUCCESS ) { qsError.sprintf( "Could not construct a property list for (%s)", qsDataSourceDriver.ascii() ); QMessageBox::information( this, "ODBC Config", qsError ); return; } // ALLOW USER TO EDIT pProperties = new CPropertiesFrame( this, "Properties", hFirstProperty ); pProperties->setCaption( "Data Source Properties (new)" ); if ( pProperties->exec() ) { char dir[ 256 ]; sprintf( dir, "%s/%s", cwd.ascii(), hFirstProperty->szValue ); ret = SQLWriteFileDSN( dir, "ODBC", NULL, NULL ); if ( !ret ) { qsError.sprintf( "Could not write to (%s)", dir ); QMessageBox::information( this, "ODBC Config", qsError ); int i = 1; while ( SQLInstallerError( i++, &nErrorCode, szErrorMsg, 100, NULL ) == SQL_SUCCESS ) QMessageBox::information( this, "ODBC Config", szErrorMsg ); return; } /* ADD ENTRIES; SECTION CREATED ON FIRST CALL */ for ( hCurProperty = hFirstProperty->pNext; hCurProperty != NULL; hCurProperty = hCurProperty->pNext ) { ret = SQLWriteFileDSN( dir, "ODBC", hCurProperty->szName, hCurProperty->szValue ); if ( !ret ) { qsError.sprintf( "Could not write to (%s)", dir ); QMessageBox::information( this, "ODBC Config", qsError ); int i = 1; while ( SQLInstallerError( i++, &nErrorCode, szErrorMsg, 100, NULL ) == SQL_SUCCESS ) QMessageBox::information( this, "ODBC Config", szErrorMsg ); return; } } } delete pProperties; ODBCINSTDestructProperties( &hFirstProperty ); } else delete pDriverPrompt; // RELOAD (slow but safe) Load(); }
void CFileList::Edit() { // odbc.ini INFO QString qsDataSourceName = ""; QString qsDataSourceDescription = ""; QString qsDataSourceDriver = ""; // odbcinst.ini INFO QString qsDriverFile = ""; QString qsSetupFile = ""; QString qsError = ""; CPropertiesFrame *pProperties; HODBCINSTPROPERTY hFirstProperty = NULL; HODBCINSTPROPERTY hCurProperty = NULL; #ifdef QT_V4LAYOUT Q3ListViewItem *pListViewItem; #else QListViewItem *pListViewItem; #endif char szEntryNames[4096]; char szProperty[INI_MAX_PROPERTY_NAME+1]; char szValue[INI_MAX_PROPERTY_VALUE+1]; DWORD nErrorCode; char szErrorMsg[101]; char szINI[FILENAME_MAX+1]; int nElement; char dir[ 256 ]; char szDriver[ 256 ]; QString qsFileName; // HAS THE USER SELECTED SOMETHING pListViewItem = currentItem(); if ( pListViewItem ) { qsFileName = pListViewItem->text( 0 ); /* qsDataSourceDescription = pListViewItem->text( 1 ); qsDataSourceDriver = pListViewItem->text( 2 ); */ } else { QMessageBox::information( this, "ODBC Config", "Please select a Data Source from the list first" ); return; } sprintf( dir, "%s/%s", cwd.ascii(), qsFileName.ascii()); szDriver[ 0 ] = '\0'; if ( !SQLReadFileDSN( dir, "ODBC", "DRIVER", szDriver, sizeof( szDriver ), NULL ) || strlen( szDriver ) < 1 ) { char szDsn[ 256 ]; szDsn[ 0 ] = '\0'; if ( SQLReadFileDSN( dir, "ODBC", "DSN", szDsn, sizeof( szDsn ), NULL ) && strlen( szDsn ) >= 1 ) { SQLSetConfigMode( ODBC_BOTH_DSN ); SQLGetPrivateProfileString( szDsn, "Driver", "", szDriver, sizeof( szDriver ), "odbc.ini" ); if ( strlen( szDriver ) < 1 ) { QMessageBox::information( this, "ODBC Config", "Unable to extract driver from FILE DSN" ); return; } } else { QMessageBox::information( this, "ODBC Config", "Unable to extract driver from FILE DSN" ); return; } } // // can we call SQLDriverConnect // // GET PROPERTY LIST FROM DRIVER if ( ODBCINSTConstructProperties( szDriver, &hFirstProperty ) != ODBCINST_SUCCESS ) { qsError.sprintf( "Could not construct a property list for (%s)", szDriver ); QMessageBox::information( this, "ODBC Config", qsError ); int i = 1; while ( SQLInstallerError( i ++, &nErrorCode, szErrorMsg, 100, NULL ) == SQL_SUCCESS ) QMessageBox::information( this, "ODBC Config", szErrorMsg ); return; } ODBCINSTSetProperty( hFirstProperty, "Name", (char*)qsFileName.ascii()); for ( hCurProperty = hFirstProperty->pNext; hCurProperty != NULL; hCurProperty = hCurProperty->pNext ) { char szAttr[ 256 ]; szAttr[ 0 ] = '\0'; if ( SQLReadFileDSN( dir, "ODBC", hCurProperty->szName, szAttr, sizeof( szAttr ), NULL )) { ODBCINSTSetProperty( hFirstProperty, hCurProperty->szName, szAttr ); } } // ALLOW USER TO EDIT pProperties = new CPropertiesFrame( this, "Properties", hFirstProperty ); pProperties->setCaption( "Data Source Properties (edit)" ); if ( pProperties->exec() ) { int ret; ret = SQLWriteFileDSN( dir, "ODBC", NULL, NULL ); if ( !ret ) { qsError.sprintf( "Could not write to (%s)", dir ); QMessageBox::information( this, "ODBC Config", qsError ); int i = 1; while ( SQLInstallerError( i++, &nErrorCode, szErrorMsg, 100, NULL ) == SQL_SUCCESS ) QMessageBox::information( this, "ODBC Config", szErrorMsg ); return; } for ( hCurProperty = hFirstProperty->pNext; hCurProperty != NULL; hCurProperty = hCurProperty->pNext ) { if ( !SQLWriteFileDSN( dir, "ODBC", hCurProperty->szName, hCurProperty->szValue )) { qsError.sprintf( "Could not write to file dsn (%s)", dir ); QMessageBox::information( this, "ODBC Config", qsError ); int i = 1; while ( SQLInstallerError( i ++, &nErrorCode, szErrorMsg, 100, NULL ) == SQL_SUCCESS ) QMessageBox::information( this, "ODBC Config", szErrorMsg ); return; } } } delete pProperties; ODBCINSTDestructProperties( &hFirstProperty ); // RELOAD (slow but safe) Load(); }
// Establish an Oracle DSN. Oracle does not have a constant name, but rather // a formulated one based on installed instance. We'll look for the substrings // "Oracle" and "10g", unless the user has overridden this pattern using // the "odbcoracledriver" environment variable. void OdbcConnectionUtil::SetupOracleDSN() { char driverDesc[1024]; char driverAttrs[1024]; theOracleDriverName[0] = '\0'; char teststr[1024]; BOOL ret = false; SQLRETURN rc = SQL_ERROR; m_SetupOracleDSNdone = true; SQLHENV sqlenv = SQL_NULL_HENV; rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HENV, &sqlenv); if ( SQLRETURN_OK(rc) ) rc = SQLSetEnvAttr(sqlenv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); if ( SQLRETURN_OK(rc) ) { SQLUSMALLINT direction = SQL_FETCH_FIRST; SQLSMALLINT driverDescLength = 0; SQLSMALLINT driverAttrsLength = 0; do { driverDescLength = 0; driverAttrsLength = 0; rc = SQLDrivers(sqlenv, direction, (SQLCHAR *) driverDesc, (SQLSMALLINT) sizeof(driverDesc), &driverDescLength, (SQLCHAR *) driverAttrs, (SQLSMALLINT) sizeof(driverAttrs), &driverAttrsLength); if (SQLRETURN_OK(rc)) { #ifdef WIN32 #pragma message("TODO: update this with each Oracle version update") #endif if (NULL != strstr(driverDesc, "Oracle") && (NULL != strstr(driverDesc, "10") || NULL != strstr(driverDesc, "11"))) strcpy(theOracleDriverName, driverDesc); } direction = SQL_FETCH_NEXT; } while ( SQLRETURN_OK(rc) && SQL_NO_DATA != rc && '\0' == theOracleDriverName[0] ); if (m_SetupValues->PropertyExist( L"enableOracleSetup" )) { FdoStringP pValue = m_SetupValues->GetPropertyValue( L"enableOracleSetup" ); if (pValue != L"true") return; } if (SQL_NO_DATA == rc) rc = SQL_SUCCESS; direction = SQL_FETCH_FIRST; FdoStringP pDSNOracle = m_SetupValues->GetPropertyValue( L"DSNOracle"); while(SQLRETURN_OK(SQLDataSources(sqlenv, direction, (SQLCHAR *)teststr, sizeof(teststr), &driverAttrsLength, (SQLCHAR *)driverDesc, sizeof(driverDesc), &driverDescLength))) { direction = SQL_FETCH_NEXT; if (pDSNOracle == (FdoStringP)teststr) { SQLFreeHandle(SQL_HANDLE_ENV, sqlenv); return; } } } if (SQLRETURN_OK(rc) && '\0' != theOracleDriverName[0]) { char* datastoreUpper = driverDesc; sprintf(datastoreUpper, "%ls", (FdoString*) UnitTestUtil::GetEnviron("datastore", L"")); (void) _strupr_s(datastoreUpper, 1024); sprintf ( teststr, "DSN=%s%cDescription=Oracle DSN for FDO ODBC provider%cServerName=%s%cUserID=%s%c%c", (const char*)(FdoStringP)m_SetupValues->GetPropertyValue( L"DSNOracle"), '\0', '\0', (const char*)(FdoStringP)m_SetupValues->GetPropertyValue( L"serviceOracle" ), '\0', datastoreUpper, '\0', '\0', '\0'); ret = SQLConfigDataSource (NULL, ODBC_ADD_DSN, theOracleDriverName, teststr); } if (!SQLRETURN_OK(rc)) { SQLSMALLINT cRecNmbr = 1; UCHAR szSqlState[MAX_PATH] = ""; UCHAR szErrorMsg[MAX_PATH] = ""; SDWORD pfNativeError = 0L; SWORD pcbErrorMsg = 0; rc = SQLGetDiagRec(SQL_HANDLE_ENV, sqlenv, 1, szSqlState, &pfNativeError, szErrorMsg, MAX_PATH-1, &pcbErrorMsg); printf("%.200s\n", (char *)szErrorMsg); throw FdoException::Create (L"Oracle DSN setup failed"); } if (sqlenv != SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, sqlenv); if (!ret ) { DWORD error; WORD count; SQLInstallerError (1, &error, teststr, sizeof (teststr), &count); printf (teststr); throw FdoException::Create (L"Oracle DSN setup failed"); } if ('\0' == theOracleDriverName[0]) throw FdoException::Create (L"Oracle DSN setup failed"); }
/* {{{ 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; }