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

Andrzej J.R. Hunt andrzej at ahunt.org
Wed Jul 31 10:07:19 PDT 2013


 connectivity/source/drivers/firebird/DatabaseMetaData.cxx  |   33 ++++++++-----
 connectivity/source/drivers/firebird/ResultSetMetaData.cxx |    4 +
 connectivity/source/drivers/firebird/Util.cxx              |    6 ++
 connectivity/source/drivers/firebird/Util.hxx              |    8 +++
 4 files changed, 39 insertions(+), 12 deletions(-)

New commits:
commit fe010c7c1905f76e2c1dcddfa3bf8b4bc70b858a
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date:   Wed Jul 31 17:31:00 2013 +0200

    Use correct MetaDataResultSetType (firebird-sdbc).
    
    Change-Id: I9f501dc9e578c9d7bd997072345578bdc860f6a6

diff --git a/connectivity/source/drivers/firebird/DatabaseMetaData.cxx b/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
index 452f72d..580fa23 100644
--- a/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
+++ b/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
@@ -1012,7 +1012,8 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumnPrivileges(
              "Table: " << sTable
              << " & ColumnNamePattern: " << sColumnNamePattern);
 
-    ODatabaseMetaDataResultSet* pResultSet = new ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTables);
+    ODatabaseMetaDataResultSet* pResultSet = new
+        ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eColumnPrivileges);
     uno::Reference< XResultSet > xResultSet = pResultSet;
     uno::Reference< XStatement > statement = m_pConnection->createStatement();
 
@@ -1297,7 +1298,8 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumns(
 
         aResults.push_back(aCurrentRow);
     }
-    ODatabaseMetaDataResultSet* pResultSet = new ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTables);
+    ODatabaseMetaDataResultSet* pResultSet = new
+            ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eColumns);
     uno::Reference< XResultSet > xResultSet = pResultSet;
     pResultSet->setRows( aResults );
 
@@ -1318,7 +1320,8 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTables(
     SAL_INFO("connectivity.firebird", "getTables() with "
              "TableNamePattern: " << tableNamePattern);
 
-    ODatabaseMetaDataResultSet* pResultSet = new ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTables);
+    ODatabaseMetaDataResultSet* pResultSet = new
+        ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTables);
     uno::Reference< XResultSet > xResultSet = pResultSet;
     uno::Reference< XStatement > statement = m_pConnection->createStatement();
 
@@ -1510,7 +1513,8 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getPrimaryKeys(
 
         aResults.push_back(aCurrentRow);
     }
-    ODatabaseMetaDataResultSet* pResultSet = new ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTables);
+    ODatabaseMetaDataResultSet* pResultSet = new
+            ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::ePrimaryKeys);
     uno::Reference< XResultSet > xResultSet = pResultSet;
     pResultSet->setRows( aResults );
 
@@ -1553,7 +1557,8 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTablePrivileges(
     SAL_INFO("connectivity.firebird", "getTablePrivileges() with "
              "TableNamePattern: " << sTableNamePattern);
 
-    ODatabaseMetaDataResultSet* pResultSet = new ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTables);
+    ODatabaseMetaDataResultSet* pResultSet = new
+        ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTablePrivileges);
     uno::Reference< XResultSet > xResultSet = pResultSet;
     uno::Reference< XStatement > statement = m_pConnection->createStatement();
 
commit 43095140eb162dad953919facc636a19c24c8cc0
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date:   Wed Jul 31 17:22:43 2013 +0200

    Cut identifier to correct length (firebird-sdbc).
    
    Currently firebird returns table and column identifiers as being
    93 chars long (rather than 31 as per spec), this leads to problems
    with ALTER and DROP commands which are unable to deal with the incorrect
    length. For now we simply discard the extra characters (which are
    blank characters).
    
    (SELECT and similar commands have been able to deal with the overlength
    identifiers previously, which is why this hack wasn't required
    beforehand.)
    
    Change-Id: Ib6c984b5fc72dc4e326b3f8d36f6cbc4a3c9086a

