Modified:
trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h
trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp
Log:
- implemented SQLTablePrivileges feature (needs post-build tests)
Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp 2006-08-10 14:15:52 UTC (rev 481)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp 2006-08-10 16:38:25 UTC (rev 482)
@@ -1115,6 +1115,87 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
+SQLRETURN MResultPlus::doTablePrivileges( const QString &stringCatalog, const QString
&, const QString &stringTableFilter )
+{
+ MYODBCDbgEnter();
+
+ /* create empty resultset */
+ MDescriptor *pDescriptor;
+
+ doClear();
+ getDiagnostic()->setRowCount( 0 );
+
+ pDescriptor = getImpRowDesc();
+ pDescriptor->doAppend( SQL_VARCHAR, "TABLE_CAT", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_VARCHAR, "TABLE_SCHEM", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_VARCHAR, "TABLE_NAME", SQL_NO_NULLS );
+ pDescriptor->doAppend( SQL_VARCHAR, "GRANTOR", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_VARCHAR, "GRANTEE", SQL_NO_NULLS );
+ pDescriptor->doAppend( SQL_VARCHAR, "PRIVILEGE", SQL_NO_NULLS );
+ pDescriptor->doAppend( SQL_VARCHAR, "IS_GRANTABLE", SQL_NULLABLE );
+
+ {
+ QString stringStatement;
+ MYSQL_RES * pResult = NULL;
+ MYSQL_ROW pRow;
+
+ stringStatement = "SELECT TABLE_SCHEMA AS TABLE_CAT, "
+ " TABLE_NAME, "
+ " GRANTEE, "
+ " PRIVILEGE_TYPE AS PRIVILEGE, "
+ " IS_GRANTABLE "
+ "FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES "
+ "WHERE TABLE_SCHEMA = '" + stringCatalog + "' AND "
+ " TABLE_NAME LIKE '" + stringTableFilter + "' "
+ "ORDER BY TABLE_CAT, TABLE_NAME, PRIVILEGE, GRANTEE";
+
+ if ( mysql_query( getMySQL(), stringStatement.toUtf8().data() ) )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000,
mysql_errno( getMySQL() ), mysql_error( getMySQL() ) ) );
+
+ pResult = mysql_use_result( getMySQL() );
+ if ( !pResult )
+ MYODBCDbgReturn( getDiagnostic()->doAppend( MDiagnostic::DIA_HY000,
mysql_errno( getMySQL() ), mysql_error( getMySQL() ) ) );
+
+ while ( pRow = mysql_fetch_row( pResult ) )
+ {
+ doAppendTablePrivileges( pRow[0], // catalog - we put MySQL schema in here
+ pRow[1], // table name
+ pRow[2], // grantee
+ pRow[3], // privilege
+ pRow[4] ); // is grantable
+ }
+
+ mysql_free_result( pResult );
+ }
+
+ /*!
+ \internal ODBC RULE
+
+ When SQLExecute, SQLExecDirect, SQLBulkOperations, SQLSetPos, or SQLMoreResults
is called, the SQL_DIAG_ROW_COUNT
+ field of the diagnostic data structure is set to the row count, and the row count
is cached in an implementation-dependent
+ way. SQLRowCount returns the cached row count value. The cached row count value
is valid until the statement handle is set
+ back to the prepared or allocated state, the statement is reexecuted, or
SQLCloseCursor is called. Note that if a function
+ has been called since the SQL_DIAG_ROW_COUNT field was set, the value returned by
SQLRowCount might be different from the
+ value in the SQL_DIAG_ROW_COUNT field because the SQL_DIAG_ROW_COUNT field is
reset to 0 by any function call.
+
+ \internal MYODBC RULE
+
+ Wet set SQL_DIAG_ROW_COUNT when any result set is requested - for example we also
set SQL_DIAG_ROW_COUNT for catalog
+ functions.
+ */
+ qulonglong nRows = -1;
+ if ( !SQL_SUCCEEDED( getRows( &nRows ) ) )
+ getDiagnostic()->setRowCount( -1 );
+ else
+ getDiagnostic()->setRowCount( nRows );
+
+ /* we should be at last record so next will make us eof and a subsequent next will be
first record */
+ setState( STATE_EXECUTED );
+ doNext();
+
+ MYODBCDbgReturn( SQL_SUCCESS );
+}
+
BOOLEAN MResultPlus::isValidRow()
{
BOOLEAN b;
@@ -2771,4 +2852,24 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
+SQLRETURN MResultPlus::doAppendTablePrivileges( const QVariant &variantCatalog,
+ const QVariant &variantTable,
+ const QVariant &variantGrantee,
+ const QVariant &variantPrivilege,
+ const QVariant &variantIsGrantable )
+{
+ MYODBCDbgEnter();
+ doAppend();
+
+ setData( 1, variantCatalog );
+ setData( 2, "" );
+ setData( 3, variantTable );
+ /* 4 = null */
+ setData( 5, variantGrantee );
+ setData( 6, variantPrivilege );
+ setData( 7, variantIsGrantable );
+
+ MYODBCDbgReturn( SQL_SUCCESS );
+}
+
Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h 2006-08-10 14:15:52 UTC (rev 481)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h 2006-08-10 16:38:25 UTC (rev 482)
@@ -76,7 +76,8 @@
SQLRETURN doSpecialColumns( SQLSMALLINT nIdentifierType, const QString
&stringCatalog, const QString &stringSchema, const QString &stringTable,
SQLSMALLINT nScope, SQLSMALLINT nNullable );
SQLRETURN doStatistics( const QString &stringCatalog, const QString
&stringSchema, const QString &stringTable, SQLUSMALLINT nUnique, SQLUSMALLINT
nReserved );
SQLRETURN doTables( const QString &stringCatalogFilter, const QString
&stringSchemaFilter, const QString &stringTableFilter, const QString
&stringTableTypeFilter );
- SQLRETURN doProcedures( const QString &stringCatalogFilter, const QString
&stringSchemaFilter, const QString &stringProcedureFilter );
+ SQLRETURN doProcedures( const QString &stringCatalog, const QString
&stringSchemaFilter, const QString &stringProcedureFilter );
+ SQLRETURN doTablePrivileges( const QString &stringCatalog, const QString
&stringSchemaFilter, const QString &stringTableFilter );
/* isers */
BOOLEAN isValidRow();
@@ -231,6 +232,11 @@
const QVariant &variantProcedure,
const QVariant &variantRemarks,
const QVariant &variantType );
+ SQLRETURN doAppendTablePrivileges( const QVariant &variantCatalog,
+ const QVariant &variantTable,
+ const QVariant &variantGrantee,
+ const QVariant &variantPrivilege,
+ const QVariant &variantIsGrantable );
};
#endif
Modified: trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-08-10 14:15:52 UTC (rev 481)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MStatement.cpp 2006-08-10 16:38:25 UTC (rev 482)
@@ -4493,7 +4493,7 @@
/* generate result */
MResultPlus *pResult = new MResultPlus( this );
- nReturn = pResult->doTablePrivileges( stringCatalog, stringSchema, stringProcedure
);
+ nReturn = pResult->doTablePrivileges( stringCatalog, stringSchema, stringTable );
if ( !SQL_SUCCEEDED( nReturn ) )
{
delete pResult;
| Thread |
|---|
| • Connector/ODBC 5 commit: r482 - trunk/MYSQLPlus/MYSQLPlusLib | pharvey | 10 Aug |