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/42688 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Lionel Elie Mamane <lionel@mamane.lu>
This commit is contained in:
parent
722161e264
commit
444730a67d
@ -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)
|
||||
{
|
||||
// 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 = 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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user