connectivity/source/drivers/firebird/FConnection.cxx | 235 ++++++++----- connectivity/source/drivers/firebird/FConnection.hxx | 12 connectivity/source/drivers/firebird/FDatabaseMetaData.cxx | 18 connectivity/source/drivers/firebird/FDatabaseMetaData.hxx | 1 4 files changed, 157 insertions(+), 109 deletions(-)
New commits: commit 699aa1aff95b517d4a749f548526ca62bef912db Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Fri Jul 12 09:45:39 2013 +0100 Remove unnecessary catalog state (unsupported in firebird). Change-Id: I34a7a245eb87a5b0d626be4008e2584774e82cf3 diff --git a/connectivity/source/drivers/firebird/FConnection.cxx b/connectivity/source/drivers/firebird/FConnection.cxx index 89d1967..0735d24 100644 --- a/connectivity/source/drivers/firebird/FConnection.cxx +++ b/connectivity/source/drivers/firebird/FConnection.cxx @@ -71,15 +71,16 @@ using namespace connectivity::firebird; using namespace connectivity; -using namespace com::sun::star; -using namespace com::sun::star::beans; -using namespace com::sun::star::document; -using namespace com::sun::star::embed; -using namespace com::sun::star::frame; -using namespace com::sun::star::io; -using namespace com::sun::star::lang; -using namespace com::sun::star::sdbc; -using namespace com::sun::star::uno; +using namespace ::com::sun::star; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::document; +using namespace ::com::sun::star::embed; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::io; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::uno; const OUString OConnection::sDBLocation( "firebird.fdb" ); @@ -92,7 +93,6 @@ OConnection::OConnection(FirebirdDriver* _pDriver) m_sUser(), m_pDriver(_pDriver), m_bClosed(sal_False), - m_bUseCatalog(sal_False), m_bUseOldDateFormat(sal_False), m_bAutoCommit(sal_True), m_bReadOnly(sal_False), @@ -493,7 +493,7 @@ sal_Bool SAL_CALL OConnection::isReadOnly() throw(SQLException, RuntimeException void SAL_CALL OConnection::setCatalog(const OUString& catalog) throw(SQLException, RuntimeException) { - // Unsupported + ::dbtools::throwFeatureNotImplementedException( "XConnection::setCatalog", *this ); (void) catalog; } @@ -519,23 +519,21 @@ sal_Int32 SAL_CALL OConnection::getTransactionIsolation( ) throw(SQLException, return m_aTransactionIsolation; } -// -------------------------------------------------------------------------------- -Reference< ::com::sun::star::container::XNameAccess > SAL_CALL OConnection::getTypeMap( ) throw(SQLException, RuntimeException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OConnection_BASE::rBHelper.bDisposed); - - // if your driver has special database types you can return it here - return NULL; +Reference< XNameAccess > SAL_CALL OConnection::getTypeMap() throw(SQLException, RuntimeException) +{ + ::dbtools::throwFeatureNotImplementedException( "XConnection::getTypeMap", *this ); + return 0; } -// -------------------------------------------------------------------------------- -void SAL_CALL OConnection::setTypeMap( const Reference< ::com::sun::star::container::XNameAccess >& typeMap ) throw(SQLException, RuntimeException) + +void SAL_CALL OConnection::setTypeMap(const Reference< XNameAccess >& typeMap) + throw(SQLException, RuntimeException) { - // the other way around + ::dbtools::throwFeatureNotImplementedException( "XConnection::setTypeMap", *this ); + (void) typeMap; } -// -------------------------------------------------------------------------------- -// XCloseable + +//----- XCloseable ----------------------------------------------------------- void SAL_CALL OConnection::close( ) throw(SQLException, RuntimeException) { SAL_INFO("connectivity.firebird", "=> OConnection::close()."); diff --git a/connectivity/source/drivers/firebird/FConnection.hxx b/connectivity/source/drivers/firebird/FConnection.hxx index 0ca035c..e91aef6 100644 --- a/connectivity/source/drivers/firebird/FConnection.hxx +++ b/connectivity/source/drivers/firebird/FConnection.hxx @@ -106,7 +106,6 @@ namespace connectivity // driver object sal_Bool m_bClosed; - sal_Bool m_bUseCatalog; // should we use the catalog on filebased databases sal_Bool m_bUseOldDateFormat; sal_Bool m_bAutoCommit; sal_Bool m_bReadOnly; @@ -167,8 +166,6 @@ namespace connectivity // css.lang.XEventListener virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); - // should we use the catalog on filebased databases - inline sal_Bool isCatalogUsed() const { return m_bUseCatalog; } inline ::rtl::OUString getUserName() const { return m_sUser; } inline isc_db_handle getDBHandler() const { return m_DBHandler; } inline FirebirdDriver* getDriver() const { return m_pDriver;} diff --git a/connectivity/source/drivers/firebird/FDatabaseMetaData.cxx b/connectivity/source/drivers/firebird/FDatabaseMetaData.cxx index 80c4470..0bdcc17 100644 --- a/connectivity/source/drivers/firebird/FDatabaseMetaData.cxx +++ b/connectivity/source/drivers/firebird/FDatabaseMetaData.cxx @@ -61,17 +61,10 @@ namespace connectivity ODatabaseMetaData::ODatabaseMetaData(OConnection* _pCon) : m_pConnection(_pCon) -, m_bUseCatalog(sal_True) { OSL_ENSURE(m_pConnection,"ODatabaseMetaData::ODatabaseMetaData: No connection set!"); - if(!m_pConnection->isCatalogUsed()) - { - osl_atomic_increment( &m_refCount ); - m_bUseCatalog = !(usesLocalFiles() || usesLocalFilePerTable()); - osl_atomic_decrement( &m_refCount ); - } } -// ------------------------------------------------------------------------- + ODatabaseMetaData::~ODatabaseMetaData() { } @@ -79,9 +72,6 @@ ODatabaseMetaData::~ODatabaseMetaData() ::rtl::OUString SAL_CALL ODatabaseMetaData::getCatalogSeparator( ) throw(SQLException, RuntimeException) { ::rtl::OUString aVal; - if(m_bUseCatalog) - { // do some special here for you database - } return aVal; } @@ -218,9 +208,6 @@ sal_Bool SAL_CALL ODatabaseMetaData::supportsNonNullableColumns( ) throw(SQLExc ::rtl::OUString SAL_CALL ODatabaseMetaData::getCatalogTerm( ) throw(SQLException, RuntimeException) { ::rtl::OUString aVal; - if(m_bUseCatalog) - { - } return aVal; } // ------------------------------------------------------------------------- @@ -245,9 +232,6 @@ sal_Bool SAL_CALL ODatabaseMetaData::supportsDifferentTableCorrelationNames( ) sal_Bool SAL_CALL ODatabaseMetaData::isCatalogAtStart( ) throw(SQLException, RuntimeException) { sal_Bool bValue = sal_False; - if(m_bUseCatalog) - { - } return bValue; } // ------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/firebird/FDatabaseMetaData.hxx b/connectivity/source/drivers/firebird/FDatabaseMetaData.hxx index a2852e0..414dcac 100644 --- a/connectivity/source/drivers/firebird/FDatabaseMetaData.hxx +++ b/connectivity/source/drivers/firebird/FDatabaseMetaData.hxx @@ -53,7 +53,6 @@ namespace connectivity class ODatabaseMetaData : public ODatabaseMetaData_BASE { OConnection* m_pConnection; - sal_Bool m_bUseCatalog; public: inline OConnection* getOwnConnection() const { return m_pConnection; } commit c5587174570b9f1f64c03eccdc530f7b2e4ae582 Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Fri Jul 12 09:27:49 2013 +0100 Clean up and remove warnings for unsupported methods. Change-Id: Id1a6c3c438c88791654ca9f301dbc7763caebeab diff --git a/connectivity/source/drivers/firebird/FConnection.cxx b/connectivity/source/drivers/firebird/FConnection.cxx index 25aa251..89d1967 100644 --- a/connectivity/source/drivers/firebird/FConnection.cxx +++ b/connectivity/source/drivers/firebird/FConnection.cxx @@ -489,23 +489,18 @@ sal_Bool SAL_CALL OConnection::isReadOnly() throw(SQLException, RuntimeException return m_bReadOnly; } -// -------------------------------------------------------------------------------- -void SAL_CALL OConnection::setCatalog( const ::rtl::OUString& catalog ) throw(SQLException, RuntimeException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OConnection_BASE::rBHelper.bDisposed); - // if your database doesn't work with catalogs you go to next method otherwise you kjnow what to do -} -// -------------------------------------------------------------------------------- -::rtl::OUString SAL_CALL OConnection::getCatalog( ) throw(SQLException, RuntimeException) +void SAL_CALL OConnection::setCatalog(const OUString& catalog) + throw(SQLException, RuntimeException) { - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OConnection_BASE::rBHelper.bDisposed); - + // Unsupported + (void) catalog; +} - // return your current catalog - return ::rtl::OUString(); +OUString SAL_CALL OConnection::getCatalog() throw(SQLException, RuntimeException) +{ + // Unsupported + return OUString(); } void SAL_CALL OConnection::setTransactionIsolation( sal_Int32 level ) throw(SQLException, RuntimeException) commit 3055c14b252087d8b628a64d284fe568d22bfa88 Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Fri Jul 12 09:11:52 2013 +0100 Implement transaction isolation in firebird-sdbc. Change-Id: Id18c26cbd62b2cf9573ffafcd3da0041c2d8e9c5 diff --git a/connectivity/source/drivers/firebird/FConnection.cxx b/connectivity/source/drivers/firebird/FConnection.cxx index f919276..25aa251 100644 --- a/connectivity/source/drivers/firebird/FConnection.cxx +++ b/connectivity/source/drivers/firebird/FConnection.cxx @@ -96,6 +96,7 @@ OConnection::OConnection(FirebirdDriver* _pDriver) m_bUseOldDateFormat(sal_False), m_bAutoCommit(sal_True), m_bReadOnly(sal_False), + m_aTransactionIsolation(TransactionIsolation::REPEATABLE_READ), m_DBHandler(0), m_transactionHandle(0) { @@ -383,11 +384,31 @@ void OConnection::setupTransaction() isc_rollback_transaction(status_vector, &m_transactionHandle); } + char aTransactionIsolation = 0; + switch (m_aTransactionIsolation) + { + // TODO: confirm that these are correct. + case(TransactionIsolation::READ_UNCOMMITTED): + aTransactionIsolation = isc_tpb_concurrency; + break; + case(TransactionIsolation::READ_COMMITTED): + aTransactionIsolation = isc_tpb_read_committed; + break; + case(TransactionIsolation::REPEATABLE_READ): + aTransactionIsolation = isc_tpb_consistency; + break; + case(TransactionIsolation::SERIALIZABLE): + aTransactionIsolation = isc_tpb_consistency; + break; + default: + 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), - isc_tpb_read_committed, // TODO: set isolation level here + aTransactionIsolation, isc_tpb_wait }; @@ -486,24 +507,22 @@ void SAL_CALL OConnection::setCatalog( const ::rtl::OUString& catalog ) throw(SQ // return your current catalog return ::rtl::OUString(); } -// -------------------------------------------------------------------------------- + void SAL_CALL OConnection::setTransactionIsolation( sal_Int32 level ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - // set your isolation level - // please have a look at @see com.sun.star.sdbc.TransactionIsolation + m_aTransactionIsolation = level; + setupTransaction(); } -// -------------------------------------------------------------------------------- + sal_Int32 SAL_CALL OConnection::getTransactionIsolation( ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - - // please have a look at @see com.sun.star.sdbc.TransactionIsolation - return TransactionIsolation::NONE; + return m_aTransactionIsolation; } // -------------------------------------------------------------------------------- Reference< ::com::sun::star::container::XNameAccess > SAL_CALL OConnection::getTypeMap( ) throw(SQLException, RuntimeException) diff --git a/connectivity/source/drivers/firebird/FConnection.hxx b/connectivity/source/drivers/firebird/FConnection.hxx index 543b4b0..0ca035c 100644 --- a/connectivity/source/drivers/firebird/FConnection.hxx +++ b/connectivity/source/drivers/firebird/FConnection.hxx @@ -110,6 +110,9 @@ namespace connectivity sal_Bool m_bUseOldDateFormat; sal_Bool m_bAutoCommit; sal_Bool m_bReadOnly; + + sal_Int32 m_aTransactionIsolation; + isc_db_handle m_DBHandler; isc_tr_handle m_transactionHandle; commit 0d99864d19b68d2fb829bf8a54fb8ca9804302d8 Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Fri Jul 12 08:34:34 2013 +0100 Make db location a static member variable. Change-Id: I138c18839f2816baae24ef84eb08dbb71cce2948 diff --git a/connectivity/source/drivers/firebird/FConnection.cxx b/connectivity/source/drivers/firebird/FConnection.cxx index 3f0f070..f919276 100644 --- a/connectivity/source/drivers/firebird/FConnection.cxx +++ b/connectivity/source/drivers/firebird/FConnection.cxx @@ -81,6 +81,8 @@ using namespace com::sun::star::lang; using namespace com::sun::star::sdbc; using namespace com::sun::star::uno; +const OUString OConnection::sDBLocation( "firebird.fdb" ); + OConnection::OConnection(FirebirdDriver* _pDriver) :OMetaConnection_BASE(m_aMutex), OSubComponent<OConnection, OConnection_BASE>((::cppu::OWeakObject*)_pDriver, this), @@ -173,7 +175,6 @@ void OConnection::construct(const ::rtl::OUString& url, const Sequence< Property bIsNewDatabase = !m_xEmbeddedStorage->hasElements(); - const OUString sDBName( "firebird.fdb" ); // Location within .odb container m_aURL = utl::TempFile::CreateTempName() + ".fdb"; SAL_INFO("connectivity.firebird", "Temporary .fdb location: " @@ -181,14 +182,14 @@ void OConnection::construct(const ::rtl::OUString& url, const Sequence< Property if (!bIsNewDatabase) { SAL_INFO("connectivity.firebird", "Extracting .fdb from .odb" ); - if (!m_xEmbeddedStorage->isStreamElement(sDBName)) + if (!m_xEmbeddedStorage->isStreamElement(sDBLocation)) { ::connectivity::SharedResources aResources; const OUString sMessage = aResources.getResourceString(STR_ERROR_NEW_VERSION); ::dbtools::throwGenericSQLException(sMessage ,*this); } - Reference< XStream > xDBStream(m_xEmbeddedStorage->openStreamElement(sDBName, + Reference< XStream > xDBStream(m_xEmbeddedStorage->openStreamElement(sDBLocation, ElementModes::READ)); uno::Reference< ucb::XSimpleFileAccess2 > xFileAccess( @@ -554,11 +555,9 @@ void SAL_CALL OConnection::documentEventOccured( const DocumentEvent& _Event ) { if ( m_bIsEmbedded && m_xEmbeddedStorage.is() ) { - const OUString sDBName( "firebird.fdb" ); // Location within .odb container - SAL_INFO("connectivity.firebird", "Writing .fdb into .odb" ); - Reference< XStream > xDBStream(m_xEmbeddedStorage->openStreamElement(sDBName, + Reference< XStream > xDBStream(m_xEmbeddedStorage->openStreamElement(sDBLocation, ElementModes::WRITE)); using namespace ::comphelper; diff --git a/connectivity/source/drivers/firebird/FConnection.hxx b/connectivity/source/drivers/firebird/FConnection.hxx index d8338b3..543b4b0 100644 --- a/connectivity/source/drivers/firebird/FConnection.hxx +++ b/connectivity/source/drivers/firebird/FConnection.hxx @@ -82,7 +82,7 @@ namespace connectivity friend class connectivity::firebird::OSubComponent<OConnection, OConnection_BASE>; protected: - + static const OUString sDBLocation; // Location within .odb container rtl_TextEncoding m_nTextEncoding; // the encoding which is used for all text conversions //==================================================================== // Data attributes commit 26897cd0720e4bacace486ffc18b7a3b1f38b315 Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Fri Jul 12 08:17:20 2013 +0100 Implement readonly support in firebird-sdbc. Change-Id: Ifdb235a3772b92b7064d059700084f75d468d146 diff --git a/connectivity/source/drivers/firebird/FConnection.cxx b/connectivity/source/drivers/firebird/FConnection.cxx index aa4bf72..3f0f070 100644 --- a/connectivity/source/drivers/firebird/FConnection.cxx +++ b/connectivity/source/drivers/firebird/FConnection.cxx @@ -93,6 +93,7 @@ OConnection::OConnection(FirebirdDriver* _pDriver) m_bUseCatalog(sal_False), m_bUseOldDateFormat(sal_False), m_bAutoCommit(sal_True), + m_bReadOnly(sal_False), m_DBHandler(0), m_transactionHandle(0) { @@ -383,11 +384,10 @@ void OConnection::setupTransaction() static char isc_tpb[] = { isc_tpb_version3, - (m_bAutoCommit ? isc_tpb_autocommit : 0), - isc_tpb_write, - isc_tpb_read_committed, - isc_tpb_wait, - isc_tpb_no_rec_version + (char) (m_bAutoCommit ? isc_tpb_autocommit : 0), + (char) (!m_bReadOnly ? isc_tpb_write : isc_tpb_read), + isc_tpb_read_committed, // TODO: set isolation level here + isc_tpb_wait }; isc_start_transaction(status_vector, &m_transactionHandle, 1, &m_DBHandler, @@ -449,22 +449,23 @@ Reference< XDatabaseMetaData > SAL_CALL OConnection::getMetaData( ) throw(SQLEx return xMetaData; } -// -------------------------------------------------------------------------------- -void SAL_CALL OConnection::setReadOnly( sal_Bool readOnly ) throw(SQLException, RuntimeException) + +void SAL_CALL OConnection::setReadOnly(sal_Bool readOnly) + throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - // set you connection to readonly + m_bReadOnly = readOnly; + setupTransaction(); } -// -------------------------------------------------------------------------------- -sal_Bool SAL_CALL OConnection::isReadOnly( ) throw(SQLException, RuntimeException) + +sal_Bool SAL_CALL OConnection::isReadOnly() throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - // return if your connection to readonly - return sal_False; + return m_bReadOnly; } // -------------------------------------------------------------------------------- void SAL_CALL OConnection::setCatalog( const ::rtl::OUString& catalog ) throw(SQLException, RuntimeException) diff --git a/connectivity/source/drivers/firebird/FConnection.hxx b/connectivity/source/drivers/firebird/FConnection.hxx index fb9b0a8..d8338b3 100644 --- a/connectivity/source/drivers/firebird/FConnection.hxx +++ b/connectivity/source/drivers/firebird/FConnection.hxx @@ -109,6 +109,7 @@ namespace connectivity sal_Bool m_bUseCatalog; // should we use the catalog on filebased databases sal_Bool m_bUseOldDateFormat; sal_Bool m_bAutoCommit; + sal_Bool m_bReadOnly; isc_db_handle m_DBHandler; isc_tr_handle m_transactionHandle; commit 9d9d2d813e720365aebd91dabf6d19cbb0234bbe Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Fri Jul 12 07:39:15 2013 +0100 Add auto-commit support to firebird-sdbc, enabled by default. Change-Id: I0303cc8df281c70973ee10dd67d23757cc7bd97a diff --git a/connectivity/source/drivers/firebird/FConnection.cxx b/connectivity/source/drivers/firebird/FConnection.cxx index 5576d1f..aa4bf72 100644 --- a/connectivity/source/drivers/firebird/FConnection.cxx +++ b/connectivity/source/drivers/firebird/FConnection.cxx @@ -92,7 +92,9 @@ OConnection::OConnection(FirebirdDriver* _pDriver) m_bClosed(sal_False), m_bUseCatalog(sal_False), m_bUseOldDateFormat(sal_False), - m_DBHandler(0) + m_bAutoCommit(sal_True), + m_DBHandler(0), + m_transactionHandle(0) { SAL_INFO("connectivity.firebird", "=> OConnection::OConnection()."); @@ -234,7 +236,7 @@ void OConnection::construct(const ::rtl::OUString& url, const Sequence< Property return; } - if (m_bIsEmbedded) + if (m_bIsEmbedded) // Add DocumentEventListener to save the .fdb as needed { uno::Reference< frame::XDesktop2 > xFramesSupplier = frame::Desktop::create(::comphelper::getProcessComponentContext()); @@ -270,12 +272,14 @@ void OConnection::construct(const ::rtl::OUString& url, const Sequence< Property osl_atomic_decrement( &m_refCount ); } -// XServiceInfo -// -------------------------------------------------------------------------------- -IMPLEMENT_SERVICE_INFO(OConnection, "com.sun.star.sdbc.drivers.firebird.OConnection", "com.sun.star.sdbc.Connection") -// -------------------------------------------------------------------------------- -Reference< XStatement > SAL_CALL OConnection::createStatement( ) throw(SQLException, RuntimeException) +//----- XServiceInfo --------------------------------------------------------- +IMPLEMENT_SERVICE_INFO(OConnection, "com.sun.star.sdbc.drivers.firebird.OConnection", + "com.sun.star.sdbc.Connection") + +//----- XConnection ---------------------------------------------------------- +Reference< XStatement > SAL_CALL OConnection::createStatement( ) + throw(SQLException, RuntimeException) { SAL_INFO("connectivity.firebird", "=> OConnection::createStatement()."); @@ -295,8 +299,9 @@ Reference< XStatement > SAL_CALL OConnection::createStatement( ) throw(SQLExcep m_aStatements.push_back(WeakReferenceHelper(xReturn)); return xReturn; } -// -------------------------------------------------------------------------------- -Reference< XPreparedStatement > SAL_CALL OConnection::prepareStatement( const ::rtl::OUString& _sSql ) throw(SQLException, RuntimeException) + +Reference< XPreparedStatement > SAL_CALL OConnection::prepareStatement( + const ::rtl::OUString& _sSql ) throw(SQLException, RuntimeException) { SAL_INFO("connectivity.firebird", "=> OConnection::prepareStatement(). " "Got called with sql: " << _sSql); @@ -321,8 +326,9 @@ Reference< XPreparedStatement > SAL_CALL OConnection::prepareStatement( const :: return xReturn; } -// -------------------------------------------------------------------------------- -Reference< XPreparedStatement > SAL_CALL OConnection::prepareCall( const ::rtl::OUString& _sSql ) throw(SQLException, RuntimeException) + +Reference< XPreparedStatement > SAL_CALL OConnection::prepareCall( + const OUString& _sSql ) throw(SQLException, RuntimeException) { SAL_INFO("connectivity.firebird", "=> OConnection::prepareCall(). " "_sSql: " << _sSql); @@ -333,49 +339,90 @@ Reference< XPreparedStatement > SAL_CALL OConnection::prepareCall( const ::rtl:: // not implemented yet :-) a task to do return NULL; } -// -------------------------------------------------------------------------------- -::rtl::OUString SAL_CALL OConnection::nativeSQL( const ::rtl::OUString& _sSql ) throw(SQLException, RuntimeException) + +OUString SAL_CALL OConnection::nativeSQL( const OUString& _sSql ) + throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); - // when you need to transform SQL92 to you driver specific you can do it here - + // We do not need to adapt the SQL for Firebird atm. return _sSql; } -// -------------------------------------------------------------------------------- -void SAL_CALL OConnection::setAutoCommit( sal_Bool autoCommit ) throw(SQLException, RuntimeException) + +void SAL_CALL OConnection::setAutoCommit( sal_Bool autoCommit ) + throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - // here you have to set your commit mode please have a look at the jdbc documentation to get a clear explanation + + m_bAutoCommit = autoCommit; + + if (m_transactionHandle) + { + setupTransaction(); + } } -// -------------------------------------------------------------------------------- -sal_Bool SAL_CALL OConnection::getAutoCommit( ) throw(SQLException, RuntimeException) + +sal_Bool SAL_CALL OConnection::getAutoCommit() throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - // you have to distinguish which if you are in autocommit mode or not - // at normal case true should be fine here - return sal_True; + return m_bAutoCommit; } -// -------------------------------------------------------------------------------- -void SAL_CALL OConnection::commit( ) throw(SQLException, RuntimeException) + +void OConnection::setupTransaction() +{ + ISC_STATUS status_vector[20]; + + // TODO: is this sensible? If we have changed parameters then transaction + // is lost... + if (m_transactionHandle) + { + isc_rollback_transaction(status_vector, &m_transactionHandle); + } + + static char isc_tpb[] = { + isc_tpb_version3, + (m_bAutoCommit ? isc_tpb_autocommit : 0), + isc_tpb_write, + isc_tpb_read_committed, + isc_tpb_wait, + isc_tpb_no_rec_version + }; + + isc_start_transaction(status_vector, &m_transactionHandle, 1, &m_DBHandler, + (unsigned short) sizeof(isc_tpb), isc_tpb); + + //TODO: transmit to open statements? + +} + +void SAL_CALL OConnection::commit() throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - // when you database does support transactions you should commit here + ISC_STATUS status_vector[20]; + + if (!m_bAutoCommit && m_transactionHandle) + { + isc_commit_transaction(status_vector, &m_transactionHandle); + } } -// -------------------------------------------------------------------------------- -void SAL_CALL OConnection::rollback( ) throw(SQLException, RuntimeException) + +void SAL_CALL OConnection::rollback() throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); + ISC_STATUS status_vector[20]; - // same as commit but for the other case + if (!m_bAutoCommit && m_transactionHandle) + { + isc_rollback_transaction(status_vector, &m_transactionHandle); + } } -// -------------------------------------------------------------------------------- + sal_Bool SAL_CALL OConnection::isClosed( ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); @@ -606,6 +653,8 @@ void OConnection::disposing() if (isc_detach_database(status, &m_DBHandler)) if (pr_error(status, "dattach database")) return; + // TODO: write to storage again? + // and delete temporary file. dispose_ChildImpl(); cppu::WeakComponentImplHelperBase::disposing(); diff --git a/connectivity/source/drivers/firebird/FConnection.hxx b/connectivity/source/drivers/firebird/FConnection.hxx index e72bb19..fb9b0a8 100644 --- a/connectivity/source/drivers/firebird/FConnection.hxx +++ b/connectivity/source/drivers/firebird/FConnection.hxx @@ -108,12 +108,15 @@ namespace connectivity sal_Bool m_bClosed; sal_Bool m_bUseCatalog; // should we use the catalog on filebased databases sal_Bool m_bUseOldDateFormat; + sal_Bool m_bAutoCommit; isc_db_handle m_DBHandler; + isc_tr_handle m_transactionHandle; ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > m_xEmbeddedStorage; void buildTypeInfo() throw( ::com::sun::star::sdbc::SQLException); + void setupTransaction(); public: virtual void construct( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits