List:Commits« Previous MessageNext Message »
From:pharvey Date:August 11 2006 2:03pm
Subject:Connector/ODBC 5 commit: r489 - trunk/MYSQLPlus/MYSQLPlusLib
View as plain text  
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/MYSQLPlusLibpharvey11 Aug