tdf#103685: "Commands out of sync" when connecting to MySQL using direct

Thanks to Lionel for his great help

Reviewed-on: https://gerrit.libreoffice.org/42688
Tested-by: Jenkins <ci@libreoffice.org>
(cherry picked from commit 444730a67dbd2ad6cebe666b2cd23c67d5c668f2)

Change-Id: Ifcc1d72cca29c031f31da203cd1e3302ea0ea3e3
Reviewed-on: https://gerrit.libreoffice.org/42701
Reviewed-by: Julien Nabet <serval2412@yahoo.fr>
Reviewed-by: Lionel Elie Mamane <lionel@mamane.lu>
Tested-by: Julien Nabet <serval2412@yahoo.fr>
diff --git a/dbaccess/source/ui/dlg/directsql.cxx b/dbaccess/source/ui/dlg/directsql.cxx
index 1ced37e..dbb7a78 100644
--- a/dbaccess/source/ui/dlg/directsql.cxx
+++ b/dbaccess/source/ui/dlg/directsql.cxx
@@ -27,6 +27,7 @@
#include <rtl/strbuf.hxx>
#include <com/sun/star/sdbc/SQLException.hpp>
#include <com/sun/star/sdbc/XRow.hpp>
#include <com/sun/star/sdbc/XMultipleResults.hpp>

namespace dbaui
{
@@ -182,52 +183,50 @@ namespace dbaui
        ::osl::MutexGuard aGuard(m_aMutex);

        OUString sStatus;
        css::uno::Reference< css::sdbc::XResultSet > xResultSet;

        // clear the output box
        m_pOutput->SetText(OUString());
        try
        {
            // create a statement
            Reference< XStatement > xStatement = m_xConnection->createStatement();
            OSL_ENSURE(xStatement.is(), "DirectSQLDialog::implExecuteStatement: no statement returned by the connection!");
            css::uno::Reference< css::sdbc::XMultipleResults > xMR ( xStatement, UNO_QUERY );

            // clear the output box
            m_pOutput->SetText(OUString());
            if (xStatement.is())
            if (xMR.is())
            {
                if (_rStatement.toAsciiUpperCase().startsWith("SELECT") && m_pShowOutput->IsChecked())
                bool hasRS = xStatement->execute(_rStatement);
                if(hasRS)
                {
                    // execute it as a query
                    xResultSet = xStatement->executeQuery(_rStatement);
                    // get a handle for the rows
                    css::uno::Reference< css::sdbc::XRow > xRow( xResultSet, css::uno::UNO_QUERY );
                    // work through each of the rows
                    while (xResultSet->next())
                    css::uno::Reference< css::sdbc::XResultSet > xRS (xMR->getResultSet());
                    if (m_pShowOutput->IsChecked())
                        display(xRS);
                }
                else
                    addOutputText(OUString::number(xMR->getUpdateCount()) + " rows updated\n");
                while ((hasRS=xMR->getMoreResults()) || (xMR->getUpdateCount() != -1))
                {
                    if(hasRS)
                    {
                        // initialise the output line for each row
                        OUString out("");
                        // work along the columns until that are none left
                        try
                        {
                            int i = 1;
                            for (;;)
                            {
                                // be dumb, treat everything as a string
                                out += xRow->getString(i) + ",";
                                i++;
                            }
                        }
                        // trap for when we fall off the end of the row
                        catch (const SQLException&)
                        {
                        }
                        // report the output
                        addOutputText(out);
                        css::uno::Reference< css::sdbc::XResultSet > xRS (xMR->getResultSet());
                        if (m_pShowOutput->IsChecked())
                            display(xRS);
                    }
                } else {
                    // execute it
                    xStatement->execute(_rStatement);
                }
            }

            else
            {
                if (_rStatement.toAsciiUpperCase().startsWith("SELECT"))
                {
                    css::uno::Reference< css::sdbc::XResultSet > xRS = xStatement->executeQuery(_rStatement);
                    if(m_pShowOutput->IsChecked())
                        display(xRS);
                }
                else
                {
                    sal_Int32 resultCount = xStatement->executeUpdate(_rStatement);
                    addOutputText(OUString::number(resultCount) + " rows updated\n");
                }
            }
            // successful
            sStatus = ModuleRes(STR_COMMAND_EXECUTED_SUCCESSFULLY);

@@ -247,6 +246,35 @@ namespace dbaui
        addStatusText(sStatus);
    }

    void DirectSQLDialog::display(const css::uno::Reference< css::sdbc::XResultSet >& xRS)
    {
        // get a handle for the rows
        css::uno::Reference< css::sdbc::XRow > xRow( xRS, css::uno::UNO_QUERY );
        // work through each of the rows
        while (xRS->next())
        {
            // initialise the output line for each row
            OUString out("");
            // work along the columns until that are none left
            try
            {
                int i = 1;
                for (;;)
                {
                    // be dumb, treat everything as a string
                    out += xRow->getString(i) + ",";
                    i++;
                }
            }
            // trap for when we fall off the end of the row
            catch (const SQLException&)
            {
            }
            // report the output
            addOutputText(out);
        }
    }

    void DirectSQLDialog::addStatusText(const OUString& _rMessage)
    {
        OUString sAppendMessage = OUString::number(m_nStatusCount++) + ": " + _rMessage + "\n\n";
diff --git a/dbaccess/source/ui/inc/directsql.hxx b/dbaccess/source/ui/inc/directsql.hxx
index 21c2f08..7ce736a 100644
--- a/dbaccess/source/ui/inc/directsql.hxx
+++ b/dbaccess/source/ui/inc/directsql.hxx
@@ -107,6 +107,9 @@ namespace dbaui
        /// adds a status text to the output list
        void addOutputText(const OUString& _rMessage);

        /// displays resultset
        void display(const css::uno::Reference< css::sdbc::XResultSet >& xRS);

#ifdef DBG_UTIL
        const sal_Char* impl_CheckInvariants() const;
#endif
diff --git a/mysqlc/source/mysqlc_statement.cxx b/mysqlc/source/mysqlc_statement.cxx
index e881dda..890e8f5 100644
--- a/mysqlc/source/mysqlc_statement.cxx
+++ b/mysqlc/source/mysqlc_statement.cxx
@@ -175,7 +175,7 @@ Reference< XConnection > SAL_CALL OCommonStatement::getConnection()

sal_Int32 SAL_CALL OCommonStatement::getUpdateCount()
{
    return 0;
    return cppStatement->getUpdateCount();
}

Any SAL_CALL OStatement::queryInterface(const Type & rType)
@@ -240,9 +240,7 @@ sal_Bool SAL_CALL OCommonStatement::getMoreResults()
    MutexGuard aGuard(m_aMutex);
    checkDisposed(rBHelper.bDisposed);

    // if your driver supports more than only one resultset
    // and has one more at this moment return true
    return false;
    return cppStatement->getMoreResults();
}

Any SAL_CALL OCommonStatement::getWarnings()