diff --git a/connectivity/source/drivers/firebird/DatabaseMetaData.cxx b/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
index 943bb82..452f72d 100644
--- a/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
+++ b/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
@@ -1067,11 +1067,13 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumnPrivileges(
         // 3. TABLE_NAME
         {
             OUString sTableName = xRow->getString(1);
+            sanitizeIdentifier(sTableName);
             aCurrentRow.push_back(new ORowSetValueDecorator(sTableName));
         }
         // 3. COLUMN_NAME
         {
             OUString sColumnName = xRow->getString(6);
+            sanitizeIdentifier(sColumnName);
             aCurrentRow.push_back(new ORowSetValueDecorator(sColumnName));
         }
         // 4. GRANTOR
@@ -1180,13 +1182,15 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumns(
     {
         // 3. TABLE_NAME
         {
-            OUString aTableName = xRow->getString(1);
-            aCurrentRow[3] = new ORowSetValueDecorator(aTableName);
+            OUString sTableName = xRow->getString(1);
+            sanitizeIdentifier(sTableName);
+            aCurrentRow[3] = new ORowSetValueDecorator(sTableName);
         }
         // 4. Column Name
         {
-            OUString aColumnName = xRow->getString(2);
-            aCurrentRow[4] = new ORowSetValueDecorator(aColumnName);
+            OUString sColumnName = xRow->getString(2);
+            sanitizeIdentifier(sColumnName);
+            aCurrentRow[4] = new ORowSetValueDecorator(sColumnName);
         }
 
         // 5. Datatype
@@ -1348,7 +1352,8 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTables(
     {
         ODatabaseMetaDataResultSet::ORow aCurrentRow(3);
 
-        OUString aTableName             = xRow->getString(1);
+        OUString sTableName             = xRow->getString(1);
+        sanitizeIdentifier(sTableName);
         sal_Int16 systemFlag            = xRow->getShort(2);
         sal_Int16 tableType             = xRow->getShort(3);
         uno::Reference< XBlob > xBlob   = xRow->getBlob(4);
@@ -1383,7 +1388,7 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTables(
         // TABLE_CAT (catalog) may be null -- thus we omit it.
         // TABLE_SCHEM (schema) may be null -- thus we omit it.
         // TABLE_NAME
-        aCurrentRow.push_back(new ORowSetValueDecorator(aTableName));
+        aCurrentRow.push_back(new ORowSetValueDecorator(sTableName));
         // TABLE_TYPE
         aCurrentRow.push_back(new ORowSetValueDecorator(aTableType));
         // REMARKS
@@ -1599,6 +1604,7 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTablePrivileges(
         // 3. TABLE_NAME
         {
             OUString sTableName = xRow->getString(1);
+            sanitizeIdentifier(sTableName);
             aCurrentRow.push_back(new ORowSetValueDecorator(sTableName));
         }
         // 4. GRANTOR
diff --git a/connectivity/source/drivers/firebird/ResultSetMetaData.cxx b/connectivity/source/drivers/firebird/ResultSetMetaData.cxx
index 9bcc6b3..31110fc 100644
--- a/connectivity/source/drivers/firebird/ResultSetMetaData.cxx
+++ b/connectivity/source/drivers/firebird/ResultSetMetaData.cxx
@@ -85,9 +85,11 @@ OUString SAL_CALL OResultSetMetaData::getColumnName(sal_Int32 column)
     throw(SQLException, RuntimeException)
 {
     verifyValidColumn(column);
-    return OUString(m_pSqlda->sqlvar[column-1].sqlname,
+    OUString sRet(m_pSqlda->sqlvar[column-1].sqlname,
                     m_pSqlda->sqlvar[column-1].sqlname_length,
                     RTL_TEXTENCODING_UTF8);
+    sanitizeIdentifier(sRet);
+    return sRet;
 }
 
 OUString SAL_CALL OResultSetMetaData::getTableName(sal_Int32 column)
diff --git a/connectivity/source/drivers/firebird/Util.cxx b/connectivity/source/drivers/firebird/Util.cxx
index f8259de..90c74fc 100644
--- a/connectivity/source/drivers/firebird/Util.cxx
+++ b/connectivity/source/drivers/firebird/Util.cxx
@@ -19,6 +19,12 @@ using namespace ::com::sun::star;
 using namespace ::com::sun::star::sdbc;
 using namespace ::com::sun::star::uno;
 
+void firebird::sanitizeIdentifier(OUString& rIdentifier)
+{
+    if (rIdentifier.getLength() > 31)
+        rIdentifier = rIdentifier.copy(0, 31);
+}
+
 void firebird::evaluateStatusVector(ISC_STATUS_ARRAY& aStatusVector,
                                     const OUString& aCause,
                                     const uno::Reference< XInterface >& _rxContext)
diff --git a/connectivity/source/drivers/firebird/Util.hxx b/connectivity/source/drivers/firebird/Util.hxx
index 664a17d..fcd34bf 100644
--- a/connectivity/source/drivers/firebird/Util.hxx
+++ b/connectivity/source/drivers/firebird/Util.hxx
@@ -23,6 +23,14 @@ namespace connectivity
     {
 
         /**
+         * Make sure an identifier is safe to use within the databse. Currently
+         * firebird seems to return identifiers with 93 character (instead of
+         * 31). Use this to avoid issues when using the identifier in other
+         * sql queries.
+         */
+        void sanitizeIdentifier(::rtl::OUString& rIdentifier);
+
+        /**
          * Evaluate a firebird status vector and throw exceptions as necessary.
          * The content of the status vector is included in the thrown exception.
          */


More information about the Libreoffice-commits mailing list