diff options
author | Jean-Pierre Ledure <jp@ledure.be> | 2017-01-13 15:24:08 +0100 |
---|---|---|
committer | Jean-Pierre Ledure <jp@ledure.be> | 2017-01-13 15:28:06 +0100 |
commit | 3107a5d0e9ff7a3ccaac536606a733767886d438 (patch) | |
tree | edbdfa22784200c2763d5986f5dd839dc21621e2 | |
parent | 15cee52b62c760e1cb212d34d9279c5eee5ecb6d (diff) |
Access2Base - Review size limits of VARCHAR fields
- Basic has no practical limit anymore for string variables
- LONGVARCHAR fields can vary a lot in size across RDBMS's (f.i. Sqlite < 64K)
This forces an overflow check when setting a field value and no check when getting it
Change-Id: I4c9629f63164fbbdb84497e7002fa3186d7c63b7
-rw-r--r-- | wizards/source/access2base/DoCmd.xba | 8 | ||||
-rw-r--r-- | wizards/source/access2base/Field.xba | 8 | ||||
-rw-r--r-- | wizards/source/access2base/Recordset.xba | 1 | ||||
-rw-r--r-- | wizards/source/access2base/Utils.xba | 2 |
4 files changed, 15 insertions, 4 deletions
diff --git a/wizards/source/access2base/DoCmd.xba b/wizards/source/access2base/DoCmd.xba index 9b6500c30897..b52cbbdccde9 100644 --- a/wizards/source/access2base/DoCmd.xba +++ b/wizards/source/access2base/DoCmd.xba @@ -340,7 +340,7 @@ Const cstProgressMeterLimit = 100 Utils._updateResultSetColumnValue(iRDBMS, oOutput.RowSet, i + 1, vField) ElseIf oDatabase._BinaryStream Then ' Typically for SQLite where binary fields are limited - If lInputSize > vOutputField.Column.Precision Then + If lInputSize > vOutputField._Precision Then TraceError(TRACEWARNING, ERRPRECISION, Utils._CalledSub(), 0, 1, Array(vOutputField._Name, lInputRecs + 1)) Utils._updateResultSetColumnValue(iRDBMS, oOutput.RowSet, i + 1, Null) Else @@ -352,6 +352,12 @@ Const cstProgressMeterLimit = 100 End If Else vField = Utils._getResultSetColumnValue(.RowSet, i + 1) + If VarType(vField) = vbString Then + If Len(vField) > vOutputField._Precision Then + TraceError(TRACEWARNING, ERRPRECISION, Utils._CalledSub(), 0, 1, Array(vOutputField._Name, lInputRecs + 1)) + End If + End If + ' Update is done anyway, if too long, with truncation Utils._updateResultSetColumnValue(iRDBMS, oOutput.RowSet, i + 1, vField) End If Next i diff --git a/wizards/source/access2base/Field.xba b/wizards/source/access2base/Field.xba index 35d5bc6bddb8..5a7fcc4cd870 100644 --- a/wizards/source/access2base/Field.xba +++ b/wizards/source/access2base/Field.xba @@ -16,6 +16,7 @@ REM ---------------------------------------------------------------------------- Private _Type As String ' Must be FIELD Private _Name As String +Private _Precision As Long Private _ParentName As String Private _ParentType As String Private _ParentDatabase As Object @@ -400,7 +401,6 @@ Dim cstThisSub As String Dim bCond1 As Boolean, bCond2 As Boolean, vValue As Variant, oValue As Object, sValue As String Dim oSize As Object, lSize As Long, bNullable As Boolean, bNull As Boolean -Const cstMaxTextLength = 65535 Const cstMaxBinlength = 2 * 65535 _PropertyGet = EMPTY @@ -551,7 +551,6 @@ Const cstMaxBinlength = 2 * 65535 If Not bNull Then lSize = CLng(oValue.getLength()) oValue.closeInput() - If lSize > cstMaxTextLength Then Goto Trace_Length vValue = Column.getString() ' vbString Else oValue.closeInput() @@ -686,6 +685,7 @@ Dim oParent As Object End If Case .CHAR, .VARCHAR, .LONGVARCHAR, .CLOB If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + If Len(pvValue) > _Precision Then Goto Trace_Error_Length Column.updateString(pvValue) ' vbString Case .DATE If Not Utils._CheckArgument(pvValue, iArgNr, vbDate, , False) Then Goto Trace_Error_Value @@ -756,6 +756,10 @@ Trace_Error_Updatable: TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0, 1) _PropertySet = False Goto Exit_Function +Trace_Error_Length: + TraceError(TRACEFATAL, ERROVERFLOW, Utils._CalledSub(), 0, , Array(lSize, "AppendChunk")) + _PropertySet = False + Goto Exit_Function Error_Function: TraceError(TRACEABORT, Err, cstThisSub, Erl) _PropertySet = False diff --git a/wizards/source/access2base/Recordset.xba b/wizards/source/access2base/Recordset.xba index d04f2e6bf382..0bc968fd4c8e 100644 --- a/wizards/source/access2base/Recordset.xba +++ b/wizards/source/access2base/Recordset.xba @@ -545,6 +545,7 @@ Dim i As Integer, oFields As Object, iIndex As Integer Set oObject = New Field oObject._Name = sObjectName Set oObject.Column = oFields.getByName(sObjectName) + If Utils._hasUNOProperty(oObject.Column, "Precision") Then oObject._Precision = oObject.Column.Precision oObject._ParentName = _Name oObject._ParentType = _Type Set oObject._ParentDatabase = _ParentDatabase diff --git a/wizards/source/access2base/Utils.xba b/wizards/source/access2base/Utils.xba index 7367e4e63e59..3b71d0adb92d 100644 --- a/wizards/source/access2base/Utils.xba +++ b/wizards/source/access2base/Utils.xba @@ -1166,7 +1166,7 @@ Const cstMaxBinlength = 2 * 65535 Case .DECIMAL, .NUMERIC : poResultSet.updateDouble(piColIndex, pvValue) Case .TINYINT : poResultSet.updateShort(piColIndex, pvValue) Case .CHAR, .VARCHAR, .LONGVARCHAR, .CLOB - If piRDBMS = DBMS_SQLITE And InStr(sValueTypeName, "BINARY") >0 Then ' Sqlite exception ... ! + If piRDBMS = DBMS_SQLITE And InStr(sValueTypeName, "BINARY") > 0 Then ' Sqlite exception ... ! poResultSet.updateBytes(piColIndex, pvValue) Else poResultSet.updateString(piColIndex, pvValue) |