[Libreoffice-commits] core.git: 3 commits - connectivity/source

Andrzej J.R. Hunt andrzej at ahunt.org
Thu Aug 15 12:34:19 PDT 2013


 connectivity/source/drivers/firebird/PreparedStatement.cxx   |   17 +++
 connectivity/source/drivers/firebird/ResultSet.cxx           |    2 
 connectivity/source/drivers/firebird/ResultSet.hxx           |    6 +
 connectivity/source/drivers/firebird/Statement.cxx           |   23 +++-
 connectivity/source/drivers/firebird/Statement.hxx           |    8 +
 connectivity/source/drivers/firebird/StatementCommonBase.hxx |    7 -
 connectivity/source/drivers/firebird/Table.cxx               |   11 ++
 connectivity/source/drivers/firebird/Table.hxx               |    3 
 connectivity/source/drivers/firebird/Tables.cxx              |   56 ++++++++---
 connectivity/source/drivers/firebird/Tables.hxx              |   25 ++--
 connectivity/source/drivers/firebird/Util.cxx                |   47 +++++++++
 connectivity/source/drivers/firebird/Util.hxx                |    2 
 12 files changed, 170 insertions(+), 37 deletions(-)

New commits:
commit aca3d35a3b950bd6bc7681787cc4fa10c2e01683
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date:   Thu Aug 15 15:32:17 2013 +0100

    Free SQLVAR as appropriate. (firebird-sdbc)
    
    Change-Id: I5742e178baa85f3faf80d95f57fed248f7984793

diff --git a/connectivity/source/drivers/firebird/PreparedStatement.cxx b/connectivity/source/drivers/firebird/PreparedStatement.cxx
index 9a9f988..70d6d36 100644
--- a/connectivity/source/drivers/firebird/PreparedStatement.cxx
+++ b/connectivity/source/drivers/firebird/PreparedStatement.cxx
@@ -77,7 +77,7 @@ void OPreparedStatement::ensurePrepared()
         m_pInSqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(10));
         m_pInSqlda->version = SQLDA_VERSION1;
         m_pInSqlda->sqln = 10;
-    } // TODO: free this on closing
+    }
 
     prepareAndDescribeStatement(m_sSqlStatement,
                                m_pOutSqlda,
@@ -172,7 +172,22 @@ Reference< XResultSetMetaData > SAL_CALL OPreparedStatement::getMetaData()
 
 void SAL_CALL OPreparedStatement::close() throw(SQLException, RuntimeException)
 {
+    MutexGuard aGuard( m_pConnection->getMutex() );
+    checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed);
+
     OStatementCommonBase::close();
+    if (m_pInSqlda)
+    {
+        freeSQLVAR(m_pInSqlda);
+        free(m_pInSqlda);
+        m_pInSqlda = 0;
+    }
+    if (m_pOutSqlda)
+    {
+        freeSQLVAR(m_pOutSqlda);
+        free(m_pOutSqlda);
+        m_pOutSqlda = 0;
+    }
 }
 
 void SAL_CALL OPreparedStatement::disposing()
diff --git a/connectivity/source/drivers/firebird/ResultSet.cxx b/connectivity/source/drivers/firebird/ResultSet.cxx
index 921305f..aac6622 100644
--- a/connectivity/source/drivers/firebird/ResultSet.cxx
+++ b/connectivity/source/drivers/firebird/ResultSet.cxx
@@ -265,8 +265,6 @@ void OResultSet::disposing(void)
 
     MutexGuard aGuard(m_pConnection->getMutex());
 
-    // TODO: free the sqlda
-
     m_xMetaData     = NULL;
 }
 // -------------------------------------------------------------------------
