connectivity/source/drivers/firebird/DatabaseMetaData.cxx |   22 ++++++++---
 connectivity/source/drivers/firebird/ResultSet.cxx        |   28 ++++++++++++--
 2 files changed, 41 insertions(+), 9 deletions(-)

New commits:
commit 537e0fabf1cec7ea74a9d2fb93b795b902588e24
Author:     Julien Nabet <[email protected]>
AuthorDate: Sun Nov 15 15:45:26 2020 +0100
Commit:     Lionel Mamane <[email protected]>
CommitDate: Thu Nov 19 09:50:19 2020 +0100

    tdf#121886: Firebird Datatype Image(BLOB) is not working properly
    
    with Form or Report image controls.
    
    + merge with:
    5c6340d06b4e58529f6122ecf3b26c6d4456226b
    xBlob->length() returns sal_Int64 not sal_Int32
    so deal with it in:
    - OResultSet::getBytes
    - ODatabaseMetaData::getColumns
    and warn if blob is more than SAL_MAX_INT32
    
    also rename xDescriptionBlob into xBlob
    
    Implements getBytes at least when LONGVARBINARY corresponds to a BLOB
    Change-Id: I7e4e99b537333558d5c3dcd172dc54e73472553b
    
    Change-Id: I86c20310235fb4902633fab058066a1f2d62a600
    Tested-by: Jenkins
    Reviewed-by: Julien Nabet <[email protected]>
    (cherry picked from commit 61560ae7d6f00ba6b410f7779e9a46cf692a5400)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105864
    Reviewed-by: Noel Grandin <[email protected]>
    Reviewed-by: Lionel Mamane <[email protected]>

diff --git a/connectivity/source/drivers/firebird/DatabaseMetaData.cxx 
b/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
index 7e6f957d2b1f..fdcfd1d64f89 100644
--- a/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
+++ b/connectivity/source/drivers/firebird/DatabaseMetaData.cxx
@@ -1247,13 +1247,23 @@ uno::Reference< XResultSet > SAL_CALL 
ODatabaseMetaData::getColumns(
         // 12. Comments -- may be omitted
         {
             OUString aDescription;
-            uno::Reference< XBlob > xDescriptionBlob = xRow->getBlob(3);
-            if (xDescriptionBlob.is())
+            uno::Reference< XBlob > xBlob = xRow->getBlob(3);
+            if (xBlob.is())
             {
-                sal_Int32 aBlobLength = 
static_cast<sal_Int32>(xDescriptionBlob->length());
-                aDescription = 
OUString(reinterpret_cast<char*>(xDescriptionBlob->getBytes(1, 
aBlobLength).getArray()),
-                                        aBlobLength,
-                                        RTL_TEXTENCODING_UTF8);
+                const sal_Int64 aBlobLength = xBlob->length();
+                if (aBlobLength > SAL_MAX_INT32)
+                {
+                    SAL_WARN("connectivity.firebird", "getBytes can't return " 
<< aBlobLength << " bytes but only max " << SAL_MAX_INT32);
+                    aDescription = 
OUString(reinterpret_cast<char*>(xBlob->getBytes(1, SAL_MAX_INT32).getArray()),
+                                            SAL_MAX_INT32,
+                                            RTL_TEXTENCODING_UTF8);
+                }
+                else
+                {
+                    aDescription = 
OUString(reinterpret_cast<char*>(xBlob->getBytes(1, 
static_cast<sal_Int32>(aBlobLength)).getArray()),
+                                            aBlobLength,
+                                            RTL_TEXTENCODING_UTF8);
+                }
             }
             aCurrentRow[12] = new ORowSetValueDecorator(aDescription);
         }
diff --git a/connectivity/source/drivers/firebird/ResultSet.cxx 
b/connectivity/source/drivers/firebird/ResultSet.cxx
index 9409701d431f..7ae77c607e0d 100644
--- a/connectivity/source/drivers/firebird/ResultSet.cxx
+++ b/connectivity/source/drivers/firebird/ResultSet.cxx
@@ -665,10 +665,32 @@ sal_Int8 SAL_CALL OResultSet::getByte(sal_Int32 
nColumnIndex)
     return safelyRetrieveValue< ORowSetValue >(nColumnIndex);
 }
 
-Sequence< sal_Int8 > SAL_CALL OResultSet::getBytes(sal_Int32)
+Sequence< sal_Int8 > SAL_CALL OResultSet::getBytes(sal_Int32 nColumnIndex)
 {
-    return Sequence< sal_Int8 >(); // TODO: implement
-    //return safelyRetrieveValue(columnIndex);
+    // &~1 to remove the "can contain NULL" indicator
+    int aSqlType = m_pSqlda->sqlvar[nColumnIndex-1].sqltype & ~1;
+    if ( aSqlType == SQL_BLOB )
+    {
+        Reference< XBlob> xBlob = getBlob(nColumnIndex);
+        if (xBlob.is())
+        {
+            const sal_Int64 aBlobLength = xBlob->length();
+            if (aBlobLength > SAL_MAX_INT32)
+            {
+                SAL_WARN("connectivity.firebird", "getBytes can't return " << 
aBlobLength << " bytes but only max " << SAL_MAX_INT32);
+                return xBlob->getBytes(1, SAL_MAX_INT32);
+            }
+            return xBlob->getBytes(1, static_cast<sal_Int32>(aBlobLength));
+        }
+        else
+            return Sequence< sal_Int8 >();
+    }
+    // TODO implement SQL_VARYING and SQL_TEXT
+    // as it's the counterpart as OPreparedStatement::setBytes
+    else
+    {
+        return Sequence< sal_Int8 >(); // TODO: implement
+    }
 }
 
 sal_Int16 SAL_CALL OResultSet::getShort(sal_Int32 columnIndex)
_______________________________________________
Libreoffice-commits mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to