Updated pdo_sqlsrv_get_driver_methods as per documentation (#1259)

This commit is contained in:
Jenny Tam 2021-05-17 17:37:19 -07:00 committed by GitHub
parent 3bc0624dad
commit 7313fa0c8b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 5 deletions

View file

@ -1574,12 +1574,13 @@ pdo_sqlsrv_function_entry *pdo_sqlsrv_get_driver_methods( _Inout_ pdo_dbh_t *dbh
PDO_LOG_DBH_ENTRY;
sqlsrv_conn* driver_conn = reinterpret_cast<sqlsrv_conn*>( dbh->driver_data );
SQLSRV_ASSERT( driver_conn != NULL, "pdo_sqlsrv_get_driver_methods: driver_data object was NULL." );
CHECK_CUSTOM_ERROR( true, driver_conn, PDO_SQLSRV_ERROR_FUNCTION_NOT_IMPLEMENTED ) {
return NULL;
}
return NULL; // to avoid a compiler warning
// As per documentation, simply return false if the method does not exist
// https://www.php.net/manual/en/function.is-callable.php
// But user can call PDO::errorInfo() to check the error message if necessary
CHECK_CUSTOM_WARNING_AS_ERROR(true, driver_conn, PDO_SQLSRV_ERROR_FUNCTION_NOT_IMPLEMENTED);
return NULL; // return NULL for PDO to take care of the rest
}
namespace {

View file

@ -0,0 +1,50 @@
--TEST--
GitHub issue 1258 - is_callable() throws an exception if PDOStatement method does not exist
--DESCRIPTION--
The test shows is_callable() will return false if PDOStatement method does not exist instead of throwing an exception. The user can still check errorInfo() for the error message. See documentation https://www.php.net/manual/en/function.is-callable.php
--ENV--
PHPT_EXEC=true
--SKIPIF--
<?php require('skipif.inc'); ?>
--FILE--
<?php
require_once("MsSetup.inc");
require_once("MsCommon_mid-refactor.inc");
try {
$conn = connect();
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT @@Version");
$functionExists = is_callable([$stmt, 'bindParam'], false, $callable);
var_dump($functionExists);
var_dump($callable);
$functionExists = is_callable([$stmt, 'boo']);
var_dump($functionExists);
echo PHP_EOL . "Error INFO:" . PHP_EOL;
var_dump($conn->errorInfo());
echo "Done\n";
} catch (PdoException $e) {
echo $e->getMessage();
}
?>
--EXPECT--
bool(true)
string(23) "PDOStatement::bindParam"
bool(false)
Error INFO:
array(3) {
[0]=>
string(5) "IMSSP"
[1]=>
int(-58)
[2]=>
string(48) "This function is not implemented by this driver."
}
Done