Modified:
trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h
Log:
- more work on SQLProcedureColumns
Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp 2006-08-11 10:57:25 UTC (rev 488)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.cpp 2006-08-11 12:03:00 UTC (rev 489)
@@ -1229,7 +1229,8 @@
" IS_GRANTABLE "
"FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES "
"WHERE TABLE_SCHEMA = '" + stringCatalog + "' AND "
- " TABLE_NAME LIKE '" + stringTableFilter + "' "
+ " TABLE_NAME LIKE '" + stringTableFilter + "' AND "
+ " COLUMN_NAME LIKE '" + stringColumnFilter + "' "
"ORDER BY TABLE_CAT, TABLE_NAME, COLUMN_NAME, PRIVILEGE,
GRANTEE";
if ( mysql_query( getMySQL(), stringStatement.toUtf8().data() ) )
@@ -1280,6 +1281,127 @@
MYODBCDbgReturn( SQL_SUCCESS );
}
+SQLRETURN MResultPlus::doProcedureColumns( const QString &stringCatalog, const
QString &, const QString &stringProcedure, const QString &stringColumnFilter
)
+{
+ MYODBCDbgEnter();
+
+ /*!
+ \internal ODBC RULE
+
+ SQLProcedureColumns might not return all columns used by a procedure. For
example, a driver might return
+ only information about the parameters used by a procedure and not the columns in
a result set it generates.
+
+ \internal MYODBC RULE
+
+ We only return information on procedure parameters.
+ */
+
+ /* create empty resultset */
+ MDescriptor *pDescriptor;
+
+ doClear();
+ getDiagnostic()->setRowCount( 0 );
+
+ pDescriptor = getImpRowDesc();
+ pDescriptor->doAppend( SQL_VARCHAR, "PROCEDURE_CAT", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_VARCHAR, "PROCEDURE_SCHEM", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_VARCHAR, "PROCEDURE_NAME", SQL_NO_NULLS );
+ pDescriptor->doAppend( SQL_VARCHAR, "COLUMN_NAME", SQL_NO_NULLS );
+ pDescriptor->doAppend( SQL_SMALLINT, "COLUMN_TYPE", SQL_NO_NULLS );
+ pDescriptor->doAppend( SQL_SMALLINT, "DATA_TYPE", SQL_NO_NULLS );
+ pDescriptor->doAppend( SQL_VARCHAR, "TYPE_NAME", SQL_NO_NULLS );
+ pDescriptor->doAppend( SQL_INTEGER, "COLUMN_SIZE", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_INTEGER, "BUFFER_LENGTH", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_SMALLINT, "DECIMAL_DIGITS", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_SMALLINT, "NUM_PREC_RADIX", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_SMALLINT, "NULLABLE", SQL_NO_NULLS );
+ pDescriptor->doAppend( SQL_VARCHAR, "REMARKS", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_VARCHAR, "COLUMN_DEF", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_SMALLINT, "SQL_DATA_TYPE", SQL_NO_NULLS );
+ pDescriptor->doAppend( SQL_SMALLINT, "SQL_DATETIME_SUB", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_INTEGER, "CHAR_OCTET_LENGTH", SQL_NULLABLE );
+ pDescriptor->doAppend( SQL_INTEGER, "ORDINAL_POSITION", SQL_NO_NULLS );
+ pDescriptor->doAppend( SQL_VARCHAR, "IS_NULLABLE", SQL_NULLABLE );
+
+ QString stringCreateProcedureCommand;
+ {
+ QString stringStatement;
+ MYSQL_RES * pResult = NULL;
+ MYSQL_ROW pRow;
+
+ /*! \todo handle FUNCTION */
+ stringStatement = "SHOW CREATE PROCEDURE ";
+ if ( !stringCatalog.isEmpty() )
+ stringStatement += ( stringCatalog + "." );
+ stringStatement += stringProcedure;
+
+ 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() ) ) );
+
+ if ( pRow = mysql_fetch_row( pResult ) )
+ stringCreateProcedureCommand = pRow[2];
+
+ mysql_free_result( pResult );
+ }
+
+ /* use MCommand to parse params */
+ if ( !stringCreateProcedureCommand.isEmpty() )
+ {
+ /* This is an exampleof what we may get back...
+
+ CREATE DEFINER=`root`@`localhost` PROCEDURE `insAdo`( IN bin VARBINARY(1024),
IN txt TEXT, IN n INT, IN vc VARCHAR(50) )
+ BEGIN
+ INSERT INTO tbAdo VALUES( @bin, @txt, @n, @vc );
+ END
+
+ */
++++
+ MCommands * pCommands = new MCommands( getConnection() );
+ if ( SQL_SUCCEEDED( pCommands->setCommands( stringCreateProcedureCommand ) ) )
+ {
+ pCommands->doFirst();
+ MCommand *pCommand = pCommands->getCommand();
+ if ( pCommand )
+ {
+ pCommand->
+ }
+ }
+
+ delete pCommands;
+ }
+
+ /*!
+ \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;
Modified: trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h
===================================================================
--- trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h 2006-08-11 10:57:25 UTC (rev 488)
+++ trunk/MYSQLPlus/MYSQLPlusLib/MResultPlus.h 2006-08-11 12:03:00 UTC (rev 489)
@@ -79,6 +79,7 @@
SQLRETURN doProcedures( const QString &stringCatalog, const QString
&stringSchemaFilter, const QString &stringProcedureFilter );
SQLRETURN doTablePrivileges( const QString &stringCatalog, const QString
&stringSchemaFilter, const QString &stringTableFilter );
SQLRETURN doColumnPrivileges( const QString &stringCatalog, const QString
&stringSchemaFilter, const QString &stringTableFilter, const QString
&stringColumnFilter );
+ SQLRETURN doProcedureColumns( const QString &stringCatalog, const QString
&stringSchema, const QString &stringProcedure, const QString
&stringColumnFilter );
/* isers */
BOOLEAN isValidRow();
| Thread |
|---|
| • Connector/ODBC 5 commit: r489 - trunk/MYSQLPlus/MYSQLPlusLib | pharvey | 11 Aug |