[Libreoffice-commits] core.git: Branch 'libreoffice-5-4' - dbaccess/source mysqlc/source

Julien Nabet serval2412 at yahoo.fr
Mon Sep 25 12:50:37 UTC 2017


 dbaccess/source/ui/dlg/directsql.cxx |   98 ++++++++++++++++++++++-------------
 dbaccess/source/ui/inc/directsql.hxx |    3 +
 mysqlc/source/mysqlc_statement.cxx   |    6 --
 3 files changed, 68 insertions(+), 39 deletions(-)

New commits:
commit 6d01cf0cabb1168159c3b013bc64b0a33a96f0c7
Author: Julien Nabet <serval2412 at yahoo.fr>
Date:   Sat Sep 23 13:26:58 2017 +0200

    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 at libreoffice.org>
    (cherry picked from commit 444730a67dbd2ad6cebe666b2cd23c67d5c668f2)
    
    Change-Id: Ifcc1d72cca29c031f31da203cd1e3302ea0ea3e3
    Reviewed-on: https://gerrit.libreoffice.org/42701
    Reviewed-by: Julien Nabet <serval2412 at yahoo.fr>
    Reviewed-by: Lionel Elie Mamane <lionel at mamane.lu>
    Tested-by: Julien Nabet <serval2412 at yahoo.fr>

diff --git a/dbaccess/source/ui/dlg/directsql.cxx b/dbaccess/source/ui/dlg/directsql.cxx
index 1ced37e208db..dbb7a78eb8ca 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)
+                {
+                    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))
                 {
-                    // 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())
+                    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 21c2f083cb10..7ce736a4a756 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 e881dda8ddd4..890e8f52137c 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()


More information about the Libreoffice-commits mailing list