X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bf5423ea7dd9f6a5c1d5eae71af034ff1aead158..804c69d3d193d0d821aea227524f8f5d96ecc309:/src/common/db.cpp?ds=sidebyside diff --git a/src/common/db.cpp b/src/common/db.cpp index 523da04b94..f0cb57a8fa 100644 --- a/src/common/db.cpp +++ b/src/common/db.cpp @@ -146,7 +146,7 @@ wxDbConnectInf::wxDbConnectInf() /********** wxDbConnectInf Constructor - form 2 **********/ -wxDbConnectInf::wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &userID, +wxDbConnectInf::wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &userID, const wxString &password, const wxString &defaultDir, const wxString &fileType, const wxString &description) { @@ -250,7 +250,7 @@ void wxDbConnectInf::SetUserID(const wxString &uid) void wxDbConnectInf::SetPassword(const wxString &password) { wxASSERT(password.Length() < sizeof(AuthStr)); - + wxStrcpy(AuthStr,password); } // wxDbConnectInf::SetPassword() @@ -751,10 +751,10 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt if (!getDataTypeInfo(SQL_VARBINARY,typeInfBlob)) return(FALSE); else - typeInfInteger.FsqlType = SQL_VARBINARY; + typeInfBlob.FsqlType = SQL_VARBINARY; } else - typeInfInteger.FsqlType = SQL_LONGVARBINARY; + typeInfBlob.FsqlType = SQL_LONGVARBINARY; //typeInfBlob.TypeName = "BLOB"; @@ -1892,9 +1892,16 @@ bool wxDb::DropView(const wxString &viewName) /********** wxDb::ExecSql() **********/ bool wxDb::ExecSql(const wxString &pSqlStmt) { + RETCODE retcode; + SQLFreeStmt(hstmt, SQL_CLOSE); - if (SQLExecDirect(hstmt, (UCHAR FAR *) pSqlStmt.c_str(), SQL_NTS) == SQL_SUCCESS) + + retcode = SQLExecDirect(hstmt, (UCHAR FAR *) pSqlStmt.c_str(), SQL_NTS); + if (retcode == SQL_SUCCESS || + (Dbms() == dbmsDB2 && (retcode == SQL_SUCCESS_WITH_INFO || retcode == SQL_NO_DATA_FOUND))) + { return(TRUE); + } else { DispAllErrors(henv, hdbc, hstmt); @@ -1936,7 +1943,7 @@ bool wxDb::GetData(UWORD colNo, SWORD cType, PTR pData, SDWORD maxLen, SDWORD FA /********** wxDb::GetKeyFields() **********/ -int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, int noCols) +int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCols) { wxChar szPkTable[DB_MAX_TABLE_NAME_LEN+1]; /* Primary key table name */ wxChar szFkTable[DB_MAX_TABLE_NAME_LEN+1]; /* Foreign key table name */ @@ -1946,7 +1953,7 @@ int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, int noCols wxChar szFkCol[DB_MAX_COLUMN_NAME_LEN+1]; /* Foreign key column */ SQLRETURN retcode; SDWORD cb; - int i; + SWORD i; wxString tempStr; /* * ----------------------------------------------------------------------- @@ -2104,8 +2111,8 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) * to avoid undesired unbinding of columns. */ { - int noCols = 0; - int colNo = 0; + UWORD noCols = 0; + UWORD colNo = 0; wxDbColInf *colInf = 0; RETCODE retcode; @@ -2246,7 +2253,7 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) /********** wxDb::GetColumns() **********/ -wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxChar *userID) +wxDbColInf *wxDb::GetColumns(const wxString &tableName, UWORD *numCols, const wxChar *userID) // // Same as the above GetColumns() function except this one gets columns // only for a single table, and if 'numCols' is not NULL, the number of @@ -2262,8 +2269,8 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh // to avoid undesired unbinding of columns. { - int noCols = 0; - int colNo = 0; + UWORD noCols = 0; + UWORD colNo = 0; wxDbColInf *colInf = 0; RETCODE retcode; @@ -2447,7 +2454,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh typedef struct { - int noCols; + UWORD noCols; wxDbColInf *colInf; } _TableColumns; @@ -2458,7 +2465,7 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) // The last array element of the tableName[] argument must be zero (null). // This is how the end of the array is detected. - int noCols = 0; + UWORD noCols = 0; // How many tables ? int tbl; @@ -2517,8 +2524,8 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh // by this function. This function should use its own wxDb instance // to avoid undesired unbinding of columns. { - SWORD noCols = 0; - int colNo = 0; + UWORD noCols = 0; + UWORD colNo = 0; wxDbColInf *colInf = 0; RETCODE retcode; @@ -2762,7 +2769,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh /********** wxDb::GetColumnCount() **********/ -int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID) +UWORD wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID) /* * Returns a count of how many columns are in a table. * If an error occurs in computing the number of columns @@ -2778,7 +2785,7 @@ int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID) * to avoid undesired unbinding of columns. */ { - int noCols = 0; + UWORD noCols = 0; RETCODE retcode; @@ -3123,7 +3130,9 @@ bool wxDb::TableExists(const wxString &tableName, const wxChar *userID, const wx if (!UserID.IsEmpty() && Dbms() != dbmsMY_SQL && Dbms() != dbmsACCESS && - Dbms() != dbmsMS_SQL_SERVER) + Dbms() != dbmsMS_SQL_SERVER && + Dbms() != dbmsDB2 && + Dbms() != dbmsPERVASIVE_SQL) { retcode = SQLTables(hstmt, NULL, 0, // All qualifiers @@ -3172,8 +3181,9 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons wxString TableName; - wxString UserID; + wxString UserID,Schema; convertUserID(userID,UserID); + convertUserID(schema,Schema); TableName = tableName; // Oracle and Interbase table names are uppercase only, so force @@ -3184,18 +3194,23 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons SQLFreeStmt(hstmt, SQL_CLOSE); - if (!schema) + // Some databases cannot accept a user name when looking up table names, + // so we use the call below that leaves out the user name + if (!Schema.IsEmpty() && + Dbms() != dbmsMY_SQL && + Dbms() != dbmsACCESS && + Dbms() != dbmsMS_SQL_SERVER) { retcode = SQLTablePrivileges(hstmt, NULL, 0, // Catalog - NULL, 0, // Schema + (UCHAR FAR *)Schema.c_str(), SQL_NTS, // Schema (UCHAR FAR *)TableName.c_str(), SQL_NTS); } else { retcode = SQLTablePrivileges(hstmt, NULL, 0, // Catalog - (UCHAR FAR *)schema, SQL_NTS, // Schema + NULL, 0, // Schema (UCHAR FAR *)TableName.c_str(), SQL_NTS); } @@ -3206,30 +3221,35 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) return(DispAllErrors(henv, hdbc, hstmt)); + bool failed = FALSE; retcode = SQLFetch(hstmt); while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { if (SQLGetData(hstmt, 1, SQL_C_CHAR, (UCHAR*) result.tableQual, sizeof(result.tableQual), &cbRetVal) != SQL_SUCCESS) - return(DispAllErrors(henv, hdbc, hstmt)); + failed = TRUE; - if (SQLGetData(hstmt, 2, SQL_C_CHAR, (UCHAR*) result.tableOwner, sizeof(result.tableOwner), &cbRetVal) != SQL_SUCCESS) - return(DispAllErrors(henv, hdbc, hstmt)); + if (!failed && SQLGetData(hstmt, 2, SQL_C_CHAR, (UCHAR*) result.tableOwner, sizeof(result.tableOwner), &cbRetVal) != SQL_SUCCESS) + failed = TRUE; - if (SQLGetData(hstmt, 3, SQL_C_CHAR, (UCHAR*) result.tableName, sizeof(result.tableName), &cbRetVal) != SQL_SUCCESS) - return(DispAllErrors(henv, hdbc, hstmt)); + if (!failed && SQLGetData(hstmt, 3, SQL_C_CHAR, (UCHAR*) result.tableName, sizeof(result.tableName), &cbRetVal) != SQL_SUCCESS) + failed = TRUE; - if (SQLGetData(hstmt, 4, SQL_C_CHAR, (UCHAR*) result.grantor, sizeof(result.grantor), &cbRetVal) != SQL_SUCCESS) - return(DispAllErrors(henv, hdbc, hstmt)); + if (!failed && SQLGetData(hstmt, 4, SQL_C_CHAR, (UCHAR*) result.grantor, sizeof(result.grantor), &cbRetVal) != SQL_SUCCESS) + failed = TRUE; - if (SQLGetData(hstmt, 5, SQL_C_CHAR, (UCHAR*) result.grantee, sizeof(result.grantee), &cbRetVal) != SQL_SUCCESS) - return(DispAllErrors(henv, hdbc, hstmt)); + if (!failed && SQLGetData(hstmt, 5, SQL_C_CHAR, (UCHAR*) result.grantee, sizeof(result.grantee), &cbRetVal) != SQL_SUCCESS) + failed = TRUE; - if (SQLGetData(hstmt, 6, SQL_C_CHAR, (UCHAR*) result.privilege, sizeof(result.privilege), &cbRetVal) != SQL_SUCCESS) - return(DispAllErrors(henv, hdbc, hstmt)); + if (!failed && SQLGetData(hstmt, 6, SQL_C_CHAR, (UCHAR*) result.privilege, sizeof(result.privilege), &cbRetVal) != SQL_SUCCESS) + failed = TRUE; - if (SQLGetData(hstmt, 7, SQL_C_CHAR, (UCHAR*) result.grantable, sizeof(result.grantable), &cbRetVal) != SQL_SUCCESS) - return(DispAllErrors(henv, hdbc, hstmt)); + if (!failed && SQLGetData(hstmt, 7, SQL_C_CHAR, (UCHAR*) result.grantable, sizeof(result.grantable), &cbRetVal) != SQL_SUCCESS) + failed = TRUE; + if (failed) + { + return(DispAllErrors(henv, hdbc, hstmt)); + } #ifdef DBDEBUG_CONSOLE fprintf(stderr,wxT("Scanning %s privilege on table %s.%s granted by %s to %s\n"), result.privilege,result.tableOwner,result.tableName, @@ -3367,6 +3387,11 @@ wxDBMS wxDb::Dbms(void) * * DB2 * - Primary keys must be declared as NOT NULL + * - Table and index names must not be longer than 13 characters in length (technically + * table names can be up to 18 characters, but the primary index is created using the + * base table name plus "_PIDX", so the limit if the table has a primary index is 13. + * + * PERVASIVE SQL * */ { @@ -3412,6 +3437,10 @@ wxDBMS wxDb::Dbms(void) if (!wxStricmp(dbInf.dbmsName,wxT("PostgreSQL"))) // v6.5.0 return((wxDBMS)(dbmsType = dbmsPOSTGRES)); + baseName[9] = 0; + if (!wxStricmp(dbInf.dbmsName,wxT("Pervasive"))) + return((wxDBMS)(dbmsType = dbmsPERVASIVE_SQL)); + baseName[8] = 0; if (!wxStricmp(baseName,wxT("Informix"))) return((wxDBMS)(dbmsType = dbmsINFORMIX)); @@ -3451,7 +3480,7 @@ bool wxDb::ModifyColumn(const wxString &tableName, const wxString &columnName, // Must specify a columnLength if modifying a VARCHAR type column if (dataType == DB_DATA_TYPE_VARCHAR && !columnLength) return FALSE; - + wxString dataTypeName; wxString sqlStmt; wxString alterSlashModify;