зеркало из https://github.com/microsoft/msphpsql.git
Fixed snprintf for binary encoding and EOLs (#1293)
This commit is contained in:
Родитель
f66b2c3e8a
Коммит
610f54c5f9
|
@ -436,7 +436,7 @@ const connection_option PDO_CONN_OPTS[] = {
|
|||
};
|
||||
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
// close the connection
|
||||
int pdo_sqlsrv_dbh_close(_Inout_ pdo_dbh_t *dbh);
|
||||
|
||||
|
@ -668,7 +668,7 @@ int pdo_sqlsrv_db_handle_factory( _Inout_ pdo_dbh_t *dbh, _In_opt_ zval *driver_
|
|||
// dbh - The PDO managed connection object.
|
||||
// Return:
|
||||
// Always returns 1 for success. (for PHP_VERSION_ID < 80100)
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
int pdo_sqlsrv_dbh_close( _Inout_ pdo_dbh_t *dbh )
|
||||
#else
|
||||
void pdo_sqlsrv_dbh_close(_Inout_ pdo_dbh_t *dbh)
|
||||
|
@ -678,7 +678,7 @@ void pdo_sqlsrv_dbh_close(_Inout_ pdo_dbh_t *dbh)
|
|||
|
||||
// if the connection didn't complete properly, driver_data isn't initialized.
|
||||
if( dbh->driver_data == NULL ) {
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 1;
|
||||
#else
|
||||
return;
|
||||
|
@ -691,7 +691,7 @@ void pdo_sqlsrv_dbh_close(_Inout_ pdo_dbh_t *dbh)
|
|||
core_sqlsrv_close( reinterpret_cast<sqlsrv_conn*>( dbh->driver_data ) );
|
||||
dbh->driver_data = NULL;
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
// always return success that the connection is closed
|
||||
return 1;
|
||||
#endif
|
||||
|
@ -708,7 +708,7 @@ void pdo_sqlsrv_dbh_close(_Inout_ pdo_dbh_t *dbh)
|
|||
// driver_options - User provided list of statement options.
|
||||
// Return:
|
||||
// 0 for failure, 1 for success.
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
int pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_reads_(sql_len) const char *sql,
|
||||
_Inout_ size_t sql_len, _Inout_ pdo_stmt_t *stmt, _In_ zval *driver_options)
|
||||
#else
|
||||
|
@ -755,10 +755,10 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr,
|
|||
driver_stmt->buffered_query_limit = driver_dbh->client_buffer_max_size;
|
||||
}
|
||||
|
||||
#if PHP_VERSION_ID >= 80100
|
||||
#if PHP_VERSION_ID >= 80100
|
||||
zend_string* sql_rewrite_zstr = NULL;
|
||||
const char* sql = ZSTR_VAL(sql_zstr);
|
||||
size_t sql_len = ZSTR_LEN(sql_zstr);
|
||||
const char* sql = ZSTR_VAL(sql_zstr);
|
||||
size_t sql_len = ZSTR_LEN(sql_zstr);
|
||||
#endif
|
||||
|
||||
// rewrite named parameters in the query to positional parameters if we aren't letting PDO do the
|
||||
|
@ -767,7 +767,7 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr,
|
|||
|
||||
// rewrite the query to map named parameters to positional parameters. We do this rather than use the ODBC named
|
||||
// parameters for consistency with the PDO MySQL and PDO ODBC drivers.
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
int zr = pdo_parse_params( stmt, const_cast<char*>( sql ), sql_len, &sql_rewrite, &sql_rewrite_len );
|
||||
CHECK_ZEND_ERROR(zr, driver_dbh, PDO_SQLSRV_ERROR_PARAM_PARSE) {
|
||||
throw core::CoreException();
|
||||
|
@ -804,8 +804,8 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr,
|
|||
driver_stmt->direct_query_subst_string = estrdup( sql );
|
||||
driver_stmt->direct_query_subst_string_len = sql_len;
|
||||
}
|
||||
|
||||
#if PHP_VERSION_ID >= 80100
|
||||
|
||||
#if PHP_VERSION_ID >= 80100
|
||||
if (sql_rewrite_zstr != NULL) {
|
||||
zend_string_release(sql_rewrite_zstr);
|
||||
}
|
||||
|
@ -817,7 +817,7 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr,
|
|||
// parse placeholders in the sql query into the placeholders ht
|
||||
ALLOC_HASHTABLE( placeholders );
|
||||
core::sqlsrv_zend_hash_init(*driver_dbh, placeholders, 5, ZVAL_PTR_DTOR /* dtor */, 0 /* persistent */);
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
sql_parser = new (sqlsrv_malloc(sizeof(sql_string_parser))) sql_string_parser(*driver_dbh, stmt->query_string,
|
||||
static_cast<int>(stmt->query_stringlen), placeholders);
|
||||
#else
|
||||
|
@ -849,7 +849,7 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr,
|
|||
reinterpret_cast<const char*>( driver_dbh->last_error()->sqlstate ));
|
||||
}
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 0;
|
||||
#else
|
||||
return false;
|
||||
|
@ -862,7 +862,7 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr,
|
|||
DIE( "pdo_sqlsrv_dbh_prepare: Unknown exception caught." );
|
||||
}
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 1;
|
||||
#else
|
||||
return true;
|
||||
|
@ -880,7 +880,7 @@ bool pdo_sqlsrv_dbh_prepare(_Inout_ pdo_dbh_t *dbh, _In_ zend_string *sql_zstr,
|
|||
// sql_len - length of sql query
|
||||
// Return
|
||||
// # of rows affected, -1 for an error.
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
zend_long pdo_sqlsrv_dbh_do( _Inout_ pdo_dbh_t *dbh, _In_reads_bytes_(sql_len) const char *sql, _In_ size_t sql_len )
|
||||
#else
|
||||
zend_long pdo_sqlsrv_dbh_do(_Inout_ pdo_dbh_t *dbh, _In_ const zend_string *sql)
|
||||
|
@ -912,7 +912,7 @@ zend_long pdo_sqlsrv_dbh_do(_Inout_ pdo_dbh_t *dbh, _In_ const zend_string *sql)
|
|||
NULL /*valid_stmt_opts*/, pdo_sqlsrv_handle_stmt_error, &temp_stmt );
|
||||
driver_stmt->set_func( __FUNCTION__ );
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
SQLRETURN execReturn = core_sqlsrv_execute(driver_stmt, sql, static_cast<int>(sql_len));
|
||||
#else
|
||||
SQLRETURN execReturn = core_sqlsrv_execute(driver_stmt, ZSTR_VAL(sql), ZSTR_LEN(sql));
|
||||
|
@ -977,7 +977,7 @@ zend_long pdo_sqlsrv_dbh_do(_Inout_ pdo_dbh_t *dbh, _In_ const zend_string *sql)
|
|||
// Return:
|
||||
// 0 for failure and 1 for success. (if PHP_VERSION_ID < 80100)
|
||||
// Return true if currently inside a transaction, false otherwise
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
int pdo_sqlsrv_dbh_begin(_Inout_ pdo_dbh_t *dbh)
|
||||
#else
|
||||
bool pdo_sqlsrv_dbh_begin(_Inout_ pdo_dbh_t *dbh)
|
||||
|
@ -999,14 +999,14 @@ bool pdo_sqlsrv_dbh_begin(_Inout_ pdo_dbh_t *dbh)
|
|||
|
||||
core_sqlsrv_begin_transaction( driver_conn );
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 1;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
catch( core::CoreException& ) {
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 0;
|
||||
#else
|
||||
return false;
|
||||
|
@ -1017,7 +1017,7 @@ bool pdo_sqlsrv_dbh_begin(_Inout_ pdo_dbh_t *dbh)
|
|||
DIE ("pdo_sqlsrv_dbh_begin: Uncaught exception occurred.");
|
||||
}
|
||||
// Should not have reached here but adding this due to compilation warnings
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 0;
|
||||
#else
|
||||
return false;
|
||||
|
@ -1037,7 +1037,7 @@ bool pdo_sqlsrv_dbh_begin(_Inout_ pdo_dbh_t *dbh)
|
|||
// Return:
|
||||
// 0 for failure and 1 for success. (if PHP_VERSION_ID < 80100)
|
||||
// Return true for success and false otherwise
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
int pdo_sqlsrv_dbh_commit(_Inout_ pdo_dbh_t *dbh)
|
||||
#else
|
||||
bool pdo_sqlsrv_dbh_commit(_Inout_ pdo_dbh_t *dbh)
|
||||
|
@ -1059,14 +1059,14 @@ bool pdo_sqlsrv_dbh_commit(_Inout_ pdo_dbh_t *dbh)
|
|||
|
||||
core_sqlsrv_commit( driver_conn );
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 1;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
catch( core::CoreException& ) {
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 0;
|
||||
#else
|
||||
return false;
|
||||
|
@ -1078,7 +1078,7 @@ bool pdo_sqlsrv_dbh_commit(_Inout_ pdo_dbh_t *dbh)
|
|||
}
|
||||
|
||||
// Should not have reached here but adding this due to compilation warnings
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 0;
|
||||
#else
|
||||
return false;
|
||||
|
@ -1096,7 +1096,7 @@ bool pdo_sqlsrv_dbh_commit(_Inout_ pdo_dbh_t *dbh)
|
|||
// Return:
|
||||
// 0 for failure and 1 for success. (if PHP_VERSION_ID < 80100)
|
||||
// Return true for success and false otherwise
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
int pdo_sqlsrv_dbh_rollback(_Inout_ pdo_dbh_t *dbh)
|
||||
#else
|
||||
bool pdo_sqlsrv_dbh_rollback(_Inout_ pdo_dbh_t *dbh)
|
||||
|
@ -1117,7 +1117,7 @@ bool pdo_sqlsrv_dbh_rollback(_Inout_ pdo_dbh_t *dbh)
|
|||
|
||||
core_sqlsrv_rollback( driver_conn );
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 1;
|
||||
#else
|
||||
return true;
|
||||
|
@ -1125,7 +1125,7 @@ bool pdo_sqlsrv_dbh_rollback(_Inout_ pdo_dbh_t *dbh)
|
|||
}
|
||||
catch( core::CoreException& ) {
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 0;
|
||||
#else
|
||||
return false;
|
||||
|
@ -1136,7 +1136,7 @@ bool pdo_sqlsrv_dbh_rollback(_Inout_ pdo_dbh_t *dbh)
|
|||
DIE ("pdo_sqlsrv_dbh_rollback: Uncaught exception occurred.");
|
||||
}
|
||||
// Should not have reached here but adding this due to compilation warnings
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 0;
|
||||
#else
|
||||
return false;
|
||||
|
@ -1154,7 +1154,7 @@ bool pdo_sqlsrv_dbh_rollback(_Inout_ pdo_dbh_t *dbh)
|
|||
// Return:
|
||||
// 0 for failure, 1 for success. (if PHP_VERSION_ID < 80100)
|
||||
// Return true on success and false in case of failure
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
int pdo_sqlsrv_dbh_set_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_ zval *val)
|
||||
#else
|
||||
bool pdo_sqlsrv_dbh_set_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_ zval *val)
|
||||
|
@ -1305,14 +1305,14 @@ bool pdo_sqlsrv_dbh_set_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout
|
|||
}
|
||||
}
|
||||
catch( pdo::PDOException& ) {
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 0;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 1;
|
||||
#else
|
||||
return true;
|
||||
|
@ -1354,7 +1354,7 @@ int pdo_sqlsrv_dbh_get_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_
|
|||
case PDO_ATTR_AUTOCOMMIT:
|
||||
case PDO_ATTR_TIMEOUT:
|
||||
{
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
// PDO does not throw "not supported" error message for these attributes.
|
||||
THROW_PDO_ERROR(driver_dbh, PDO_SQLSRV_ERROR_UNSUPPORTED_DBH_ATTR);
|
||||
#else
|
||||
|
@ -1465,14 +1465,14 @@ int pdo_sqlsrv_dbh_get_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_
|
|||
}
|
||||
}
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 1;
|
||||
#else
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
catch( core::CoreException& ) {
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 0;
|
||||
#else
|
||||
return -1;
|
||||
|
@ -1488,7 +1488,7 @@ int pdo_sqlsrv_dbh_get_attr(_Inout_ pdo_dbh_t *dbh, _In_ zend_long attr, _Inout_
|
|||
// info - zval in which to return the error info.
|
||||
// Return:
|
||||
// 0 for failure, 1 for success.
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
int pdo_sqlsrv_dbh_return_error(_In_ pdo_dbh_t *dbh, _In_opt_ pdo_stmt_t *stmt, _Out_ zval *info)
|
||||
#else
|
||||
void pdo_sqlsrv_dbh_return_error(_In_ pdo_dbh_t *dbh, _In_opt_ pdo_stmt_t *stmt, _Out_ zval *info)
|
||||
|
@ -1506,7 +1506,7 @@ void pdo_sqlsrv_dbh_return_error(_In_ pdo_dbh_t *dbh, _In_opt_ pdo_stmt_t *stmt,
|
|||
|
||||
pdo_sqlsrv_retrieve_context_error( ctx_error, info );
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
@ -1521,7 +1521,7 @@ void pdo_sqlsrv_dbh_return_error(_In_ pdo_dbh_t *dbh, _In_opt_ pdo_stmt_t *stmt,
|
|||
// Return:
|
||||
// Returns the last insert id as a string. (if PHP_VERSION_ID < 80100)
|
||||
// Returning NULL indicates an error condition. The input "name" MIGHT be NULL
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
char * pdo_sqlsrv_dbh_last_id(_Inout_ pdo_dbh_t *dbh, _In_z_ const char *name, _Out_ size_t* len)
|
||||
#else
|
||||
zend_string * pdo_sqlsrv_dbh_last_id(_Inout_ pdo_dbh_t *dbh, _In_ const zend_string *name)
|
||||
|
@ -1552,7 +1552,7 @@ zend_string * pdo_sqlsrv_dbh_last_id(_Inout_ pdo_dbh_t *dbh, _In_ const zend_str
|
|||
wsql_string = utf16_string_from_mbcs_string(SQLSRV_ENCODING_CHAR, LAST_INSERT_ID_QUERY, sizeof(LAST_INSERT_ID_QUERY), &wsql_len);
|
||||
} else {
|
||||
char buffer[LAST_INSERT_ID_QUERY_MAX_LEN] = { '\0' };
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
snprintf(buffer, LAST_INSERT_ID_QUERY_MAX_LEN, SEQUENCE_CURRENT_VALUE_QUERY, name);
|
||||
#else
|
||||
const char *name_str = ZSTR_VAL(name);
|
||||
|
@ -1575,7 +1575,7 @@ zend_string * pdo_sqlsrv_dbh_last_id(_Inout_ pdo_dbh_t *dbh, _In_ const zend_str
|
|||
// execute the last insert id query
|
||||
core::SQLExecDirectW( driver_stmt, wsql_string );
|
||||
core::SQLFetchScroll( driver_stmt, SQL_FETCH_NEXT, 0 );
|
||||
|
||||
|
||||
SQLRETURN r = core::SQLGetData(driver_stmt, 1, SQL_C_CHAR, idSTR, LAST_INSERT_ID_BUFF_LEN, &cbID, false);
|
||||
CHECK_CUSTOM_ERROR((!SQL_SUCCEEDED(r) || cbID == SQL_NULL_DATA || cbID == SQL_NO_TOTAL), driver_stmt,
|
||||
PDO_SQLSRV_ERROR_LAST_INSERT_ID) {
|
||||
|
@ -1593,7 +1593,7 @@ zend_string * pdo_sqlsrv_dbh_last_id(_Inout_ pdo_dbh_t *dbh, _In_ const zend_str
|
|||
if( driver_stmt ) {
|
||||
driver_stmt->~sqlsrv_stmt();
|
||||
}
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
*len = 0;
|
||||
str = reinterpret_cast<char*>(sqlsrv_malloc(0, sizeof(char), 1)); // return an empty string with a null terminator
|
||||
str[0] = '\0';
|
||||
|
@ -1606,11 +1606,11 @@ zend_string * pdo_sqlsrv_dbh_last_id(_Inout_ pdo_dbh_t *dbh, _In_ const zend_str
|
|||
// restore error handling to its previous mode
|
||||
dbh->error_mode = prev_err_mode;
|
||||
|
||||
// copy the last ID string and return it
|
||||
// copy the last ID string and return it
|
||||
str = reinterpret_cast<char*>(sqlsrv_malloc(cbID, sizeof(char), 1)); // include space for null terminator
|
||||
strcpy_s(str, cbID + 1, idSTR);
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
*len = static_cast<size_t>(cbID);
|
||||
return str;
|
||||
#else
|
||||
|
@ -1631,7 +1631,7 @@ zend_string * pdo_sqlsrv_dbh_last_id(_Inout_ pdo_dbh_t *dbh, _In_ const zend_str
|
|||
// quoted_len - Length of the output string.
|
||||
// Return:
|
||||
// 0 for failure, 1 for success.
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
int pdo_sqlsrv_dbh_quote( _Inout_ pdo_dbh_t* dbh, _In_reads_(unquoted_len) const char* unquoted, _In_ size_t unquoted_len, _Outptr_result_buffer_(*quoted_len) char **quoted, _Out_ size_t* quoted_len,
|
||||
enum pdo_param_type paramtype )
|
||||
#else
|
||||
|
@ -1713,60 +1713,61 @@ zend_string* pdo_sqlsrv_dbh_quote(_Inout_ pdo_dbh_t* dbh, _In_ const zend_string
|
|||
}
|
||||
#endif
|
||||
|
||||
if (encoding == SQLSRV_ENCODING_BINARY) {
|
||||
#if PHP_VERSION_ID < 80100
|
||||
*quoted_len = (unquoted_len * 2) + 2; // each character will be converted to 2 hex digits and prepend '0x' to the result
|
||||
*quoted = reinterpret_cast<char*>(sqlsrv_malloc(*quoted_len, sizeof(char), 1)); // include space for null terminator
|
||||
memset(*quoted, '\0', *quoted_len + 1);
|
||||
|
||||
unsigned int pos = 0;
|
||||
(*quoted)[pos++] = '0';
|
||||
(*quoted)[pos++] = 'x';
|
||||
|
||||
for (size_t index = 0; index < unquoted_len && unquoted[index] != '\0'; ++index) {
|
||||
// On success, snprintf returns the total number of characters written
|
||||
// On failure, a negative number is returned
|
||||
// The generated string has a length of at most len - 1, so
|
||||
if (encoding == SQLSRV_ENCODING_BINARY) {
|
||||
#if PHP_VERSION_ID < 80100
|
||||
*quoted_len = (unquoted_len * 2) + 2; // each character will be converted to 2 hex digits and prepend '0x' to the result
|
||||
*quoted = reinterpret_cast<char*>(sqlsrv_malloc(*quoted_len, sizeof(char), 1)); // include space for null terminator
|
||||
memset(*quoted, '\0', *quoted_len + 1);
|
||||
|
||||
unsigned int pos = 0;
|
||||
(*quoted)[pos++] = '0';
|
||||
(*quoted)[pos++] = 'x';
|
||||
|
||||
for (size_t index = 0; index < unquoted_len && unquoted[index] != '\0'; ++index) {
|
||||
// On success, snprintf returns the total number of characters written
|
||||
// On failure, a negative number is returned
|
||||
// The generated string has a length of at most len - 1, so
|
||||
// len is 3 (2 hex digits + 1)
|
||||
// Requires "& 0x000000FF", or snprintf will translate "0x90" to "0xFFFFFF90"
|
||||
int n = snprintf((char*)(*quoted + pos), 3, "%02X", unquoted[index] & 0x000000FF);
|
||||
if (n < 0) {
|
||||
// Something went wrong, simply return 0 (failure)
|
||||
return 0;
|
||||
}
|
||||
pos += 2;
|
||||
}
|
||||
|
||||
return 1;
|
||||
if (n < 0) {
|
||||
// Something went wrong, simply return 0 (failure)
|
||||
return 0;
|
||||
}
|
||||
pos += 2;
|
||||
}
|
||||
|
||||
return 1;
|
||||
#else
|
||||
size_t unquoted_len = ZSTR_LEN(unquoted);
|
||||
size_t unquoted_len = ZSTR_LEN(unquoted);
|
||||
const char *unquoted_str = ZSTR_VAL(unquoted);
|
||||
|
||||
sqlsrv_malloc_auto_ptr<char> quoted;
|
||||
sqlsrv_malloc_auto_ptr<char> quoted;
|
||||
size_t quoted_len = (unquoted_len * 2) + 2; // each character will be converted to 2 hex digits and prepend '0x' to the result
|
||||
quoted = reinterpret_cast<char*>(sqlsrv_malloc(quoted_len, sizeof(char), 1)); // include space for null terminator
|
||||
memset(quoted, '\0', quoted_len + 1);
|
||||
quoted = reinterpret_cast<char*>(sqlsrv_malloc(quoted_len, sizeof(char), 1)); // include space for null terminator
|
||||
memset(quoted, '\0', quoted_len + 1);
|
||||
|
||||
unsigned int pos = 0;
|
||||
quoted[pos++] = '0';
|
||||
quoted[pos++] = 'x';
|
||||
|
||||
char *p = quoted;
|
||||
for (size_t index = 0; index < unquoted_len && unquoted_str[index] != '\0'; ++index) {
|
||||
// On success, snprintf returns the total number of characters written
|
||||
// On failure, a negative number is returned
|
||||
// The generated string has a length of at most len - 1, so
|
||||
unsigned int pos = 0;
|
||||
quoted[pos++] = '0';
|
||||
quoted[pos++] = 'x';
|
||||
|
||||
char *p = quoted;
|
||||
for (size_t index = 0; index < unquoted_len && unquoted_str[index] != '\0'; ++index) {
|
||||
// On success, snprintf returns the total number of characters written
|
||||
// On failure, a negative number is returned
|
||||
// The generated string has a length of at most len - 1, so
|
||||
// len is 3 (2 hex digits + 1)
|
||||
int n = snprintf((char*)(p + pos), 3, "%02X", unquoted_str[index]);
|
||||
if (n < 0) {
|
||||
// Something went wrong, simply return NULL (failure)
|
||||
return NULL;
|
||||
}
|
||||
pos += 2;
|
||||
}
|
||||
|
||||
zend_string* zstr = zend_string_init(quoted, quoted_len, 0);
|
||||
return zstr;
|
||||
// Requires "& 0x000000FF", or snprintf will translate "0x90" to "0xFFFFFF90"
|
||||
int n = snprintf((char*)(p + pos), 3, "%02X", unquoted_str[index] & 0x000000FF);
|
||||
if (n < 0) {
|
||||
// Something went wrong, simply return NULL (failure)
|
||||
return NULL;
|
||||
}
|
||||
pos += 2;
|
||||
}
|
||||
|
||||
zend_string* zstr = zend_string_init(quoted, quoted_len, 0);
|
||||
return zstr;
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
|
@ -1775,10 +1776,10 @@ zend_string* pdo_sqlsrv_dbh_quote(_Inout_ pdo_dbh_t* dbh, _In_ const zend_string
|
|||
int quotes_needed = (use_national_char_set) ? 3 : 2;
|
||||
char c = '\'';
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
std::string tmp_str(unquoted, unquoted_len); // Copy all unquoted_len characters from unquoted
|
||||
#else
|
||||
size_t unquoted_len = ZSTR_LEN(unquoted);
|
||||
size_t unquoted_len = ZSTR_LEN(unquoted);
|
||||
const char *unquoted_str = ZSTR_VAL(unquoted);
|
||||
std::string tmp_str(unquoted_str, unquoted_len); // Copy all unquoted_len characters from unquoted
|
||||
#endif
|
||||
|
@ -1790,18 +1791,18 @@ zend_string* pdo_sqlsrv_dbh_quote(_Inout_ pdo_dbh_t* dbh, _In_ const zend_string
|
|||
}
|
||||
size_t len = tmp_str.length();
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
*quoted_len = quotes_needed + len; // The new length should be number of quotes plus the length of tmp_str
|
||||
*quoted = reinterpret_cast<char*>(sqlsrv_malloc(*quoted_len, sizeof(char), 1)); // include space for null terminator
|
||||
memset(*quoted, '\0', *quoted_len + 1);
|
||||
memset(*quoted, '\0', *quoted_len + 1);
|
||||
|
||||
char *p = *quoted;
|
||||
#else
|
||||
sqlsrv_malloc_auto_ptr<char> quoted;
|
||||
sqlsrv_malloc_auto_ptr<char> quoted;
|
||||
size_t quoted_len = quotes_needed + len; // length returned to the caller should not account for null terminator
|
||||
quoted = reinterpret_cast<char*>(sqlsrv_malloc(quoted_len, sizeof(char), 1)); // include space for null terminator
|
||||
memset(quoted, '\0', quoted_len + 1);
|
||||
|
||||
quoted = reinterpret_cast<char*>(sqlsrv_malloc(quoted_len, sizeof(char), 1)); // include space for null terminator
|
||||
memset(quoted, '\0', quoted_len + 1);
|
||||
|
||||
char *p = quoted;
|
||||
#endif
|
||||
size_t pos = 0;
|
||||
|
@ -1813,11 +1814,11 @@ zend_string* pdo_sqlsrv_dbh_quote(_Inout_ pdo_dbh_t* dbh, _In_ const zend_string
|
|||
pos += len;
|
||||
*(p + pos) = c; // Add the end quote
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
return 1;
|
||||
#else
|
||||
zend_string* zstr = zend_string_init(quoted, quoted_len, 0);
|
||||
return zstr;
|
||||
zend_string* zstr = zend_string_init(quoted, quoted_len, 0);
|
||||
return zstr;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -278,12 +278,12 @@ int pdo_sqlsrv_stmt_fetch( _Inout_ pdo_stmt_t *stmt, _In_ enum pdo_fetch_orienta
|
|||
int pdo_sqlsrv_stmt_param_hook( _Inout_ pdo_stmt_t *stmt,
|
||||
_Inout_ struct pdo_bound_param_data *param, _In_ enum pdo_param_event event_type );
|
||||
int pdo_sqlsrv_stmt_describe_col( _Inout_ pdo_stmt_t *stmt, _In_ int colno );
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
int pdo_sqlsrv_stmt_get_col_data( _Inout_ pdo_stmt_t *stmt, _In_ int colno,
|
||||
_Out_writes_bytes_opt_(*len) char **ptr, _Inout_ size_t *len, _Out_opt_ int *caller_frees );
|
||||
#else
|
||||
#else
|
||||
int pdo_sqlsrv_stmt_get_col_data(_Inout_ pdo_stmt_t *stmt, _In_ int colno, _Inout_ zval *result, _Inout_ enum pdo_param_type *type);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int pdo_sqlsrv_stmt_set_attr( _Inout_ pdo_stmt_t *stmt, _In_ zend_long attr, _Inout_ zval *val );
|
||||
int pdo_sqlsrv_stmt_get_attr( _Inout_ pdo_stmt_t *stmt, _In_ zend_long attr, _Inout_ zval *return_value );
|
||||
|
@ -458,7 +458,7 @@ int pdo_sqlsrv_stmt_describe_col( _Inout_ pdo_stmt_t *stmt, _In_ int colno)
|
|||
// Set the precision
|
||||
column_data->precision = core_meta_data->field_scale;
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
// Set the param_type
|
||||
column_data->param_type = PDO_PARAM_ZVAL;
|
||||
#endif
|
||||
|
@ -557,7 +557,7 @@ int pdo_sqlsrv_stmt_execute( _Inout_ pdo_stmt_t *stmt )
|
|||
|
||||
zend_hash_internal_pointer_reset(driver_stmt->placeholders);
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
query = stmt->active_query_string;
|
||||
query_len = static_cast<unsigned int>(stmt->active_query_stringlen);
|
||||
#else
|
||||
|
@ -663,7 +663,7 @@ int pdo_sqlsrv_stmt_fetch( _Inout_ pdo_stmt_t *stmt, _In_ enum pdo_fetch_orienta
|
|||
pdo_bound_param_data* bind_data = NULL;
|
||||
|
||||
if( !driver_stmt->bound_column_param_types ) {
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
driver_stmt->bound_column_param_types =
|
||||
reinterpret_cast<pdo_param_type*>( sqlsrv_malloc( stmt->column_count, sizeof( pdo_param_type ), 0 ));
|
||||
std::fill( driver_stmt->bound_column_param_types, driver_stmt->bound_column_param_types + stmt->column_count,
|
||||
|
@ -679,7 +679,7 @@ int pdo_sqlsrv_stmt_fetch( _Inout_ pdo_stmt_t *stmt, _In_ enum pdo_fetch_orienta
|
|||
|
||||
for( long i = 0; i < stmt->column_count; ++i ) {
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
if (NULL== (bind_data = reinterpret_cast<pdo_bound_param_data*>(zend_hash_index_find_ptr(stmt->bound_columns, i))) &&
|
||||
(NULL == (bind_data = reinterpret_cast<pdo_bound_param_data*>(zend_hash_find_ptr(stmt->bound_columns, stmt->columns[i].name))))) {
|
||||
|
||||
|
@ -759,7 +759,7 @@ int pdo_sqlsrv_stmt_fetch( _Inout_ pdo_stmt_t *stmt, _In_ enum pdo_fetch_orienta
|
|||
// freeing the memory.
|
||||
// Return:
|
||||
// 0 for failure, 1 for success.
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
int pdo_sqlsrv_stmt_get_col_data( _Inout_ pdo_stmt_t *stmt, _In_ int colno,
|
||||
_Out_writes_bytes_opt_(*len) char **ptr, _Inout_ size_t *len, _Out_opt_ int *caller_frees)
|
||||
#else
|
||||
|
@ -783,7 +783,7 @@ int pdo_sqlsrv_stmt_get_col_data(_Inout_ pdo_stmt_t *stmt, _In_ int colno, _Inou
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
// Let PDO free the memory after use.
|
||||
* caller_frees = 1;
|
||||
#endif
|
||||
|
@ -803,7 +803,7 @@ int pdo_sqlsrv_stmt_get_col_data(_Inout_ pdo_stmt_t *stmt, _In_ int colno, _Inou
|
|||
|
||||
// if a column is bound to a type different than the column type, figure out a way to convert it to the
|
||||
// type they want
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
if (stmt->bound_columns && driver_stmt->bound_column_param_types[colno] != PDO_PARAM_ZVAL) {
|
||||
#else
|
||||
if (stmt->bound_columns) {
|
||||
|
@ -851,7 +851,7 @@ int pdo_sqlsrv_stmt_get_col_data(_Inout_ pdo_stmt_t *stmt, _In_ int colno, _Inou
|
|||
}
|
||||
|
||||
SQLSRV_PHPTYPE sqlsrv_phptype_out = SQLSRV_PHPTYPE_INVALID;
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
core_sqlsrv_get_field(driver_stmt, colno, sqlsrv_php_type, false, *(reinterpret_cast<void**>(ptr)),
|
||||
reinterpret_cast<SQLLEN*>(len), true, &sqlsrv_phptype_out);
|
||||
|
||||
|
@ -1161,7 +1161,7 @@ int pdo_sqlsrv_stmt_get_col_meta( _Inout_ pdo_stmt_t *stmt, _In_ zend_long colno
|
|||
&out_buff_len, &field_type_num );
|
||||
add_assoc_string( return_value, "table", table_name );
|
||||
|
||||
#if PHP_VERSION_ID < 80100
|
||||
#if PHP_VERSION_ID < 80100
|
||||
if( stmt->columns && stmt->columns[colno].param_type == PDO_PARAM_ZVAL ) {
|
||||
add_assoc_long( return_value, "pdo_type", pdo_type );
|
||||
}
|
||||
|
|
|
@ -78,7 +78,7 @@
|
|||
#define SQL_SOPT_SS_TEXTPTR_LOGGING (SQL_SOPT_SS_BASE+0) // Text pointer logging
|
||||
#define SQL_SOPT_SS_NOBROWSETABLE (SQL_SOPT_SS_BASE+3) // Set NOBROWSETABLE option
|
||||
#define SQL_SOPT_SS_PARAM_FOCUS (SQL_SOPT_SS_BASE+11)// Direct subsequent calls to parameter related methods to set properties on constituent columns/parameters of container types
|
||||
#define SQL_SOPT_SS_NAME_SCOPE (SQL_SOPT_SS_BASE+12)// Sets name scope for subsequent catalog function calls
|
||||
#define SQL_SOPT_SS_NAME_SCOPE (SQL_SOPT_SS_BASE+12)// Sets name scope for subsequent catalog function calls
|
||||
#define SQL_SOPT_SS_COLUMN_ENCRYPTION (SQL_SOPT_SS_BASE+13)// Sets the column encryption mode
|
||||
// Define old names
|
||||
#define SQL_TEXTPTR_LOGGING SQL_SOPT_SS_TEXTPTR_LOGGING
|
||||
|
@ -182,10 +182,10 @@
|
|||
#define SQL_COLUMN_ENCRYPTION_DEFAULT SQL_COLUMN_ENCRYPTION_DISABLE
|
||||
// Defines for use with SQL_COPT_SS_CEKCACHETTL
|
||||
#define SQL_CEKCACHETTL_DEFAULT 7200L // TTL value in seconds (2 hours)
|
||||
//SQL_SOPT_SS_NAME_SCOPE
|
||||
#define SQL_SS_NAME_SCOPE_TABLE 0L
|
||||
#define SQL_SS_NAME_SCOPE_TABLE_TYPE 1L
|
||||
#define SQL_SS_NAME_SCOPE_DEFAULT SQL_SS_NAME_SCOPE_TABLE
|
||||
//SQL_SOPT_SS_NAME_SCOPE
|
||||
#define SQL_SS_NAME_SCOPE_TABLE 0L
|
||||
#define SQL_SS_NAME_SCOPE_TABLE_TYPE 1L
|
||||
#define SQL_SS_NAME_SCOPE_DEFAULT SQL_SS_NAME_SCOPE_TABLE
|
||||
// SQL_COPT_SS_ENCRYPT
|
||||
#define SQL_EN_OFF 0L
|
||||
#define SQL_EN_ON 1L
|
||||
|
|
Загрузка…
Ссылка в новой задаче