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 <[email protected]> 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 <[email protected]> (cherry picked from commit 444730a67dbd2ad6cebe666b2cd23c67d5c668f2) Change-Id: Ifcc1d72cca29c031f31da203cd1e3302ea0ea3e3 Reviewed-on: https://gerrit.libreoffice.org/42701 Reviewed-by: Julien Nabet <[email protected]> Reviewed-by: Lionel Elie Mamane <[email protected]> Tested-by: Julien Nabet <[email protected]> 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() _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
