if (SQLGetInfo(hdbc, SQL_PROCEDURES, (UCHAR*) dbInf.procedureSupport, 2, &cb) != SQL_SUCCESS)
return(DispAllErrors(henv, hdbc));
+ if (SQLGetInfo(hdbc, SQL_ACCESSIBLE_TABLES, (UCHAR*) dbInf.accessibleTables, 2, &cb) != SQL_SUCCESS)
+ return(DispAllErrors(henv, hdbc));
+
if (SQLGetInfo(hdbc, SQL_CURSOR_COMMIT_BEHAVIOR, (UCHAR*) &dbInf.cursorCommitBehavior, sizeof(dbInf.cursorCommitBehavior), &cb) != SQL_SUCCESS)
return(DispAllErrors(henv, hdbc));
cout << "Max. Connections: " << dbInf.maxConnections << endl;
cout << "Outer Joins: " << dbInf.outerJoins << endl;
cout << "Support for Procedures: " << dbInf.procedureSupport << endl;
+ cout << "All tables accessible : " << dbInf.accessibleTables << endl;
cout << "Cursor COMMIT Behavior: ";
switch(dbInf.cursorCommitBehavior)
* userID == "" ... UserID set equal to 'this->uid'
* userID != "" ... UserID set equal to 'userID'
*
- * NOTE: ALL column bindings associated with this wxDB instance are unbound
- * by this function. This function should use its own wxDB instance
- * to avoid undesired unbinding of columns.
*/
{
int noCols = 0;
} // wxDB::TableExists()
+
+/********** wxDB::TablePrivileges() **********/
+bool wxDB::TablePrivileges(const char* privilege, const char *tableName,
+ const char *userID, const char *tablePath)
+{
+ SqlPrivilegesInfo result;
+ SDWORD cbRetVal;
+ RETCODE retcode;
+
+ //We probably need to be able to dynamically set this based on
+ //the driver type, and state. - roger gammans
+ char curRole[]="public";
+
+ wxString UserID;
+ wxString TableName;
+
+ assert(tableName && wxStrlen(tableName));
+
+ if (userID)
+ {
+ if (!wxStrlen(userID))
+ UserID = uid;
+ else
+ UserID = userID;
+ }
+ else
+ UserID = "";
+
+ // Oracle user names may only be in uppercase, so force
+ // the name to uppercase
+ // if (Dbms() == dbmsORACLE)
+ // UserID = UserID.Upper();
+ //
+ // However we fors case-insentive compare so it shouldn't matter.
+
+
+ TableName = tableName;
+ // Oracle table names are uppercase only, so force
+ // the name to uppercase just in case programmer forgot to do this
+ if (Dbms() == dbmsORACLE)
+ TableName = TableName.Upper();
+
+ SQLFreeStmt(hstmt, SQL_CLOSE);
+
+ retcode = SQLTablePrivileges(hstmt,
+ NULL, 0, // All qualifiers
+ NULL, 0, // All owners
+ (UCHAR FAR *)TableName.GetData(), SQL_NTS);
+
+#ifdef DBDEBUG_CONSOLE
+ fprintf(stderr ,"SQLTablePrivileges() returned %i \n",retcode);
+#endif
+/*
+ retcode = SQLBindCol (hstmt, 1, SQL_C_CHAR, &result.TableQualifier, 128, &cbRetVal);
+ retcode = SQLBindCol (hstmt, 2, SQL_C_CHAR, &result.TableOwner, 128, &cbRetVal);
+ retcode = SQLBindCol (hstmt, 3, SQL_C_CHAR, &result.TableName, 128, &cbRetVal);
+ retcode = SQLBindCol (hstmt, 4, SQL_C_CHAR, &result.Grantor, 128, &cbRetVal);
+ retcode = SQLBindCol (hstmt, 5, SQL_C_CHAR, &result.Grantee, 128, &cbRetVal);
+ retcode = SQLBindCol (hstmt, 6, SQL_C_CHAR, &result.Privilege, 128, &cbRetVal);
+ retcode = SQLBindCol (hstmt, 7, SQL_C_CHAR, &result.Grantable, 3, &cbRetVal);
+*/
+ retcode = SQLFetch(hstmt);
+ while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
+ {
+ GetData(1, SQL_C_CHAR, &result.TableQualifier, 128, &cbRetVal);
+ GetData(2, SQL_C_CHAR, &result.TableOwner, 128, &cbRetVal);
+ GetData(3, SQL_C_CHAR, &result.TableName, 128, &cbRetVal);
+ GetData(4, SQL_C_CHAR, &result.Grantor, 128, &cbRetVal);
+ GetData(5, SQL_C_CHAR, &result.Grantee, 128, &cbRetVal);
+ GetData(6, SQL_C_CHAR, &result.Privilege, 128, &cbRetVal);
+ GetData(7, SQL_C_CHAR, &result.Grantable, 3, &cbRetVal);
+
+#ifdef DBDEBUG_CONSOLE
+ fprintf(stderr,"Scanning %s privilege on table %s.%s granted by %s to %s\n",
+ result.Privilege,result.TableOwner,result.TableName,
+ result.Grantor, result.Grantee);
+#endif
+ if (UserID.IsSameAs(result.TableOwner,false))
+ {
+ SQLFreeStmt(hstmt, SQL_CLOSE);
+ return true;
+ }
+ if (UserID.IsSameAs(result.Grantee,false) &&
+ !strcmp(result.Privilege, privilege))
+ {
+ SQLFreeStmt(hstmt, SQL_CLOSE);
+ return true;
+ }
+ if (!strcmp(result.Grantee,curRole) &&
+ !strcmp(result.Privilege, privilege))
+ {
+ SQLFreeStmt(hstmt, SQL_CLOSE);
+ return true;
+ }
+ retcode = SQLFetch(hstmt);
+ }
+
+ SQLFreeStmt(hstmt, SQL_CLOSE);
+ return false;
+} // wxDB::TablePrivileges()
+
+
/********** wxDB::SqlLog() **********/
bool wxDB::SqlLog(enum sqlLog state, const char *filename, bool append)
{
- assert(state == sqlLogON || state == sqlLogOFF);
- assert(state == sqlLogOFF || filename);
+ assert(state == sqlLogON || state == sqlLogOFF);
+ assert(state == sqlLogOFF || filename);
- if (state == sqlLogON)
- {
- if (fpSqlLog == 0)
- {
- fpSqlLog = fopen(filename, (append ? "at" : "wt"));
- if (fpSqlLog == NULL)
- return(FALSE);
- }
- }
- else // sqlLogOFF
- {
- if (fpSqlLog)
- {
- if (fclose(fpSqlLog))
- return(FALSE);
- fpSqlLog = 0;
- }
- }
+ if (state == sqlLogON)
+ {
+ if (fpSqlLog == 0)
+ {
+ fpSqlLog = fopen(filename, (append ? "at" : "wt"));
+ if (fpSqlLog == NULL)
+ return(FALSE);
+ }
+ }
+ else // sqlLogOFF
+ {
+ if (fpSqlLog)
+ {
+ if (fclose(fpSqlLog))
+ return(FALSE);
+ fpSqlLog = 0;
+ }
+ }
- sqlLogState = state;
- return(TRUE);
+ sqlLogState = state;
+ return(TRUE);
} // wxDB::SqlLog()
wxStrcpy(tableName, tblName); // Table Name
if (tblPath)
wxStrcpy(tablePath, tblPath); // Table Path - used for dBase files
+ else
+ tablePath[0]=0;
if (qryTblName) // Name of the table/view to query
wxStrcpy(queryTableName, qryTblName);
int i;
// char sqlStmt[DB_MAX_STATEMENT_LEN];
wxString sqlStmt;
+ wxString *s = NULL;
// Verify that the table exists in the database
- if (!pDb->TableExists(tableName,pDb->GetUsername(),tablePath))
+// if (!pDb->TableExists(tableName,pDb->GetUsername(),tablePath))
+ if (!pDb->TableExists(tableName,NULL,tablePath))
{
- wxString s;
+ s =new wxString("Table/view does not exist in the database");
+ if (*(pDb->dbInf.accessibleTables) == 'Y')
+ {
+ (*s)+=", or you have insufficient permissions.\n";
+ }
+ else
+ {
+ (*s)+=".\n";
+ }
+ }
+ else
+ {
+ // Verify the user has rights to access the table.
+ // Shortcut boolean evaluation to optimize out call to TablePrivs
+ // Unfortunely this optimization doesn't seem to be reliable!
+ if (/* *(pDb->dbInf.accessibleTables) == 'N' && */
+ !pDb->TablePrivileges(tableName,"SELECT",NULL,tablePath))
+ s = new wxString("Current logged in user has insufficient privileges to access this table.\n");
+ }
+
+ if (s)
+ {
+ wxString p;
if (wxStrcmp(tablePath,""))
- s.sprintf("Error opening '%s/%s'.\n",tablePath,tableName);
- else
- s.sprintf("Error opening '%s'.\n", tableName);
- if (!pDb->TableExists(tableName,NULL,tablePath))
- s += "Table/view does not exist in the database.\n";
- else
- s += "Current logged in user does not have sufficient privileges to access this table.\n";
- pDb->LogError(s.GetData());
+ p.sprintf("Error opening '%s/%s'.\n",tablePath,tableName);
+ else
+ p.sprintf("Error opening '%s'.\n", tableName);
+
+ p += (*s);
+ pDb->LogError(p.GetData());
+
return(FALSE);
}