diff --git a/connectivity/source/drivers/firebird/ResultSet.hxx b/connectivity/source/drivers/firebird/ResultSet.hxx
index a741295..6cfec8d 100644
--- a/connectivity/source/drivers/firebird/ResultSet.hxx
+++ b/connectivity/source/drivers/firebird/ResultSet.hxx
@@ -60,6 +60,12 @@ namespace connectivity
                                                         ::com::sun::star::sdbc::XColumnLocate,
                                                         ::com::sun::star::lang::XServiceInfo> OResultSet_BASE;
 
+        /**
+         * This ResultSet does not deal with the management of the SQLDA
+         * it is supplied with. The owner must mange its SQLDA appropriately
+         * and ensure that the ResultSet is destroyed before disposing of the
+         * SQLDA.
+         */
         class OResultSet :  public  OResultSet_BASE,
                             public  ::cppu::OPropertySetHelper,
                             public  OPropertyArrayUsageHelper<OResultSet>
diff --git a/connectivity/source/drivers/firebird/Statement.cxx b/connectivity/source/drivers/firebird/Statement.cxx
index db44f51..5a6d85f 100644
--- a/connectivity/source/drivers/firebird/Statement.cxx
+++ b/connectivity/source/drivers/firebird/Statement.cxx
@@ -78,6 +78,21 @@ void SAL_CALL OStatement::release() throw()
     OStatementCommonBase::release();
 }
 
+void OStatement::disposeResultSet()
+{
+    MutexGuard aGuard(m_pConnection->getMutex());
+    checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed);
+
+    OStatementCommonBase::disposeResultSet();
+
+    if (m_pSqlda)
+    {
+        freeSQLVAR(m_pSqlda);
+        free(m_pSqlda);
+        m_pSqlda = 0;
+    }
+}
+
 // ---- XStatement -----------------------------------------------------------
 sal_Int32 SAL_CALL OStatement::executeUpdate(const OUString& sql)
     throw(SQLException, RuntimeException)
@@ -109,11 +124,12 @@ uno::Reference< XResultSet > SAL_CALL OStatement::executeQuery(const OUString& s
     MutexGuard aGuard(m_pConnection->getMutex());
     checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed);
 
-    XSQLDA* pOutSqlda = 0;
     ISC_STATUS aErr = 0;
 
+    disposeResultSet();
+
     prepareAndDescribeStatement(sql,
-                                pOutSqlda);
+                                m_pSqlda);
 
     aErr = isc_dsql_execute(m_statusVector,
                             &m_pConnection->getTransaction(),
@@ -126,7 +142,7 @@ uno::Reference< XResultSet > SAL_CALL OStatement::executeQuery(const OUString& s
     m_xResultSet = new OResultSet(m_pConnection,
                                   uno::Reference< XInterface >(*this),
                                   m_aStatementHandle,
-                                  pOutSqlda);
+                                  m_pSqlda);
 
     // TODO: deal with cleanup
 
@@ -179,6 +195,7 @@ void SAL_CALL OStatement::close() throw(SQLException, RuntimeException)
 
 void SAL_CALL OStatement::disposing()
 {
+    disposeResultSet();
     close();
 }
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/firebird/Statement.hxx b/connectivity/source/drivers/firebird/Statement.hxx
index bfac534..1818802 100644
--- a/connectivity/source/drivers/firebird/Statement.hxx
+++ b/connectivity/source/drivers/firebird/Statement.hxx
@@ -39,12 +39,18 @@ namespace connectivity
         {
         protected:
             virtual ~OStatement(){}
+
+            XSQLDA* m_pSqlda;
+
         public:
             // a constructor, which is required for returning objects:
             OStatement( OConnection* _pConnection)
-                : OStatementCommonBase( _pConnection)
+                : OStatementCommonBase( _pConnection),
+                  m_pSqlda(0)
             {}
 
+            virtual void disposeResultSet();
+
             DECLARE_SERVICE_INFO();
 
             virtual void SAL_CALL acquire() throw();
diff --git a/connectivity/source/drivers/firebird/StatementCommonBase.hxx b/connectivity/source/drivers/firebird/StatementCommonBase.hxx
index db172fa..bb4fc3c 100644
--- a/connectivity/source/drivers/firebird/StatementCommonBase.hxx
+++ b/connectivity/source/drivers/firebird/StatementCommonBase.hxx
@@ -64,7 +64,7 @@ namespace connectivity
             isc_stmt_handle                             m_aStatementHandle;
 
         protected:
-            void disposeResultSet();
+            virtual void disposeResultSet();
             void freeStatementHandle()
                 throw (::com::sun::star::sdbc::SQLException);
 
@@ -102,7 +102,10 @@ namespace connectivity
             using OStatementCommonBase_Base::operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >;
 
             // OComponentHelper
-            virtual void SAL_CALL disposing(void){OStatementCommonBase_Base::disposing();}
+            virtual void SAL_CALL disposing(void){
+                disposeResultSet();
+                OStatementCommonBase_Base::disposing();
+            }
             // XInterface
             virtual void SAL_CALL release() throw();
             virtual void SAL_CALL acquire() throw();
diff --git a/connectivity/source/drivers/firebird/Util.cxx b/connectivity/source/drivers/firebird/Util.cxx
index cc8f5d7..bdf673e 100644
--- a/connectivity/source/drivers/firebird/Util.cxx
+++ b/connectivity/source/drivers/firebird/Util.cxx
@@ -251,4 +251,51 @@ void firebird::mallocSQLVAR(XSQLDA* pSqlda)
         }
     }
 }
