Kaydet (Commit) 444730a6 authored tarafından Julien Nabet's avatar Julien Nabet Kaydeden (comit) Lionel Elie Mamane

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

Thanks to Lionel for his great help

Change-Id: Ifcc1d72cca29c031f31da203cd1e3302ea0ea3e3
Reviewed-on: https://gerrit.libreoffice.org/42688Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarLionel Elie Mamane <lionel@mamane.lu>
üst 722161e2
......@@ -29,6 +29,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
{
......@@ -183,52 +184,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 = DBA_RES(STR_COMMAND_EXECUTED_SUCCESSFULLY);
......@@ -248,6 +247,35 @@ namespace dbaui
addStatusText(sStatus);
}
void DirectSQLDialog::display(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";
......
......@@ -106,6 +106,9 @@ namespace dbaui
/// adds a status text to the output list
void addOutputText(const OUString& _rMessage);
/// displays resultset
void display(css::uno::Reference< css::sdbc::XResultSet > xRS);
#ifdef DBG_UTIL
const sal_Char* impl_CheckInvariants() const;
#endif
......
......@@ -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)
......@@ -238,9 +238,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()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment