X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5f72522e58e75bbd2c6e04544b6dd6a8260ea836..69120ee48a66faa743b6e7c85a745806f53228ac:/src/common/db.cpp diff --git a/src/common/db.cpp b/src/common/db.cpp index caccd58f8a..ee2a47b16a 100644 --- a/src/common/db.cpp +++ b/src/common/db.cpp @@ -85,7 +85,7 @@ static wxString SQLLOGfn = SQL_LOG_FILENAME; // will overwrite the errors of the previously destroyed wxDb object in // this variable. NOTE: This occurs during a CLOSE, not a FREEing of the // connection -wxChar DBerrorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN]; +wxChar DBerrorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN+1]; // This type defines the return row-struct form @@ -206,14 +206,16 @@ void wxDbConnectInf::SetDsn(const wxString &dsn) { wxASSERT(dsn.Length() < sizeof(Dsn)); - wxStrcpy(Dsn,dsn); + wxStrncpy(Dsn, dsn, sizeof(Dsn)-1); + Dsn[sizeof(Dsn)-1] = 0; // Prevent buffer overrun } // wxDbConnectInf::SetDsn() void wxDbConnectInf::SetUserID(const wxString &uid) { wxASSERT(uid.Length() < sizeof(Uid)); - wxStrcpy(Uid, uid); + wxStrncpy(Uid, uid, sizeof(Uid)-1); + Uid[sizeof(Uid)-1] = 0; // Prevent buffer overrun } // wxDbConnectInf::SetUserID() @@ -221,7 +223,8 @@ void wxDbConnectInf::SetPassword(const wxString &password) { wxASSERT(password.Length() < sizeof(AuthStr)); - wxStrcpy(AuthStr, password); + wxStrncpy(AuthStr, password, sizeof(AuthStr)-1); + AuthStr[sizeof(AuthStr)-1] = 0; // Prevent buffer overrun } // wxDbConnectInf::SetPassword() void wxDbConnectInf::SetConnectionStr(const wxString &connectStr) @@ -230,7 +233,8 @@ void wxDbConnectInf::SetConnectionStr(const wxString &connectStr) useConnectionStr = wxStrlen(connectStr) > 0; - wxStrcpy(ConnectionStr, connectStr); + wxStrncpy(ConnectionStr, connectStr, sizeof(ConnectionStr)-1); + ConnectionStr[sizeof(ConnectionStr)-1] = 0; // Prevent buffer overrun } // wxDbConnectInf::SetConnectionStr() @@ -283,14 +287,23 @@ int wxDbColFor::Format(int Nation, int dbDataType, SWORD sqlDataType, if (i_dbDataType == 0) // Filter unsupported dbDataTypes { - if ((i_sqlDataType == SQL_VARCHAR) || (i_sqlDataType == SQL_LONGVARCHAR)) + if ((i_sqlDataType == SQL_VARCHAR) +#if wxUSE_UNICODE + #if defined(SQL_WCHAR) + || (i_sqlDataType == SQL_WCHAR) + #endif + #if defined(SQL_WVARCHAR) + || (i_sqlDataType == SQL_WVARCHAR) + #endif +#endif + || (i_sqlDataType == SQL_LONGVARCHAR)) i_dbDataType = DB_DATA_TYPE_VARCHAR; if ((i_sqlDataType == SQL_C_DATE) || (i_sqlDataType == SQL_C_TIMESTAMP)) i_dbDataType = DB_DATA_TYPE_DATE; if (i_sqlDataType == SQL_C_BIT) i_dbDataType = DB_DATA_TYPE_INTEGER; if (i_sqlDataType == SQL_NUMERIC) - i_dbDataType = DB_DATA_TYPE_VARCHAR; + i_dbDataType = DB_DATA_TYPE_VARCHAR; // glt - ??? is this right? if (i_sqlDataType == SQL_REAL) i_dbDataType = DB_DATA_TYPE_FLOAT; if (i_sqlDataType == SQL_C_BINARY) @@ -563,9 +576,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(); @@ -574,13 +588,13 @@ const wxChar *wxDb::convertUserID(const wxChar *userID, wxString &UserID) bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported) { - int iIndex; + size_t iIndex; // These are the possible SQL types we check for use against the datasource we are connected // to for the purpose of determining which data type to use for the basic character strings // column types // - // NOTE: The first type in this enumeration that is determined to be supported by the + // NOTE: The first type in this enumeration that is determined to be supported by the // datasource/driver is the one that will be used. SWORD PossibleSqlCharTypes[] = { #if wxUSE_UNICODE && defined(SQL_WVARCHAR) @@ -597,7 +611,7 @@ bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported) // to for the purpose of determining which data type to use for the basic non-floating point // column types // - // NOTE: The first type in this enumeration that is determined to be supported by the + // NOTE: The first type in this enumeration that is determined to be supported by the // datasource/driver is the one that will be used. SWORD PossibleSqlIntegerTypes[] = { SQL_INTEGER @@ -607,7 +621,7 @@ bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported) // to for the purpose of determining which data type to use for the basic floating point number // column types // - // NOTE: The first type in this enumeration that is determined to be supported by the + // NOTE: The first type in this enumeration that is determined to be supported by the // datasource/driver is the one that will be used. SWORD PossibleSqlFloatTypes[] = { SQL_DOUBLE, @@ -620,7 +634,7 @@ bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported) // These are the possible SQL types we check for use agains the datasource we are connected // to for the purpose of determining which data type to use for the date/time column types // - // NOTE: The first type in this enumeration that is determined to be supported by the + // NOTE: The first type in this enumeration that is determined to be supported by the // datasource/driver is the one that will be used. SWORD PossibleSqlDateTypes[] = { SQL_TIMESTAMP, @@ -633,7 +647,7 @@ bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported) // These are the possible SQL types we check for use agains the datasource we are connected // to for the purpose of determining which data type to use for the BLOB column types. // - // NOTE: The first type in this enumeration that is determined to be supported by the + // NOTE: The first type in this enumeration that is determined to be supported by the // datasource/driver is the one that will be used. SWORD PossibleSqlBlobTypes[] = { SQL_LONGVARBINARY, @@ -686,8 +700,8 @@ bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported) if (!getDbInfo(failOnDataTypeUnsupported)) return false; - // --------------- Varchar - (Variable length character string) --------------- - for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlCharTypes) && + // --------------- Varchar - (Variable length character string) --------------- + for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlCharTypes) && !getDataTypeInfo(PossibleSqlCharTypes[iIndex], typeInfVarchar); ++iIndex) {} @@ -696,8 +710,8 @@ bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported) else if (failOnDataTypeUnsupported) return false; - // --------------- Float --------------- - for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlFloatTypes) && + // --------------- Float --------------- + for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlFloatTypes) && !getDataTypeInfo(PossibleSqlFloatTypes[iIndex], typeInfFloat); ++iIndex) {} @@ -707,7 +721,7 @@ bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported) return false; // --------------- Integer ------------- - for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlIntegerTypes) && + for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlIntegerTypes) && !getDataTypeInfo(PossibleSqlIntegerTypes[iIndex], typeInfInteger); ++iIndex) {} @@ -726,8 +740,8 @@ bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported) typeInfInteger.FsqlType = typeInfFloat.FsqlType; } - // --------------- Date/Time --------------- - for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlDateTypes) && + // --------------- Date/Time --------------- + for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlDateTypes) && !getDataTypeInfo(PossibleSqlDateTypes[iIndex], typeInfDate); ++iIndex) {} @@ -736,8 +750,8 @@ bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported) else if (failOnDataTypeUnsupported) return false; - // --------------- BLOB --------------- - for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlBlobTypes) && + // --------------- BLOB --------------- + for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlBlobTypes) && !getDataTypeInfo(PossibleSqlBlobTypes[iIndex], typeInfBlob); ++iIndex) {} @@ -1855,12 +1869,13 @@ void wxDb::logError(const wxString &errMsg, const wxString &SQLState) if (++pLast == DB_MAX_ERROR_HISTORY) { int i; - for (i = 0; i < DB_MAX_ERROR_HISTORY; i++) + for (i = 0; i < DB_MAX_ERROR_HISTORY-1; i++) wxStrcpy(errorList[i], errorList[i+1]); pLast--; } - wxStrcpy(errorList[pLast], errMsg); + wxStrncpy(errorList[pLast], errMsg, DB_MAX_ERROR_MSG_LEN); + errorList[pLast][DB_MAX_ERROR_MSG_LEN] = 0; if (SQLState.Length()) if ((dbStatus = TranslateSqlState(SQLState)) != DB_ERR_FUNCTION_SEQUENCE_ERROR) @@ -2241,7 +2256,7 @@ bool wxDb::ExecSql(const wxString &pSqlStmt, wxDbColInf** columns, short& numcol SDWORD Sdword; wxDbColInf* pColInf = new wxDbColInf[noCols]; - //fill in column information (name, datatype) + // Fill in column information (name, datatype) for (colNum = 0; colNum < noCols; colNum++) { if (SQLColAttributes(hstmt, (UWORD)(colNum+1), SQL_COLUMN_NAME, @@ -2254,6 +2269,7 @@ bool wxDb::ExecSql(const wxString &pSqlStmt, wxDbColInf** columns, short& numcol } wxStrncpy(pColInf[colNum].colName, name, DB_MAX_COLUMN_NAME_LEN); + 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) @@ -2265,6 +2281,14 @@ bool wxDb::ExecSql(const wxString &pSqlStmt, wxDbColInf** columns, short& numcol switch (Sdword) { +#if wxUSE_UNICODE + #if defined(SQL_WCHAR) + case SQL_WCHAR: + #endif + #if defined(SQL_WVARCHAR) + case SQL_WVARCHAR: + #endif +#endif case SQL_VARCHAR: case SQL_CHAR: pColInf[colNum].dbDataType = DB_DATA_TYPE_VARCHAR; @@ -2427,7 +2451,10 @@ int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCo for (i=0; ierrorList[i]) { msg.Append(pDb->errorList[i]); - if (wxStrcmp(pDb->errorList[i],wxT("")) != 0) + if (wxStrcmp(pDb->errorList[i], wxEmptyString) != 0) msg.Append(wxT("\n")); // Clear the errmsg buffer so the next error will not // end up showing the previous error that have occurred - wxStrcpy(pDb->errorList[i],wxT("")); + wxStrcpy(pDb->errorList[i], wxEmptyString); } } msg += wxT("\n");