+
+void firebird::freeSQLVAR(XSQLDA* pSqlda)
+{
+    XSQLVAR* pVar = pSqlda->sqlvar;
+    for (int i=0; i < pSqlda->sqld; i++, pVar++)
+    {
+        int dtype = (pVar->sqltype & ~1); /* drop flag bit for now */
+        switch(dtype) {
+        case SQL_TEXT:
+        case SQL_VARYING:
+        case SQL_SHORT:
+        case SQL_LONG:
+        case SQL_FLOAT:
+        case SQL_DOUBLE:
+        case SQL_D_FLOAT:
+        case SQL_TIMESTAMP:
+        case SQL_BLOB:
+        case SQL_INT64:
+            free(pVar->sqldata);
+            break;
+        case SQL_ARRAY:
+            assert(false); // TODO: implement
+            break;
+        case SQL_TYPE_TIME:
+            assert(false); // TODO: implement
+            break;
+        case SQL_TYPE_DATE:
+            assert(false); // TODO: implement
+            break;
+        case SQL_NULL:
+            assert(false); // TODO: implement
+            break;
+        case SQL_QUAD:
+            assert(false); // TODO: implement
+            break;
+        default:
+            SAL_WARN("connectivity.firebird", "Unknown type: " << dtype);
+            assert(false);
+            break;
+        }
+
+        if (pVar->sqltype & 1)
+        {
+            free(pVar->sqlind);
+        }
+    }
+}
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
diff --git a/connectivity/source/drivers/firebird/Util.hxx b/connectivity/source/drivers/firebird/Util.hxx
index 9818482..589337f 100644
--- a/connectivity/source/drivers/firebird/Util.hxx
+++ b/connectivity/source/drivers/firebird/Util.hxx
@@ -55,7 +55,7 @@ namespace connectivity
 
         void mallocSQLVAR(XSQLDA* pSqlda);
 
-//         void freeSQLVAR(XSQLDA* pSqlda);
+        void freeSQLVAR(XSQLDA* pSqlda);
     }
 }
 #endif //CONNECTIVITY_FIREBIRD_UTIL_HXX
commit c68aedab311f6a85857113bcd92fdfe51f089507
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date:   Thu Aug 15 11:33:54 2013 +0100

    Implement dropping tables. (firebird-sdbc)
    
    Change-Id: I68ef5bdfb3007709444b838f3c7c3925acc9dd32

