X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e04507df82af4755d7f1529b37be844058b6c2c1..4d53859584e0fb987fef609c620937e46b0f751a:/src/common/db.cpp diff --git a/src/common/db.cpp b/src/common/db.cpp index 2f19576485..5d92d95366 100644 --- a/src/common/db.cpp +++ b/src/common/db.cpp @@ -25,9 +25,6 @@ // SYNOPSIS START // SYNOPSIS STOP */ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "db.h" -#endif #include "wx/wxprec.h" @@ -179,7 +176,7 @@ bool wxDbConnectInf::AllocHenv() // Initialize the ODBC Environment for Database Operations if (SQLAllocEnv(&Henv) != SQL_SUCCESS) { - wxLogDebug(wxT("A problem occured while trying to get a connection to the data source")); + wxLogDebug(wxT("A problem occurred while trying to get a connection to the data source")); return false; } @@ -326,8 +323,7 @@ int wxDbColFor::Format(int Nation, int dbDataType, SWORD sqlDataType, case DB_DATA_TYPE_FLOAT: if (decimalDigits == 0) decimalDigits = 2; - tempStr = wxT("%"); - tempStr.Printf(wxT("%s%d.%d"), tempStr.c_str(),columnLength, decimalDigits); + tempStr.Printf(wxT("%%%d.%d"), columnLength, decimalDigits); s_Field.Printf(wxT("%sf"), tempStr.c_str()); break; case DB_DATA_TYPE_DATE: @@ -576,9 +572,10 @@ const wxChar *wxDb::convertUserID(const wxChar *userID, wxString &UserID) || Dbms() == dbmsXBASE_SEQUITER ) UserID.Empty(); - // Oracle user names may only be in uppercase, so force - // the name to uppercase - if (Dbms() == dbmsORACLE) + // Some databases require user names to be specified in uppercase, + // so force the name to uppercase + if ((Dbms() == dbmsORACLE) || + (Dbms() == dbmsMAXDB)) UserID = UserID.Upper(); return UserID.c_str(); @@ -803,6 +800,11 @@ bool wxDb::open(bool failOnDataTypeUnsupported) bool wxDb::Open(const wxString& inConnectStr, bool failOnDataTypeUnsupported) { wxASSERT(inConnectStr.Length()); + return Open(inConnectStr, NULL, failOnDataTypeUnsupported); +} + +bool wxDb::Open(const wxString& inConnectStr, SQLHWND parentWnd, bool failOnDataTypeUnsupported) +{ dsn = wxT(""); uid = wxT(""); authStr = wxT(""); @@ -831,7 +833,7 @@ bool wxDb::Open(const wxString& inConnectStr, bool failOnDataTypeUnsupported) inConnectionStr = inConnectStr; - retcode = SQLDriverConnect(hdbc, NULL, (SQLTCHAR FAR *)inConnectionStr.c_str(), + retcode = SQLDriverConnect(hdbc, parentWnd, (SQLTCHAR FAR *)inConnectionStr.c_str(), (SWORD)inConnectionStr.Length(), (SQLTCHAR FAR *)outConnectBuffer, sizeof(outConnectBuffer), &outConnectBufferLen, SQL_DRIVER_COMPLETE ); @@ -1606,7 +1608,7 @@ bool wxDb::getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo) * wxDbSqlTypeInfo is a structure that is filled in with data type information, */ RETCODE retcode; - SDWORD cbRet; + SQLLEN cbRet; // Get information about the data type specified if (SQLGetTypeInfo(hstmt, fSqlType) != SQL_SUCCESS) @@ -1775,25 +1777,21 @@ bool wxDb::DispAllErrors(HENV aHenv, HDBC aHdbc, HSTMT aHstmt) /* * This function is called internally whenever an error condition prevents the user's * request from being executed. This function will query the datasource as to the - * actual error(s) that just occured on the previous request of the datasource. + * actual error(s) that just occurred on the previous request of the datasource. * * The function will retrieve each error condition from the datasource and * Printf the codes/text values into a string which it then logs via logError(). * If in DBDEBUG_CONSOLE mode, the constructed string will be displayed in the console * window and program execution will be paused until the user presses a key. * - * This function always returns a false, so that functions which call this function + * This function always returns false, so that functions which call this function * can have a line like "return (DispAllErrors(henv, hdbc));" to indicate the failure - * of the users request, so that the calling code can then process the error msg log + * of the user's request, so that the calling code can then process the error message log. */ { wxString odbcErrMsg; -#ifdef __VMS - while (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, (SQLINTEGER *) &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS) -#else - while (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, (long*) &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS) -#endif + while (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS) { odbcErrMsg.Printf(wxT("SQL State = %s\nNative Error Code = %li\nError Message = %s\n"), sqlState, nativeError, errorMsg); logError(odbcErrMsg, sqlState); @@ -1820,11 +1818,7 @@ bool wxDb::DispAllErrors(HENV aHenv, HDBC aHdbc, HSTMT aHstmt) /********** wxDb::GetNextError() **********/ bool wxDb::GetNextError(HENV aHenv, HDBC aHdbc, HSTMT aHstmt) { -#ifdef __VMS - if (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, (SQLINTEGER *) &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS) -#else - if (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, (long*) &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS) -#endif + if (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS) return true; else return false; @@ -2252,7 +2246,7 @@ bool wxDb::ExecSql(const wxString &pSqlStmt, wxDbColInf** columns, short& numcol short colNum; wxChar name[DB_MAX_COLUMN_NAME_LEN+1]; SWORD Sword; - SDWORD Sdword; + SQLLEN Sqllen; wxDbColInf* pColInf = new wxDbColInf[noCols]; // Fill in column information (name, datatype) @@ -2260,7 +2254,7 @@ bool wxDb::ExecSql(const wxString &pSqlStmt, wxDbColInf** columns, short& numcol { if (SQLColAttributes(hstmt, (UWORD)(colNum+1), SQL_COLUMN_NAME, name, sizeof(name), - &Sword, &Sdword) != SQL_SUCCESS) + &Sword, &Sqllen) != SQL_SUCCESS) { DispAllErrors(henv, hdbc, hstmt); delete[] pColInf; @@ -2271,14 +2265,14 @@ bool wxDb::ExecSql(const wxString &pSqlStmt, wxDbColInf** columns, short& numcol pColInf[colNum].colName[DB_MAX_COLUMN_NAME_LEN] = 0; // Prevent buffer overrun if (SQLColAttributes(hstmt, (UWORD)(colNum+1), SQL_COLUMN_TYPE, - NULL, 0, &Sword, &Sdword) != SQL_SUCCESS) + NULL, 0, &Sword, &Sqllen) != SQL_SUCCESS) { DispAllErrors(henv, hdbc, hstmt); delete[] pColInf; return false; } - switch (Sdword) + switch (Sqllen) { #if wxUSE_UNICODE #if defined(SQL_WCHAR) @@ -2315,7 +2309,7 @@ bool wxDb::ExecSql(const wxString &pSqlStmt, wxDbColInf** columns, short& numcol #ifdef __WXDEBUG__ default: wxString errMsg; - errMsg.Printf(wxT("SQL Data type %ld currently not supported by wxWidgets"), (long)Sdword); + errMsg.Printf(wxT("SQL Data type %ld currently not supported by wxWidgets"), (long)Sqllen); wxLogDebug(errMsg,wxT("ODBC DEBUG MESSAGE")); #endif } @@ -2340,7 +2334,7 @@ bool wxDb::GetNext(void) /********** wxDb::GetData() **********/ -bool wxDb::GetData(UWORD colNo, SWORD cType, PTR pData, SDWORD maxLen, SDWORD FAR *cbReturned) +bool wxDb::GetData(UWORD colNo, SWORD cType, PTR pData, SDWORD maxLen, SQLLEN FAR *cbReturned) { wxASSERT(pData); wxASSERT(cbReturned); @@ -2370,7 +2364,7 @@ int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCo wxChar szPkCol[DB_MAX_COLUMN_NAME_LEN+1]; /* Primary key column */ wxChar szFkCol[DB_MAX_COLUMN_NAME_LEN+1]; /* Foreign key column */ SQLRETURN retcode; - SDWORD cb; + SQLLEN cb; SWORD i; wxString tempStr; /* @@ -2440,7 +2434,7 @@ int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCo GetData( 5, SQL_C_SSHORT, &iKeySeq, 0, &cb); GetData( 7, SQL_C_WXCHAR, szFkTable, DB_MAX_TABLE_NAME_LEN+1, &cb); GetData( 8, SQL_C_WXCHAR, szFkCol, DB_MAX_COLUMN_NAME_LEN+1, &cb); - tempStr.Printf(wxT("%s[%s] "),tempStr.c_str(),szFkTable); // [ ] in case there is a blank in the Table name + tempStr << _T('[') << szFkTable << _T(']'); // [ ] in case there is a blank in the Table name } // if } // while @@ -2509,7 +2503,7 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) * 1) The last array element of the tableName[] argument must be zero (null). * This is how the end of the array is detected. * 2) This function returns an array of wxDbColInf structures. If no columns - * were found, or an error occured, this pointer will be zero (null). THE + * were found, or an error occurred, this pointer will be zero (null). THE * CALLING FUNCTION IS RESPONSIBLE FOR DELETING THE MEMORY RETURNED WHEN IT * IS FINISHED WITH IT. i.e. * @@ -2537,7 +2531,7 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) wxDbColInf *colInf = 0; RETCODE retcode; - SDWORD cb; + SQLLEN cb; wxString TableName; @@ -2599,7 +2593,7 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) NULL, 0); // All columns } if (retcode != SQL_SUCCESS) - { // Error occured, abort + { // Error occurred, abort DispAllErrors(henv, hdbc, hstmt); if (colInf) delete [] colInf; @@ -2657,7 +2651,7 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) } } if (retcode != SQL_NO_DATA_FOUND) - { // Error occured, abort + { // Error occurred, abort DispAllErrors(henv, hdbc, hstmt); if (colInf) delete [] colInf; @@ -2696,7 +2690,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, UWORD *numCols, const wx wxDbColInf *colInf = 0; RETCODE retcode; - SDWORD cb; + SQLLEN cb; wxString TableName; @@ -2755,7 +2749,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, UWORD *numCols, const wx NULL, 0); // All columns } if (retcode != SQL_SUCCESS) - { // Error occured, abort + { // Error occurred, abort DispAllErrors(henv, hdbc, hstmt); if (colInf) delete [] colInf; @@ -2831,7 +2825,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, UWORD *numCols, const wx } } if (retcode != SQL_NO_DATA_FOUND) - { // Error occured, abort + { // Error occurred, abort DispAllErrors(henv, hdbc, hstmt); if (colInf) delete [] colInf; @@ -2860,7 +2854,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, UWORD *numCols, const wx /* BJO 20000503 These are tentative new GetColumns members which should be more database - independant and which always returns the columns in the order they were + independent and which always returns the columns in the order they were created. - The first one (wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const @@ -3011,7 +3005,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh NULL, 0); // All columns } if (retcode != SQL_SUCCESS) - { // Error occured, abort + { // Error occurred, abort DispAllErrors(henv, hdbc, hstmt); if (colInf) delete [] colInf; @@ -3107,7 +3101,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh } } if (retcode != SQL_NO_DATA_FOUND) - { // Error occured, abort + { // Error occurred, abort DispAllErrors(henv, hdbc, hstmt); if (colInf) delete [] colInf; @@ -3259,7 +3253,7 @@ int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID) NULL, 0); // All columns } if (retcode != SQL_SUCCESS) - { // Error occured, abort + { // Error occurred, abort DispAllErrors(henv, hdbc, hstmt); SQLFreeStmt(hstmt, SQL_CLOSE); return(-1); @@ -3270,7 +3264,7 @@ int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID) noCols++; if (retcode != SQL_NO_DATA_FOUND) - { // Error occured, abort + { // Error occurred, abort DispAllErrors(henv, hdbc, hstmt); SQLFreeStmt(hstmt, SQL_CLOSE); return(-1); @@ -3291,7 +3285,7 @@ wxDbInf *wxDb::GetCatalog(const wxChar *userID) * -- : uses SQLTables and fills pTableInf; ------ * -- : pColInf is set to NULL and numCols to 0; ------ * -- : returns pDbInf (wxDbInf) ------ - * -- - if unsuccesfull (pDbInf == NULL) ------ + * -- - if unsuccessful (pDbInf == NULL) ------ * -- : pColInf can be filled with GetColumns(..); ------ * -- : numCols can be filled with GetColumnCount(..); ------ * --------------------------------------------------------------------- @@ -3309,7 +3303,7 @@ wxDbInf *wxDb::GetCatalog(const wxChar *userID) int noTab = 0; // Counter while filling table entries int pass; RETCODE retcode; - SDWORD cb; + SQLLEN cb; wxString tblNameSave; wxString UserID; @@ -3420,7 +3414,7 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName) wxASSERT(fileName.Length()); RETCODE retcode; - SDWORD cb; + SQLLEN cb; wxChar tblName[DB_MAX_TABLE_NAME_LEN+1]; wxString tblNameSave; wxChar colName[DB_MAX_COLUMN_NAME_LEN+1]; @@ -3428,7 +3422,7 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName) wxChar typeName[30+1]; SDWORD precision, length; - FILE *fp = wxFopen(fileName.c_str,wxT("wt")); + FILE *fp = wxFopen(fileName.c_str(),wxT("wt")); if (fp == NULL) return false; @@ -3617,7 +3611,7 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons wxASSERT(tableName.Length()); wxDbTablePrivilegeInfo result; - SDWORD cbRetVal; + SQLLEN cbRetVal; RETCODE retcode; // We probably need to be able to dynamically set this based on @@ -3949,6 +3943,8 @@ wxDBMS wxDb::Dbms(void) return((wxDBMS)(dbmsType = dbmsXBASE_SEQUITER)); if (!wxStricmp(baseName,wxT("MySQL"))) return((wxDBMS)(dbmsType = dbmsMY_SQL)); + if (!wxStricmp(baseName,wxT("MaxDB"))) + return((wxDBMS)(dbmsType = dbmsMAXDB)); baseName[3] = 0; if (!wxStricmp(baseName,wxT("DB2"))) @@ -4333,7 +4329,7 @@ int wxDbCreateDataSource(const wxString &driverName, const wxString &dsn, const // embedded nulls in strings setupStr.Printf(wxT("DSN=%s%cDescription=%s%cDefaultDir=%s%c"),dsn,2,description,2,defDir,2); - // Replace the separator from above with the '\0' seperator needed + // Replace the separator from above with the '\0' separator needed // by the SQLConfigDataSource() function int k; do @@ -4415,7 +4411,7 @@ bool wxDbGetDataSource(HENV henv, wxChar *Dsn, SWORD DsnMaxLength, wxChar *DsDes ******************************************************************** * * The following functions are all DEPRECATED and are included for - * backward compatability reasons only + * backward compatibility reasons only * ******************************************************************** ********************************************************************/