[Libreoffice-commits] core.git: 6 commits - connectivity/source
Andrzej J.R. Hunt
andrzej at ahunt.org
Wed Aug 7 10:27:15 PDT 2013
connectivity/source/drivers/firebird/Connection.cxx | 37 +++++--
connectivity/source/drivers/firebird/Connection.hxx | 4
connectivity/source/drivers/firebird/DatabaseMetaData.cxx | 6 -
connectivity/source/drivers/firebird/PreparedStatement.cxx | 14 +-
connectivity/source/drivers/firebird/ResultSet.cxx | 12 ++
connectivity/source/drivers/firebird/Statement.cxx | 54 ++---------
connectivity/source/drivers/firebird/StatementCommonBase.cxx | 47 +++++++--
connectivity/source/drivers/firebird/StatementCommonBase.hxx | 5 -
8 files changed, 104 insertions(+), 75 deletions(-)
New commits:
commit 54a138db910554e8bf2868facc85e47b1776bac2
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date: Wed Aug 7 18:18:09 2013 +0100
Commit after DDL statement. (firebird-sdbc)
Changes made in a DDL statement are only usable after a
commit in firebird, e.g. a created table won't appear etc.
Change-Id: I3b537f495b6bc96fa48ebc1a3e46205da60bb2d4
diff --git a/connectivity/source/drivers/firebird/DatabaseMetaData.cxx b/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
index cc19be6..177d041 100644
--- a/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
+++ b/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
@@ -393,20 +393,20 @@ sal_Bool SAL_CALL ODatabaseMetaData::dataDefinitionIgnoredInTransactions()
sal_Bool SAL_CALL ODatabaseMetaData::dataDefinitionCausesTransactionCommit()
throw(SQLException, RuntimeException)
{
- return sal_False;
+ return sal_True;
}
sal_Bool SAL_CALL ODatabaseMetaData::supportsDataManipulationTransactionsOnly()
throw(SQLException, RuntimeException)
{
- return sal_False;
+ return sal_True;
}
sal_Bool SAL_CALL ODatabaseMetaData::
supportsDataDefinitionAndDataManipulationTransactions()
throw(SQLException, RuntimeException)
{
- return sal_True;
+ return sal_False;
}
//----- Transaction Support --------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsTransactions()
diff --git a/connectivity/source/drivers/firebird/Statement.cxx b/connectivity/source/drivers/firebird/Statement.cxx
index 6f2ee58..5317c43 100644
--- a/connectivity/source/drivers/firebird/Statement.cxx
+++ b/connectivity/source/drivers/firebird/Statement.cxx
@@ -139,7 +139,14 @@ uno::Reference< XResultSet > SAL_CALL OStatement::executeQuery(const OUString& s
// TODO: deal with cleanup
// close();
+
evaluateStatusVector(m_statusVector, sql, *this);
+
+ if (isDDLStatement(aStatementHandle))
+ {
+ m_pConnection->commit();
+ }
+
return m_xResultSet;
}
diff --git a/connectivity/source/drivers/firebird/StatementCommonBase.cxx b/connectivity/source/drivers/firebird/StatementCommonBase.cxx
index d3ee72c..baf53ca 100644
--- a/connectivity/source/drivers/firebird/StatementCommonBase.cxx
+++ b/connectivity/source/drivers/firebird/StatementCommonBase.cxx
@@ -321,4 +321,32 @@ uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL OStatementC
return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
}
+bool OStatementCommonBase::isDDLStatement(isc_stmt_handle& aStatementHandle)
+ throw (SQLException)
+{
+ ISC_STATUS_ARRAY aStatusVector;
+ ISC_STATUS aErr;
+
+ char aInfoItems[] = {isc_info_sql_stmt_type};
+ char aResultsBuffer[8];
+
+ aErr = isc_dsql_sql_info(aStatusVector,
+ &aStatementHandle,
+ sizeof(aInfoItems),
+ aInfoItems,
+ sizeof(aResultsBuffer),
+ aResultsBuffer);
+
+ if (!aErr && aResultsBuffer[0] == isc_info_sql_stmt_type)
+ {
+ const short aBytes = (short) isc_vax_integer(aResultsBuffer+1, 2);
+ const short aStatementType = (short) isc_vax_integer(aResultsBuffer+3, aBytes);
+ if (aStatementType == isc_info_sql_stmt_ddl)
+ return true;
+ }
+ evaluateStatusVector(aStatusVector,
+ "isc_dsq_sql_info",
+ *this);
+ return false;
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/firebird/StatementCommonBase.hxx b/connectivity/source/drivers/firebird/StatementCommonBase.hxx
index 12483a6..0496b11 100644
--- a/connectivity/source/drivers/firebird/StatementCommonBase.hxx
+++ b/connectivity/source/drivers/firebird/StatementCommonBase.hxx
@@ -87,6 +87,9 @@ namespace connectivity
isc_stmt_handle& aStatementHandle,
XSQLDA*& pOutSqlda,
XSQLDA* pInSqlda=0);
+ bool isDDLStatement(isc_stmt_handle& aStatementHandle)
+ throw (::com::sun::star::sdbc::SQLException);
+
public:
::cppu::OBroadcastHelper& rBHelper;
commit 89b37927c0cd62cd648dd7d085c761545451e659
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date: Wed Aug 7 18:16:41 2013 +0100
Add error checking to commit(). (firebird-sdbc)
Change-Id: I0717fad287f95d510d044055edc11737fde0c505
diff --git a/connectivity/source/drivers/firebird/Connection.cxx b/connectivity/source/drivers/firebird/Connection.cxx
index db26523..0402581 100644
--- a/connectivity/source/drivers/firebird/Connection.cxx
+++ b/connectivity/source/drivers/firebird/Connection.cxx
@@ -492,6 +492,9 @@ void SAL_CALL OConnection::commit() throw(SQLException, RuntimeException)
{
clearStatements();
isc_commit_transaction(status_vector, &m_transactionHandle);
+ evaluateStatusVector(status_vector,
+ "isc_commit_transaction",
+ *this);
}
}
commit ebe37593c53f9fbad0e9a798834db10fc19b7479
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date: Wed Aug 7 18:10:20 2013 +0100
Clean up ResultSet management. (firebird-sdbc)
Change-Id: I00cd0aa08a5a3da17f06933ebc3422a6b4b8bc74
diff --git a/connectivity/source/drivers/firebird/PreparedStatement.cxx b/connectivity/source/drivers/firebird/PreparedStatement.cxx
index 55bba8c..f391618 100644
--- a/connectivity/source/drivers/firebird/PreparedStatement.cxx
+++ b/connectivity/source/drivers/firebird/PreparedStatement.cxx
@@ -258,6 +258,7 @@ sal_Bool SAL_CALL OPreparedStatement::execute()
MutexGuard aGuard( m_pConnection->getMutex() );
checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed);
+
ensurePrepared();
ISC_STATUS aErr;
@@ -273,9 +274,12 @@ sal_Bool SAL_CALL OPreparedStatement::execute()
evaluateStatusVector(m_statusVector, "isc_dsql_execute", *this);
}
- // TODO: check we actually got results -- ?
+ m_xResultSet = new OResultSet(m_pConnection,
+ uno::Reference< XInterface >(*this),
+ m_statementHandle,
+ m_pOutSqlda);
- return sal_True;
+ return m_xResultSet.is();
// TODO: implement handling of multiple ResultSets.
}
@@ -296,12 +300,6 @@ Reference< XResultSet > SAL_CALL OPreparedStatement::executeQuery()
throw SQLException(); // TODO: add message to exception
}
- uno::Reference< OResultSet > pResult(new OResultSet(m_pConnection,
- uno::Reference< XInterface >(*this),
- m_statementHandle,
- m_pOutSqlda));
- m_xResultSet = pResult.get();
-
return m_xResultSet;
}
// -------------------------------------------------------------------------
diff --git a/connectivity/source/drivers/firebird/Statement.cxx b/connectivity/source/drivers/firebird/Statement.cxx
index 8809330..6f2ee58 100644
--- a/connectivity/source/drivers/firebird/Statement.cxx
+++ b/connectivity/source/drivers/firebird/Statement.cxx
@@ -82,7 +82,6 @@ void SAL_CALL OStatement::release() throw()
sal_Int32 SAL_CALL OStatement::executeUpdate(const OUString& sql)
throw(SQLException, RuntimeException)
{
- // TODO: close ResultSet if existing -- so so in all 3 execute methods.
MutexGuard aGuard(m_pConnection->getMutex());
checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed);
@@ -133,12 +132,10 @@ uno::Reference< XResultSet > SAL_CALL OStatement::executeQuery(const OUString& s
SAL_WARN("connectivity.firebird", "isc_dsql_execute failed" );
}
- uno::Reference< OResultSet > pResult(new OResultSet(m_pConnection,
- uno::Reference< XInterface >(*this),
- aStatementHandle,
- pOutSqlda));
- //initializeResultSet( pResult.get() );
- m_xResultSet = pResult.get();
+ m_xResultSet = new OResultSet(m_pConnection,
+ uno::Reference< XInterface >(*this),
+ aStatementHandle,
+ pOutSqlda);
// TODO: deal with cleanup
// close();
diff --git a/connectivity/source/drivers/firebird/StatementCommonBase.cxx b/connectivity/source/drivers/firebird/StatementCommonBase.cxx
index eba79de..d3ee72c 100644
--- a/connectivity/source/drivers/firebird/StatementCommonBase.cxx
+++ b/connectivity/source/drivers/firebird/StatementCommonBase.cxx
@@ -59,11 +59,10 @@ OStatementCommonBase::~OStatementCommonBase()
void OStatementCommonBase::disposeResultSet()
{
- //free the cursor if alive
-// uno::Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY);
-// if (xComp.is())
-// xComp->dispose();
-// m_xResultSet = uno::Reference< XResultSet>();
+ uno::Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY);
+ if (xComp.is())
+ xComp->dispose();
+ m_xResultSet = uno::Reference< XResultSet>();
}
//-----------------------------------------------------------------------------
@@ -101,7 +100,7 @@ void SAL_CALL OStatementCommonBase::close( ) throw(SQLException, RuntimeExcepti
{
MutexGuard aGuard(m_pConnection->getMutex());
checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed);
-
+ disposeResultSet();
}
dispose();
}
@@ -191,11 +190,11 @@ int OStatementCommonBase::prepareAndDescribeStatement(const OUString& sql,
uno::Reference< XResultSet > SAL_CALL OStatementCommonBase::getResultSet() throw(SQLException, RuntimeException)
{
// TODO: verify we really can't support this
- return uno::Reference< XResultSet >();
-// MutexGuard aGuard( m_aMutex );
-// checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed);
+// return uno::Reference< XResultSet >();
+ MutexGuard aGuard(m_pConnection->getMutex());
+ checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed);
-// return m_xResultSet;
+ return m_xResultSet;
}
sal_Bool SAL_CALL OStatementCommonBase::getMoreResults() throw(SQLException, RuntimeException)
diff --git a/connectivity/source/drivers/firebird/StatementCommonBase.hxx b/connectivity/source/drivers/firebird/StatementCommonBase.hxx
index 99f4563..12483a6 100644
--- a/connectivity/source/drivers/firebird/StatementCommonBase.hxx
+++ b/connectivity/source/drivers/firebird/StatementCommonBase.hxx
@@ -53,7 +53,7 @@ namespace connectivity
{
protected:
- ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XResultSet> m_xResultSet; // The last ResultSet created
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet> m_xResultSet; // The last ResultSet created
// for this Statement
::std::list< ::rtl::OUString> m_aBatchList;
commit eb5e9ab4c4d6a00be96f6db760c2c64ca061e426
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date: Wed Aug 7 11:32:16 2013 +0100
Clean up statement handle on closing ResultSet. (firebird-sdbc)
Change-Id: I7e59c1939651cc55090ca3a5f1a9a388d685dc43
diff --git a/connectivity/source/drivers/firebird/ResultSet.cxx b/connectivity/source/drivers/firebird/ResultSet.cxx
index 36c59af..c91af92 100644
--- a/connectivity/source/drivers/firebird/ResultSet.cxx
+++ b/connectivity/source/drivers/firebird/ResultSet.cxx
@@ -569,7 +569,7 @@ Any SAL_CALL OResultSet::getObject( sal_Int32 columnIndex, const uno::Reference<
// -------------------------------------------------------------------------
-void SAL_CALL OResultSet::close( ) throw(SQLException, RuntimeException)
+void SAL_CALL OResultSet::close() throw(SQLException, RuntimeException)
{
SAL_INFO("connectivity.firebird", "close().");
@@ -577,6 +577,16 @@ void SAL_CALL OResultSet::close( ) throw(SQLException, RuntimeException)
MutexGuard aGuard(m_pConnection->getMutex());
checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
+ ISC_STATUS_ARRAY aStatusVector;
+ ISC_STATUS aErr;
+ aErr = isc_dsql_free_statement(aStatusVector,
+ &m_statementHandle,
+ DSQL_drop);
+ if (aErr)
+ evaluateStatusVector(aStatusVector,
+ "isc_dsql_free_statement",
+ *this);
+
}
dispose();
}
commit 211094992c610b77abd46d93b3e46b5a25fe4f95
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date: Wed Aug 7 11:06:09 2013 +0100
Fix transaction creation when autocommit disabled. (firebird-sdbc)
Change-Id: I190a90e9821961c4e972ec26ac282b05fd375d4b
diff --git a/connectivity/source/drivers/firebird/Connection.cxx b/connectivity/source/drivers/firebird/Connection.cxx
index 07b16eb..db26523 100644
--- a/connectivity/source/drivers/firebird/Connection.cxx
+++ b/connectivity/source/drivers/firebird/Connection.cxx
@@ -82,7 +82,7 @@ OConnection::OConnection(FirebirdDriver* _pDriver)
m_pDriver(_pDriver),
m_bClosed(sal_False),
m_bUseOldDateFormat(sal_False),
- m_bAutoCommit(sal_True),
+ m_bAutoCommit(sal_False),
m_bReadOnly(sal_False),
m_aTransactionIsolation(TransactionIsolation::REPEATABLE_READ),
m_DBHandler(0),
@@ -413,6 +413,7 @@ sal_Bool SAL_CALL OConnection::getAutoCommit() throw(SQLException, RuntimeExcept
}
void OConnection::setupTransaction()
+ throw (SQLException)
{
MutexGuard aGuard( m_aMutex );
ISC_STATUS status_vector[20];
@@ -445,19 +446,32 @@ void OConnection::setupTransaction()
assert( false ); // We must have a valid TransactionIsolation.
}
- static char isc_tpb[] = {
- isc_tpb_version3,
- (char) (m_bAutoCommit ? isc_tpb_autocommit : 0),
- (char) (!m_bReadOnly ? isc_tpb_write : isc_tpb_read),
- aTransactionIsolation,
- isc_tpb_wait
- };
+ // You cannot pass an empty tpb parameter so we have to do some pointer
+ // arithmetic to avoid problems. (i.e. aTPB[x] = 0 is invalid)
+ char aTPB[5];
+ char* pTPB = aTPB;
- isc_start_transaction(status_vector, &m_transactionHandle, 1, &m_DBHandler,
- (unsigned short) sizeof(isc_tpb), isc_tpb);
+ *pTPB++ = isc_tpb_version3;
+ if (m_bAutoCommit)
+ *pTPB++ = isc_tpb_autocommit;
+ *pTPB++ = (!m_bReadOnly ? isc_tpb_write : isc_tpb_read);
+ *pTPB++ = aTransactionIsolation;
+ *pTPB++ = isc_tpb_wait;
+
+ isc_start_transaction(status_vector,
+ &m_transactionHandle,
+ 1,
+ &m_DBHandler,
+ pTPB - aTPB, // bytes used in TPB
+ aTPB);
+
+ evaluateStatusVector(status_vector,
+ "isc_start_transaction",
+ *this);
}
isc_tr_handle& OConnection::getTransaction()
+ throw (SQLException)
{
MutexGuard aGuard( m_aMutex );
if (!m_transactionHandle)
diff --git a/connectivity/source/drivers/firebird/Connection.hxx b/connectivity/source/drivers/firebird/Connection.hxx
index fcc59ef..5e35b36 100644
--- a/connectivity/source/drivers/firebird/Connection.hxx
+++ b/connectivity/source/drivers/firebird/Connection.hxx
@@ -111,7 +111,7 @@ namespace connectivity
void buildTypeInfo() throw( ::com::sun::star::sdbc::SQLException);
- void setupTransaction();
+ void setupTransaction() throw(::com::sun::star::sdbc::SQLException);
void clearStatements();
public:
virtual void construct( const ::rtl::OUString& url,
@@ -166,7 +166,7 @@ namespace connectivity
::rtl::OUString getConnectionURL() const { return m_sConnectionURL; }
sal_Bool isEmbedded() const { return m_bIsEmbedded; }
- isc_tr_handle& getTransaction();
+ isc_tr_handle& getTransaction() throw(::com::sun::star::sdbc::SQLException);
/**
* Create a new Blob tied to this connection. Blobs are tied to a
commit 67596ee0b1ad4fa7268488d16ca20ee2d3032d97
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date: Wed Aug 7 10:39:16 2013 +0100
Remove unnecessarily duplicated execute/executeQuery. (firebird-sdbc)
Change-Id: Ic173346c4cac140b9426560af9a9b196d93ec2f5
diff --git a/connectivity/source/drivers/firebird/Statement.cxx b/connectivity/source/drivers/firebird/Statement.cxx
index 7378e5c..8809330 100644
--- a/connectivity/source/drivers/firebird/Statement.cxx
+++ b/connectivity/source/drivers/firebird/Statement.cxx
@@ -149,39 +149,9 @@ uno::Reference< XResultSet > SAL_CALL OStatement::executeQuery(const OUString& s
sal_Bool SAL_CALL OStatement::execute(const OUString& sql)
throw(SQLException, RuntimeException)
{
- SAL_INFO("connectivity.firebird", "executeQuery(). "
- "Got called with sql: " << sql);
-
- MutexGuard aGuard(m_pConnection->getMutex());
- checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed);
-
- XSQLDA* pOutSqlda = 0;
- isc_stmt_handle aStatementHandle = 0;
- int aErr = 0;
-
- aErr = prepareAndDescribeStatement(sql,
- aStatementHandle,
- pOutSqlda);
-
- if (aErr)
- {
- SAL_WARN("connectivity.firebird", "prepareAndDescribeStatement failed" );
- }
- else
- {
- aErr = isc_dsql_execute(m_statusVector,
- &m_pConnection->getTransaction(),
- &aStatementHandle,
- 1,
- NULL);
- if (aErr)
- SAL_WARN("connectivity.firebird", "isc_dsql_execute failed" );
- }
-
- evaluateStatusVector(m_statusVector, sql, *this);
-
- // returns true when a resultset is available
- return sal_False;
+ uno::Reference< XResultSet > xResults = executeQuery(sql);
+ return xResults.is();
+ // TODO: what if we have multiple results?
}
uno::Reference< XConnection > SAL_CALL OStatement::getConnection()
More information about the Libreoffice-commits
mailing list