diff --git a/connectivity/source/drivers/firebird/Tables.cxx b/connectivity/source/drivers/firebird/Tables.cxx
index 5265703..fc55d2a 100644
--- a/connectivity/source/drivers/firebird/Tables.cxx
+++ b/connectivity/source/drivers/firebird/Tables.cxx
@@ -96,18 +96,25 @@ ObjectType Tables::appendObject(const OUString& rName,
 
     return createObject(rName);
 }
-// //----- XDrop ----------------------------------------------------------------
-// void SAL_CALL Tables::dropByName(const OUString& rName)
-//     throw (SQLException, NoSuchElementException, RuntimeException)
-// {
-//     (void) rName;
-//     // TODO: IMPLEMENT ME
-// }
-//
-// void SAL_CALL Tables::dropByIndex(const sal_Int32 nIndex)
-//     throw (SQLException, IndexOutOfBoundsException, RuntimeException)
-// {
-//     (void) nIndex;
-//     // TODO: IMPLEMENT ME
-// }
+
+//----- XDrop -----------------------------------------------------------------
+void Tables::dropObject(sal_Int32 nPosition, const OUString sName)
+{
+    uno::Reference< XPropertySet > xTable(getObject(nPosition));
+
+    if (!ODescriptor::isNew(xTable))
+    {
+        OUStringBuffer sSql("DROP ");
+
+        OUString sType;
+        xTable->getPropertyValue("Type") >>= sType;
+        sSql.append(sType);
+
+        const OUString sQuoteString = m_xMetaData->getIdentifierQuoteString();
+        sSql.append(::dbtools::quoteName(sQuoteString,sName));
+
+        m_xMetaData->getConnection()->createStatement()->execute(sSql.makeStringAndClear());
+    }
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
diff --git a/connectivity/source/drivers/firebird/Tables.hxx b/connectivity/source/drivers/firebird/Tables.hxx
index 173d957..b2e570f 100644
--- a/connectivity/source/drivers/firebird/Tables.hxx
+++ b/connectivity/source/drivers/firebird/Tables.hxx
@@ -52,15 +52,9 @@ namespace connectivity
             // TODO: we should also implement XDataDescriptorFactory, XRefreshable,
             // XAppend,  etc., but all are optional.
 
-//             // XDrop
-//             virtual void SAL_CALL dropByName(const ::rtl::OUString& rName)
-//                 throw (::com::sun::star::sdbc::SQLException,
-//                        ::com::sun::star::container::NoSuchElementException,
-//                        ::com::sun::star::uno::RuntimeException);
-//             virtual void SAL_CALL dropByIndex(const sal_Int32 nIndex)
-//                 throw (::com::sun::star::sdbc::SQLException,
-//                        com::sun::star::lang::IndexOutOfBoundsException,
-//                        ::com::sun::star::uno::RuntimeException);
+            // XDrop
+            virtual void dropObject(sal_Int32 nPosition, const ::rtl::OUString rName);
+
         };
 
     } // namespace firebird
commit 6cb1f56fced634e0692c82cd9b2c7d240a32c14b
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date:   Thu Aug 15 10:51:57 2013 +0100

    Implement sdbcx table creation. (firebird-sdbc)
    
    Change-Id: I3d0de21a5fe10b64e21955f3384b95a96ac7561e

