Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com --- dlls/msado15/recordset.c | 16 ++++++++++++++++ dlls/msado15/tests/msado15.c | 17 +++++++++++++++++ 2 files changed, 33 insertions(+)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 8d7619d9161..7cd943f55d5 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -740,6 +740,22 @@ static HRESULT map_index( struct fields *fields, VARIANT *index, ULONG *ret ) { ULONG i;
+ if (V_VT( index ) == VT_I4 || V_VT( index ) == VT_I2) + { + if (V_VT( index ) == VT_I4) + i = V_I4 ( index ); + else + i = V_I2 ( index ); + + if (i < fields->count) + { + *ret = i; + return S_OK; + } + + return MAKE_ADO_HRESULT(adErrItemNotFound); + } + if (V_VT( index ) != VT_BSTR) { FIXME( "variant type %u not supported\n", V_VT( index ) ); diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 97a578b0618..860144338c0 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -133,6 +133,23 @@ static void test_Recordset(void) hr = Fields__Append( fields, name, adInteger, 4, adFldUnspecified ); ok( hr == S_OK, "got %08x\n", hr );
+ V_VT( &index ) = VT_I4; + V_I4( &index ) = 1000; + hr = Fields_get_Item( fields, index, &field ); + ok( hr == MAKE_ADO_HRESULT(adErrItemNotFound), "got %08x\n", hr ); + + V_VT( &index ) = VT_I4; + V_I4( &index ) = 0; + hr = Fields_get_Item( fields, index, &field ); + ok( hr == S_OK, "got %08x\n", hr ); + Field_Release(field); + + V_VT( &index ) = VT_I2; + V_I4( &index ) = 0; + hr = Fields_get_Item( fields, index, &field ); + ok( hr == S_OK, "got %08x\n", hr ); + Field_Release(field); + V_VT( &index ) = VT_BSTR; V_BSTR( &index ) = name; hr = Fields_get_Item( fields, index, &field );
On 08/06/2021 07:22, Alistair Leslie-Hughes wrote:
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com
dlls/msado15/recordset.c | 16 ++++++++++++++++ dlls/msado15/tests/msado15.c | 17 +++++++++++++++++ 2 files changed, 33 insertions(+)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 8d7619d9161..7cd943f55d5 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -740,6 +740,22 @@ static HRESULT map_index( struct fields *fields, VARIANT *index, ULONG *ret ) { ULONG i;
- if (V_VT( index ) == VT_I4 || V_VT( index ) == VT_I2)
- {
if (V_VT( index ) == VT_I4)
i = V_I4 ( index );
else
i = V_I2 ( index );
if (i < fields->count)
{
*ret = i;
return S_OK;
}
return MAKE_ADO_HRESULT(adErrItemNotFound);
- }
if (V_VT( index ) != VT_BSTR) { FIXME( "variant type %u not supported\n", V_VT( index ) );
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 97a578b0618..860144338c0 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -133,6 +133,23 @@ static void test_Recordset(void) hr = Fields__Append( fields, name, adInteger, 4, adFldUnspecified ); ok( hr == S_OK, "got %08x\n", hr );
- V_VT( &index ) = VT_I4;
- V_I4( &index ) = 1000;
- hr = Fields_get_Item( fields, index, &field );
- ok( hr == MAKE_ADO_HRESULT(adErrItemNotFound), "got %08x\n", hr );
- V_VT( &index ) = VT_I4;
- V_I4( &index ) = 0;
- hr = Fields_get_Item( fields, index, &field );
- ok( hr == S_OK, "got %08x\n", hr );
- Field_Release(field);
- V_VT( &index ) = VT_I2;
- V_I4( &index ) = 0;
- hr = Fields_get_Item( fields, index, &field );
- ok( hr == S_OK, "got %08x\n", hr );
- Field_Release(field);
V_VT( &index ) = VT_BSTR; V_BSTR( &index ) = name; hr = Fields_get_Item( fields, index, &field );
Hi Alistair,
Did you test other integer types? Do they not work? (e.g. I1, and unsigned int variants)
If they do work, you can just convert via VariantChangeType to an VT_I4 when it's not a BSTR, and use that as index. I recall I did something similar in msscript.ocx to handle such.
Sorry forgot to mention also, try to test floats too (VT_R4 or VT_R8, just one of them is enough).
Hi Gabriel,
On 8/6/21 11:17 pm, Gabriel Ivăncescu wrote:
+ V_VT( &index ) = VT_I2; + V_I4( &index ) = 0; + hr = Fields_get_Item( fields, index, &field ); + ok( hr == S_OK, "got %08x\n", hr ); + Field_Release(field);
V_VT( &index ) = VT_BSTR; V_BSTR( &index ) = name; hr = Fields_get_Item( fields, index, &field );
Hi Alistair,
Did you test other integer types? Do they not work? (e.g. I1, and unsigned int variants)
If they do work, you can just convert via VariantChangeType to an VT_I4 when it's not a BSTR, and use that as index. I recall I did something similar in msscript.ocx to handle such.
Locally, I've added extra tests and it does appear to convert the other types to integer. I'll send a patch to convert for non bstr types.
Thanks Alistair.