diff --git a/ext/com_dotnet/com_extension.c b/ext/com_dotnet/com_extension.c index 5782102201f61..95361a4b9a9ed 100644 --- a/ext/com_dotnet/com_extension.c +++ b/ext/com_dotnet/com_extension.c @@ -32,11 +32,13 @@ #define PHP_DISP_E_DIVBYZERO ((zend_long) (ULONG) DISP_E_DIVBYZERO) #define PHP_DISP_E_OVERFLOW ((zend_long) (ULONG) DISP_E_OVERFLOW) #define PHP_DISP_E_BADINDEX ((zend_long) (ULONG) DISP_E_BADINDEX) +#define PHP_DISP_E_PARAMNOTFOUND ((zend_long) (ULONG) DISP_E_PARAMNOTFOUND) #define PHP_MK_E_UNAVAILABLE ((zend_long) (ULONG) MK_E_UNAVAILABLE) #else #define PHP_DISP_E_DIVBYZERO DISP_E_DIVBYZERO #define PHP_DISP_E_OVERFLOW DISP_E_OVERFLOW #define PHP_DISP_E_BADINDEX DISP_E_BADINDEX +#define PHP_DISP_E_PARAMNOTFOUND DISP_E_PARAMNOTFOUND #define PHP_MK_E_UNAVAILABLE MK_E_UNAVAILABLE #endif diff --git a/ext/com_dotnet/com_extension.stub.php b/ext/com_dotnet/com_extension.stub.php index 54f31992ef7a4..9cfb8e3f514eb 100644 --- a/ext/com_dotnet/com_extension.stub.php +++ b/ext/com_dotnet/com_extension.stub.php @@ -264,6 +264,11 @@ * @cname PHP_DISP_E_BADINDEX */ const DISP_E_BADINDEX = UNKNOWN; +/** + * @var int + * @cname PHP_DISP_E_PARAMNOTFOUND + */ +const DISP_E_PARAMNOTFOUND = UNKNOWN; /** * @var int * @cname PHP_MK_E_UNAVAILABLE @@ -351,6 +356,7 @@ function com_load_typelib(string $typelib, bool $case_insensitive = true): bool class variant { public function __construct(mixed $value = null, int $type = VT_EMPTY, int $codepage = CP_ACP) {} + public static function createError(int $scode): variant {} } class com extends variant diff --git a/ext/com_dotnet/com_extension_arginfo.h b/ext/com_dotnet/com_extension_arginfo.h index fcca1ecbeefc1..18af8ecae6fea 100644 --- a/ext/com_dotnet/com_extension_arginfo.h +++ b/ext/com_dotnet/com_extension_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 76bd9190ad3f5e8fc3f6d6e0b5561f935c73efd3 */ + * Stub hash: 68fe5f30db7563b073a663397e5b804d81e8d9fb */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_variant_set, 0, 2, IS_VOID, 0) ZEND_ARG_OBJ_INFO(0, variant, variant, 0) @@ -116,6 +116,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_variant___construct, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, codepage, IS_LONG, 0, "CP_ACP") ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_variant_createError, 0, 1, variant, 0) + ZEND_ARG_TYPE_INFO(0, scode, IS_LONG, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_class_com___construct, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, module_name, IS_STRING, 0) ZEND_ARG_TYPE_MASK(0, server_name, MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_NULL, "null") @@ -165,6 +169,7 @@ ZEND_FUNCTION(com_print_typeinfo); ZEND_FUNCTION(com_message_pump); ZEND_FUNCTION(com_load_typelib); ZEND_METHOD(variant, __construct); +ZEND_METHOD(variant, createError); ZEND_METHOD(com, __construct); #if HAVE_MSCOREE_H ZEND_METHOD(dotnet, __construct); @@ -210,6 +215,7 @@ static const zend_function_entry ext_functions[] = { static const zend_function_entry class_variant_methods[] = { ZEND_ME(variant, __construct, arginfo_class_variant___construct, ZEND_ACC_PUBLIC) + ZEND_ME(variant, createError, arginfo_class_variant_createError, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_FE_END }; @@ -292,6 +298,7 @@ static void register_com_extension_symbols(int module_number) REGISTER_LONG_CONSTANT("DISP_E_DIVBYZERO", PHP_DISP_E_DIVBYZERO, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DISP_E_OVERFLOW", PHP_DISP_E_OVERFLOW, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DISP_E_BADINDEX", PHP_DISP_E_BADINDEX, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("DISP_E_PARAMNOTFOUND", PHP_DISP_E_PARAMNOTFOUND, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("MK_E_UNAVAILABLE", PHP_MK_E_UNAVAILABLE, CONST_CS | CONST_PERSISTENT); #if SIZEOF_ZEND_LONG == 8 REGISTER_LONG_CONSTANT("VT_UI8", VT_UI8, CONST_CS | CONST_PERSISTENT); diff --git a/ext/com_dotnet/com_variant.c b/ext/com_dotnet/com_variant.c index 40106e3d8f4ff..2983f41b3f682 100644 --- a/ext/com_dotnet/com_variant.c +++ b/ext/com_dotnet/com_variant.c @@ -491,6 +491,21 @@ PHP_METHOD(variant, __construct) } /* }}} */ +PHP_METHOD(variant, createError) +{ + zend_long scode; + VARIANT vres; + + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "l", &scode)) { + RETURN_THROWS(); + } + + VariantInit(&vres); + V_VT(&vres) = VT_ERROR; + V_ERROR(&vres) = scode; + php_com_wrap_variant(return_value, &vres, CP_ACP); +} + /* {{{ Assigns a new value for a variant object */ PHP_FUNCTION(variant_set) { diff --git a/ext/com_dotnet/tests/gh8750.phpt b/ext/com_dotnet/tests/gh8750.phpt new file mode 100644 index 0000000000000..824aac077add5 --- /dev/null +++ b/ext/com_dotnet/tests/gh8750.phpt @@ -0,0 +1,47 @@ +--TEST-- + +--EXTENSIONS-- +com_dotnet +--SKIPIF-- +Create("Provider=$provider;Data Source=$filename"); +} catch (com_exception) { + die("skip $provider provider not available"); +} +$catalog = null; +@unlink($filename); +?> +--FILE-- +Create("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$filename"); +$catalog = null; + +$db = new com("ADODB.Connection"); +$db->ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$filename"; +$db->Mode = 1; // adModeRead +$db->Open(); +// adSchemaProviderSpecific, *missing*, JET_SCHEMA_USERROSTER +$rs = $db->OpenSchema(-1, variant::createError(DISP_E_PARAMNOTFOUND), "{947bb102-5d43-11d1-bdbf-00c04fb92675}"); +// manual counting since rs.RecordCount is -1 (not supported) +$i = 0; +while (!$rs->EOF) { + $rs->MoveNext(); + $i++; +} +$rs->Close(); +$db->Close(); +var_dump($i); +?> +--EXPECT-- +int(1) +--CLEAN-- +