Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Addressed various issues with PHP 7.4 beta1 #1015

Merged
merged 4 commits into from
Jul 29, 2019
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions source/pdo_sqlsrv/pdo_stmt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1129,11 +1129,11 @@ int pdo_sqlsrv_stmt_get_col_meta( _Inout_ pdo_stmt_t *stmt, _In_ zend_long colno
}
}
catch( core::CoreException& ) {

zval_ptr_dtor(return_value);
return FAILURE;
}
catch(...) {

zval_ptr_dtor(return_value);
DIE( "pdo_sqlsrv_stmt_get_col_meta: Unknown exception occurred while retrieving metadata." );
}

Expand Down
17 changes: 12 additions & 5 deletions source/shared/core_stmt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -988,7 +988,7 @@ void core_sqlsrv_sensitivity_metadata( _Inout_ sqlsrv_stmt* stmt TSRMLS_DC )
return;
}

if (stmt->current_sensitivity_metadata != NULL) {
if (stmt->current_sensitivity_metadata) {
// Already cached, so return
return;
}
Expand Down Expand Up @@ -1873,7 +1873,7 @@ void core_get_field_common( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_i
// be returned as a zval.
case SQLSRV_PHPTYPE_DATETIME:
{
char* field_value_temp = NULL;
sqlsrv_malloc_auto_ptr<char> field_value_temp;
SQLLEN field_len_temp = 0;

field_value_temp = static_cast<char*>(sqlsrv_malloc(MAX_DATETIME_STRING_LEN));
Expand All @@ -1882,8 +1882,7 @@ void core_get_field_common( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_i
SQLRETURN r = stmt->current_results->get_data(field_index + 1, SQL_C_CHAR, field_value_temp, MAX_DATETIME_STRING_LEN, &field_len_temp, true TSRMLS_CC);

if (r == SQL_NO_DATA || field_len_temp == SQL_NULL_DATA) {
sqlsrv_free(field_value_temp);
field_value_temp = NULL;
field_value_temp.reset();
field_len_temp = 0;
}

Expand All @@ -1892,6 +1891,7 @@ void core_get_field_common( _Inout_ sqlsrv_stmt* stmt, _In_ SQLUSMALLINT field_i
}

field_value = field_value_temp;
field_value_temp.transferred();
*field_len = field_len_temp;

break;
Expand Down Expand Up @@ -2428,6 +2428,7 @@ void finalize_output_parameters( _Inout_ sqlsrv_stmt* stmt TSRMLS_DC )
zend_string* key = NULL;
void* output_param_temp = NULL;

try {
ZEND_HASH_FOREACH_KEY_PTR( params_ht, index, key, output_param_temp ) {
david-puglielli marked this conversation as resolved.
Show resolved Hide resolved
sqlsrv_output_param* output_param = static_cast<sqlsrv_output_param*>( output_param_temp );
zval* value_z = Z_REFVAL_P( output_param->param_z );
Expand Down Expand Up @@ -2553,9 +2554,15 @@ void finalize_output_parameters( _Inout_ sqlsrv_stmt* stmt TSRMLS_DC )
}
value_z = NULL;
} ZEND_HASH_FOREACH_END();
}
catch (core::CoreException&) {
// empty the hash table since it's been processed
zend_hash_clean(Z_ARRVAL(stmt->output_params));

throw;
david-puglielli marked this conversation as resolved.
Show resolved Hide resolved
}
// empty the hash table since it's been processed
zend_hash_clean( Z_ARRVAL( stmt->output_params ));
zend_hash_clean(Z_ARRVAL(stmt->output_params));
return;
}

Expand Down
23 changes: 16 additions & 7 deletions source/shared/core_stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,11 @@ int sqlsrv_stream_close( _Inout_ php_stream* stream, int /*close_handle*/ TSRMLS
// read from a sqlsrv stream into the buffer provided by Zend. The parameters for binary vs. char are
// set when sqlsrv_get_field is called by the user specifying which field type they want.

size_t sqlsrv_stream_read( _Inout_ php_stream* stream, _Out_writes_bytes_(count) char* buf, _Inout_ size_t count TSRMLS_DC )
#if PHP_VERSION_ID >= 70400
ssize_t sqlsrv_stream_read(_Inout_ php_stream* stream, _Out_writes_bytes_(count) char* buf, _Inout_ size_t count TSRMLS_DC)
#else
size_t sqlsrv_stream_read(_Inout_ php_stream* stream, _Out_writes_bytes_(count) char* buf, _Inout_ size_t count TSRMLS_DC)
#endif
{
SQLLEN read = 0;
SQLSMALLINT c_type = SQL_C_CHAR;
Expand Down Expand Up @@ -184,15 +188,20 @@ size_t sqlsrv_stream_read( _Inout_ php_stream* stream, _Out_writes_bytes_(count)

return static_cast<size_t>( read );
}

catch( core::CoreException& ) {

catch (core::CoreException&) {
#if PHP_VERSION_ID >= 70400
return -1;
#else
return 0;
#endif
}
catch( ... ) {

LOG( SEV_ERROR, "sqlsrv_stream_read: Unknown exception caught." );
catch (...) {
LOG(SEV_ERROR, "sqlsrv_stream_read: Unknown exception caught.");
#if PHP_VERSION_ID >= 70400
return -1;
#else
return 0;
#endif
}
}

Expand Down
2 changes: 1 addition & 1 deletion test/functional/pdo_sqlsrv/pdo_utf8_conn.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ if ($c !== false) {

Fatal error: Uncaught PDOException: SQLSTATE\[(28000|08001|HYT00)\]: .*\[Microsoft\]\[ODBC Driver 1[0-9] for SQL Server\](\[SQL Server\])?(Named Pipes Provider: Could not open a connection to SQL Server \[2\]\. |TCP Provider: Error code (0x2726|0x2AF9)|Login timeout expired|Login failed for user 'sa'\.) in .+(\/|\\)pdo_utf8_conn\.php:[0-9]+
Stack trace:
#0 .+(\/|\\)pdo_utf8_conn\.php\([0-9]+\): PDO->__construct\('sqlsrv:Server=l\.\.\.', 'sa', 'Sunshine4u'\)
#0 .+(\/|\\)pdo_utf8_conn\.php\([0-9]+\): PDO->__construct(\(\)|\('sqlsrv:Server=l\.\.\.', 'sa', 'Sunshine4u'\))
#1 {main}
thrown in .+(\/|\\)pdo_utf8_conn\.php on line [0-9]+
2 changes: 1 addition & 1 deletion test/functional/pdo_sqlsrv/pdostatement_fetchAll.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,6 @@ Test_9 : FETCH_INVALID :

Fatal error: Uncaught Error: Undefined class constant 'FETCH_UNKNOWN' in %s:%x
Stack trace:
#0 %s: fetchAllInvalid(Object(PDO), 'PDO_MainTypes')
#0 %s: fetchAllInvalid(%S)
#1 {main}
thrown in %s on line %x
16 changes: 8 additions & 8 deletions test/functional/pdo_sqlsrv/pdostatement_fetch_orientation.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ try {
throw new Exception( "Not A" );
}
$row = $stmt1->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_PRIOR );
if( $row[ 'val' ] != false ) {
if ($row !== false) {
throw new Exception( "Not false" );
}

Expand All @@ -53,7 +53,7 @@ try {
throw new Exception( "Not A" );
}
$row = $stmt1->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_REL, -1 );
if( $row[ 'val' ] != false ) {
if ($row !== false) {
throw new Exception( "Not false" );
}

Expand All @@ -63,7 +63,7 @@ try {
throw new Exception( "Not C" );
}
$row = $stmt1->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT );
if( $row[ 'val' ] != false ) {
if ($row !== false) {
throw new Exception( "Not false" );
}

Expand All @@ -73,7 +73,7 @@ try {
throw new Exception( "Not C" );
}
$row = $stmt1->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_REL, 1 );
if( $row[ 'val' ] != false ) {
if ($row !== false) {
throw new Exception( "Not false" );
}

Expand All @@ -99,7 +99,7 @@ try {
throw new Exception( "Not A" );
}
$row = $stmt1->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, -1 );
if( $row[ 'val' ] != false ) {
if ($row !== false) {
throw new Exception( "Not false" );
}

Expand All @@ -125,7 +125,7 @@ try {
throw new Exception( "Not C" );
}
$row = $stmt1->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT);
if( $row[ 'val' ] != false ) {
if ($row !== false) {
throw new Exception( "Not false" );
}

Expand All @@ -135,7 +135,7 @@ try {
throw new Exception( "Not A" );
}
$row = $stmt1->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_PRIOR);
if( $row[ 'val' ] != false ) {
if ($row !== false) {
throw new Exception( "Not false" );
}

Expand All @@ -145,7 +145,7 @@ try {
throw new Exception( "Not A" );
}
$row = $stmt1->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_REL, -1);
if( $row[ 'val' ] != false ) {
if ($row !== false) {
throw new Exception( "Not false" );
}

Expand Down
2 changes: 1 addition & 1 deletion test/functional/pdo_sqlsrv/pdostatement_fetch_style.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,6 @@ Test_9 : FETCH_INVALID :

Fatal error: Uncaught Error: Undefined class constant 'FETCH_UNKNOWN' in %s:%x
Stack trace:
#0 %s: fetchWithStyle(Object(PDO), 'PDO_MainTypes', 'PDO::FETCH_INVA...')
#0 %s: fetchWithStyle(%S)
#1 {main}
thrown in %s on line %x
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ foreach ($dataTypes as $dataType) {
}
}
// 22018 is the SQLSTATE for any incompatible conversion errors
if ($isCompatible && sqlsrv_errors()[0]['SQLSTATE'] == 22018) {
$errors = sqlsrv_errors();
if (!empty($errors) && $isCompatible && $errors[0]['SQLSTATE'] == 22018) {
echo "$sqlType should be compatible with $dataType\n";
$success = false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ foreach ($dataTypes as $dataType) {
}
}
// 22018 is the SQLSTATE for any incompatible conversion errors
if ($isCompatible && sqlsrv_errors()[0]['SQLSTATE'] == 22018) {
$errors = sqlsrv_errors();
if (!empty($errors) && $isCompatible && $errors[0]['SQLSTATE'] == 22018) {
echo "$sqlType should be compatible with $dataType\n";
$success = false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ foreach ($dataTypes as $dataType) {
}
}
// 22018 is the SQLSTATE for any incompatible conversion errors
if ($isCompatible && sqlsrv_errors()[0]['SQLSTATE'] == 22018) {
$errors = sqlsrv_errors();
if (!empty($errors) && $isCompatible && $errors[0]['SQLSTATE'] == 22018) {
echo "$sqlType should be compatible with $dataType\n";
$success = false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ function fetchData($conn, $table, $size)
echo "Expect this to fail\n";
} else {
$error = 'Memory limit of 1 KB exceeded for buffered query';
if (strpos(sqlsrv_errors()[0]['message'], $error) === false) {
$errors = sqlsrv_errors();
if (!empty($errors) && strpos($errors[0]['message'], $error) === false) {
print_r(sqlsrv_errors());
}
}
Expand Down