diff --git a/connectivity/source/drivers/firebird/Table.cxx b/connectivity/source/drivers/firebird/Table.cxx
index 38b0bcb..d32066f 100644
--- a/connectivity/source/drivers/firebird/Table.cxx
+++ b/connectivity/source/drivers/firebird/Table.cxx
@@ -29,6 +29,17 @@ using namespace ::com::sun::star::uno;
 
 Table::Table(Tables* pTables,
              Mutex& rMutex,
+             const uno::Reference< XConnection >& rConnection):
+    OTableHelper(pTables,
+                 rConnection,
+                 sal_True),
+    m_rMutex(rMutex)
+{
+    OTableHelper::construct();
+}
+
+Table::Table(Tables* pTables,
+             Mutex& rMutex,
              const uno::Reference< XConnection >& rConnection,
              const OUString& rName,
              const OUString& rType,
diff --git a/connectivity/source/drivers/firebird/Table.hxx b/connectivity/source/drivers/firebird/Table.hxx
index ff9d183..41f12c3 100644
--- a/connectivity/source/drivers/firebird/Table.hxx
+++ b/connectivity/source/drivers/firebird/Table.hxx
@@ -37,6 +37,9 @@ namespace connectivity
         public:
             Table(Tables* pTables,
                   ::osl::Mutex& rMutex,
+                  const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _xConnection);
+            Table(Tables* pTables,
+                  ::osl::Mutex& rMutex,
                   const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _xConnection,
                   const ::rtl::OUString& rName,
                   const ::rtl::OUString& rType,
diff --git a/connectivity/source/drivers/firebird/Tables.cxx b/connectivity/source/drivers/firebird/Tables.cxx
index 0dbca85..5265703 100644
--- a/connectivity/source/drivers/firebird/Tables.cxx
+++ b/connectivity/source/drivers/firebird/Tables.cxx
@@ -10,6 +10,8 @@
 #include "Table.hxx"
 #include "Tables.hxx"
 
+#include <connectivity/dbtools.hxx>
+
 #include <com/sun/star/sdbc/XRow.hpp>
 
 using namespace ::connectivity;
@@ -20,6 +22,7 @@ using namespace ::osl;
 using namespace ::rtl;
 
 using namespace ::com::sun::star;
+using namespace ::com::sun::star::beans;
 using namespace ::com::sun::star::container;
 using namespace ::com::sun::star::lang;
 using namespace ::com::sun::star::sdbc;
@@ -75,6 +78,24 @@ ObjectType Tables::createObject(const OUString& rName)
     return xRet;
 }
 
+uno::Reference< XPropertySet > Tables::createDescriptor()
+{
+    // There is some internal magic so that the same class can be used as either
+    // a descriptor or as a normal table. See VTable.cxx for the details. In our
+    // case we just need to ensure we use the correct constructor.
+    return new Table(this, m_rMutex, m_xMetaData->getConnection());
+}
+
+//----- XAppend ---------------------------------------------------------------
+ObjectType Tables::appendObject(const OUString& rName,
+                                const uno::Reference< XPropertySet >& rDescriptor)
+{
+    OUString sSql(::dbtools::createSqlCreateTableStatement(rDescriptor,
+                                                            m_xMetaData->getConnection()));
+    m_xMetaData->getConnection()->createStatement()->execute(sSql);
+
+    return createObject(rName);
+}
 // //----- XDrop ----------------------------------------------------------------
 // void SAL_CALL Tables::dropByName(const OUString& rName)
 //     throw (SQLException, NoSuchElementException, RuntimeException)
diff --git a/connectivity/source/drivers/firebird/Tables.hxx b/connectivity/source/drivers/firebird/Tables.hxx
index c025e1b..173d957 100644
--- a/connectivity/source/drivers/firebird/Tables.hxx
+++ b/connectivity/source/drivers/firebird/Tables.hxx
@@ -29,14 +29,19 @@ namespace connectivity
             ::osl::Mutex& m_rMutex;
 
         protected:
-            // OCollection: pure virtual functions requiring implementation
+            ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >
+                m_xMetaData;
+
+            // OCollection
             virtual void impl_refresh()
                 throw(::com::sun::star::uno::RuntimeException);
             virtual ::connectivity::sdbcx::ObjectType createObject(
                                                 const ::rtl::OUString& rName);
-
-            ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >
-                m_xMetaData;
+            virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
+                    createDescriptor();
+            virtual ::connectivity::sdbcx::ObjectType appendObject(
+                        const OUString& rName,
+                        const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& rDescriptor);
 
         public:
             Tables(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& rMetaData,


More information about the Libreoffice-commits mailing list