mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
remove old unicode code, that is was compiled out by using a macro
This commit is contained in:
parent
571b46bff6
commit
6074df91c6
14 changed files with 80 additions and 669 deletions
|
@ -456,11 +456,7 @@ mysqlnd_switch_to_ssl_if_needed(
|
|||
if (options->charset_name && (charset = mysqlnd_find_charset_name(options->charset_name))) {
|
||||
auth_packet->charset_no = charset->nr;
|
||||
} else {
|
||||
#if MYSQLND_UNICODE
|
||||
auth_packet->charset_no = 200;/* utf8 - swedish collation, check mysqlnd_charset.c */
|
||||
#else
|
||||
auth_packet->charset_no = greet_packet->charset_no;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef MYSQLND_SSL_SUPPORTED
|
||||
|
@ -1030,13 +1026,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
|
|||
|
||||
mysqlnd_local_infile_default(conn);
|
||||
|
||||
#if MYSQLND_UNICODE
|
||||
{
|
||||
unsigned int as_unicode = 1;
|
||||
conn->m->set_client_option(conn, MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE, (char *)&as_unicode TSRMLS_CC);
|
||||
DBG_INF("unicode set");
|
||||
}
|
||||
#endif
|
||||
if (FAIL == conn->m->execute_init_commands(conn TSRMLS_CC)) {
|
||||
goto err;
|
||||
}
|
||||
|
@ -2283,11 +2272,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c
|
|||
case MYSQLND_OPT_NET_READ_BUFFER_SIZE:
|
||||
ret = conn->net->data->m.set_client_option(conn->net, option, value TSRMLS_CC);
|
||||
break;
|
||||
#if MYSQLND_UNICODE
|
||||
case MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE:
|
||||
conn->options->numeric_and_datetime_as_unicode = *(unsigned int*) value;
|
||||
break;
|
||||
#endif
|
||||
#ifdef MYSQLND_STRING_TO_INT_CONVERSION
|
||||
case MYSQLND_OPT_INT_AND_FLOAT_NATIVE:
|
||||
conn->options->int_and_float_native = *(unsigned int*) value;
|
||||
|
|
|
@ -88,11 +88,7 @@ mysqlnd_auth_handshake(MYSQLND_CONN_DATA * conn,
|
|||
if (options->charset_name && (charset = mysqlnd_find_charset_name(options->charset_name))) {
|
||||
auth_packet->charset_no = charset->nr;
|
||||
} else {
|
||||
#if MYSQLND_UNICODE
|
||||
auth_packet->charset_no = 200;/* utf8 - swedish collation, check mysqlnd_charset.c */
|
||||
#else
|
||||
auth_packet->charset_no = server_charset_no;
|
||||
#endif
|
||||
}
|
||||
|
||||
auth_packet->send_auth_data = TRUE;
|
||||
|
|
|
@ -25,252 +25,6 @@
|
|||
|
||||
/* Follows code borrowed from zend_builtin_functions.c because the functions there are static */
|
||||
|
||||
#if MYSQLND_UNICODE
|
||||
/* {{{ gettraceasstring() macros */
|
||||
#define TRACE_APPEND_CHR(chr) \
|
||||
*str = (char*)erealloc(*str, *len + 1 + 1); \
|
||||
(*str)[(*len)++] = chr
|
||||
|
||||
#define TRACE_APPEND_STRL(val, vallen) \
|
||||
{ \
|
||||
int l = vallen; \
|
||||
*str = (char*)erealloc(*str, *len + l + 1); \
|
||||
memcpy((*str) + *len, val, l); \
|
||||
*len += l; \
|
||||
}
|
||||
|
||||
#define TRACE_APPEND_USTRL(val, vallen) \
|
||||
{ \
|
||||
zval tmp, copy; \
|
||||
int use_copy; \
|
||||
ZVAL_UNICODEL(&tmp, val, vallen, 1); \
|
||||
zend_make_printable_zval(&tmp, ©, &use_copy); \
|
||||
TRACE_APPEND_STRL(Z_STRVAL(copy), Z_STRLEN(copy)); \
|
||||
zval_dtor(©); \
|
||||
zval_dtor(&tmp); \
|
||||
}
|
||||
|
||||
#define TRACE_APPEND_ZVAL(zv) \
|
||||
if (Z_TYPE_P((zv)) == IS_UNICODE) { \
|
||||
zval copy; \
|
||||
int use_copy; \
|
||||
zend_make_printable_zval((zv), ©, &use_copy); \
|
||||
TRACE_APPEND_STRL(Z_STRVAL(copy), Z_STRLEN(copy)); \
|
||||
zval_dtor(©); \
|
||||
} else { \
|
||||
TRACE_APPEND_STRL(Z_STRVAL_P((zv)), Z_STRLEN_P((zv))); \
|
||||
}
|
||||
|
||||
#define TRACE_APPEND_STR(val) \
|
||||
TRACE_APPEND_STRL(val, sizeof(val)-1)
|
||||
|
||||
#define TRACE_APPEND_KEY(key) \
|
||||
if (zend_ascii_hash_find(ht, key, sizeof(key), (void**)&tmp) == SUCCESS) { \
|
||||
if (Z_TYPE_PP(tmp) == IS_UNICODE) { \
|
||||
zval copy; \
|
||||
int use_copy; \
|
||||
zend_make_printable_zval(*tmp, ©, &use_copy); \
|
||||
TRACE_APPEND_STRL(Z_STRVAL(copy), Z_STRLEN(copy)); \
|
||||
zval_dtor(©); \
|
||||
} else { \
|
||||
TRACE_APPEND_STRL(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); \
|
||||
} \
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ mysqlnd_build_trace_args */
|
||||
static int mysqlnd_build_trace_args(zval **arg TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key)
|
||||
{
|
||||
char **str;
|
||||
int *len;
|
||||
|
||||
str = va_arg(args, char**);
|
||||
len = va_arg(args, int*);
|
||||
|
||||
/* the trivial way would be to do:
|
||||
* conver_to_string_ex(arg);
|
||||
* append it and kill the now tmp arg.
|
||||
* but that could cause some E_NOTICE and also damn long lines.
|
||||
*/
|
||||
|
||||
switch (Z_TYPE_PP(arg)) {
|
||||
case IS_NULL:
|
||||
TRACE_APPEND_STR("NULL, ");
|
||||
break;
|
||||
case IS_STRING: {
|
||||
int l_added;
|
||||
TRACE_APPEND_CHR('\'');
|
||||
if (Z_STRLEN_PP(arg) > 15) {
|
||||
TRACE_APPEND_STRL(Z_STRVAL_PP(arg), 15);
|
||||
TRACE_APPEND_STR("...', ");
|
||||
l_added = 15 + 6 + 1; /* +1 because of while (--l_added) */
|
||||
} else {
|
||||
l_added = Z_STRLEN_PP(arg);
|
||||
TRACE_APPEND_STRL(Z_STRVAL_PP(arg), l_added);
|
||||
TRACE_APPEND_STR("', ");
|
||||
l_added += 3 + 1;
|
||||
}
|
||||
while (--l_added) {
|
||||
if ((unsigned char)(*str)[*len - l_added] < 32) {
|
||||
(*str)[*len - l_added] = '?';
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case IS_UNICODE: {
|
||||
int l_added;
|
||||
|
||||
/*
|
||||
* We do not want to apply current error mode here, since
|
||||
* zend_make_printable_zval() uses output encoding converter.
|
||||
* Temporarily set output encoding converter to escape offending
|
||||
* chars with \uXXXX notation.
|
||||
*/
|
||||
zend_set_converter_error_mode(ZEND_U_CONVERTER(UG(output_encoding_conv)), ZEND_FROM_UNICODE, ZEND_CONV_ERROR_ESCAPE_JAVA);
|
||||
TRACE_APPEND_CHR('\'');
|
||||
if (Z_USTRLEN_PP(arg) > 15) {
|
||||
TRACE_APPEND_USTRL(Z_USTRVAL_PP(arg), 15);
|
||||
TRACE_APPEND_STR("...', ");
|
||||
l_added = 15 + 6 + 1; /* +1 because of while (--l_added) */
|
||||
} else {
|
||||
l_added = Z_USTRLEN_PP(arg);
|
||||
TRACE_APPEND_USTRL(Z_USTRVAL_PP(arg), l_added);
|
||||
TRACE_APPEND_STR("', ");
|
||||
l_added += 3 + 1;
|
||||
}
|
||||
/*
|
||||
* Reset output encoding converter error mode.
|
||||
*/
|
||||
zend_set_converter_error_mode(ZEND_U_CONVERTER(UG(output_encoding_conv)), ZEND_FROM_UNICODE, UG(from_error_mode));
|
||||
while (--l_added) {
|
||||
if ((unsigned char)(*str)[*len - l_added] < 32) {
|
||||
(*str)[*len - l_added] = '?';
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case IS_BOOL:
|
||||
if (Z_LVAL_PP(arg)) {
|
||||
TRACE_APPEND_STR("true, ");
|
||||
} else {
|
||||
TRACE_APPEND_STR("false, ");
|
||||
}
|
||||
break;
|
||||
case IS_RESOURCE:
|
||||
TRACE_APPEND_STR("Resource id #");
|
||||
/* break; */
|
||||
case IS_LONG: {
|
||||
long lval = Z_LVAL_PP(arg);
|
||||
char s_tmp[MAX_LENGTH_OF_LONG + 1];
|
||||
int l_tmp = zend_sprintf(s_tmp, "%ld", lval); /* SAFE */
|
||||
TRACE_APPEND_STRL(s_tmp, l_tmp);
|
||||
TRACE_APPEND_STR(", ");
|
||||
break;
|
||||
}
|
||||
case IS_DOUBLE: {
|
||||
double dval = Z_DVAL_PP(arg);
|
||||
char *s_tmp;
|
||||
int l_tmp;
|
||||
|
||||
s_tmp = emalloc(MAX_LENGTH_OF_DOUBLE + EG(precision) + 1);
|
||||
l_tmp = zend_sprintf(s_tmp, "%.*G", (int) EG(precision), dval); /* SAFE */
|
||||
TRACE_APPEND_STRL(s_tmp, l_tmp);
|
||||
/* %G already handles removing trailing zeros from the fractional part, yay */
|
||||
efree(s_tmp);
|
||||
TRACE_APPEND_STR(", ");
|
||||
break;
|
||||
}
|
||||
case IS_ARRAY:
|
||||
TRACE_APPEND_STR("Array, ");
|
||||
break;
|
||||
case IS_OBJECT: {
|
||||
zval tmp;
|
||||
zstr class_name;
|
||||
zend_uint class_name_len;
|
||||
int dup;
|
||||
|
||||
TRACE_APPEND_STR("Object(");
|
||||
|
||||
dup = zend_get_object_classname(*arg, &class_name, &class_name_len TSRMLS_CC);
|
||||
|
||||
ZVAL_UNICODEL(&tmp, class_name.u, class_name_len, 1);
|
||||
convert_to_string_with_converter(&tmp, ZEND_U_CONVERTER(UG(output_encoding_conv)));
|
||||
TRACE_APPEND_STRL(Z_STRVAL(tmp), Z_STRLEN(tmp));
|
||||
zval_dtor(&tmp);
|
||||
|
||||
if(!dup) {
|
||||
efree(class_name.v);
|
||||
}
|
||||
|
||||
TRACE_APPEND_STR("), ");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ZEND_HASH_APPLY_KEEP;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */
|
||||
{
|
||||
char *s_tmp, **str;
|
||||
int *len, *num;
|
||||
long line;
|
||||
HashTable *ht = Z_ARRVAL_PP(frame);
|
||||
zval **file, **tmp;
|
||||
uint * level;
|
||||
|
||||
level = va_arg(args, uint *);
|
||||
str = va_arg(args, char**);
|
||||
len = va_arg(args, int*);
|
||||
num = va_arg(args, int*);
|
||||
|
||||
if (!*level) {
|
||||
return ZEND_HASH_APPLY_KEEP;
|
||||
}
|
||||
--*level;
|
||||
|
||||
s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 1 + 1);
|
||||
sprintf(s_tmp, "#%d ", (*num)++);
|
||||
TRACE_APPEND_STRL(s_tmp, strlen(s_tmp));
|
||||
efree(s_tmp);
|
||||
if (zend_ascii_hash_find(ht, "file", sizeof("file"), (void**)&file) == SUCCESS) {
|
||||
if (zend_ascii_hash_find(ht, "line", sizeof("line"), (void**)&tmp) == SUCCESS) {
|
||||
line = Z_LVAL_PP(tmp);
|
||||
} else {
|
||||
line = 0;
|
||||
}
|
||||
TRACE_APPEND_ZVAL(*file);
|
||||
s_tmp = emalloc(MAX_LENGTH_OF_LONG + 2 + 1);
|
||||
sprintf(s_tmp, "(%ld): ", line);
|
||||
TRACE_APPEND_STRL(s_tmp, strlen(s_tmp));
|
||||
efree(s_tmp);
|
||||
} else {
|
||||
TRACE_APPEND_STR("[internal function]: ");
|
||||
}
|
||||
TRACE_APPEND_KEY("class");
|
||||
TRACE_APPEND_KEY("type");
|
||||
TRACE_APPEND_KEY("function");
|
||||
TRACE_APPEND_CHR('(');
|
||||
if (zend_ascii_hash_find(ht, "args", sizeof("args"), (void**)&tmp) == SUCCESS) {
|
||||
int last_len = *len;
|
||||
zend_hash_apply_with_arguments(Z_ARRVAL_PP(tmp) TSRMLS_CC, (apply_func_args_t)mysqlnd_build_trace_args, 2, str, len);
|
||||
if (last_len != *len) {
|
||||
*len -= 2; /* remove last ', ' */
|
||||
}
|
||||
}
|
||||
TRACE_APPEND_STR(")\n");
|
||||
return ZEND_HASH_APPLY_KEEP;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
#else /* PHP 5*/
|
||||
|
||||
|
||||
/* {{{ gettraceasstring() macros */
|
||||
#define TRACE_APPEND_CHR(chr) \
|
||||
*str = (char*)erealloc(*str, *len + 1 + 1); \
|
||||
|
@ -295,7 +49,8 @@ static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_l
|
|||
/* }}} */
|
||||
|
||||
|
||||
static int mysqlnd_build_trace_args(zval **arg TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */
|
||||
static int
|
||||
mysqlnd_build_trace_args(zval **arg TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */
|
||||
{
|
||||
char **str;
|
||||
int *len;
|
||||
|
@ -391,7 +146,8 @@ static int mysqlnd_build_trace_args(zval **arg TSRMLS_DC, int num_args, va_list
|
|||
}
|
||||
/* }}} */
|
||||
|
||||
static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */
|
||||
static int
|
||||
mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */
|
||||
{
|
||||
char *s_tmp, **str;
|
||||
int *len, *num;
|
||||
|
@ -442,10 +198,10 @@ static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_l
|
|||
return ZEND_HASH_APPLY_KEEP;
|
||||
}
|
||||
/* }}} */
|
||||
#endif
|
||||
|
||||
|
||||
PHPAPI char * mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC)
|
||||
PHPAPI char *
|
||||
mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC)
|
||||
{
|
||||
zval *trace;
|
||||
char *res = estrdup(""), **str = &res, *s_tmp;
|
||||
|
|
|
@ -167,9 +167,7 @@ typedef enum mysqlnd_option
|
|||
MYSQL_PLUGIN_DIR,
|
||||
MYSQL_DEFAULT_AUTH,
|
||||
MYSQL_SERVER_PUBLIC_KEY,
|
||||
#if MYSQLND_UNICODE
|
||||
MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE = 200,
|
||||
#endif
|
||||
MYSQLND_DEPRECATED_ENUM1 = 200,
|
||||
#ifdef MYSQLND_STRING_TO_INT_CONVERSION
|
||||
MYSQLND_OPT_INT_AND_FLOAT_NATIVE = 201,
|
||||
#endif
|
||||
|
|
|
@ -33,12 +33,6 @@
|
|||
#define Z_DELREF_PP(ppz) Z_DELREF_P(*(ppz))
|
||||
#endif
|
||||
|
||||
#if PHP_MAJOR_VERSION >= 6
|
||||
#define MYSQLND_UNICODE 1
|
||||
#else
|
||||
#define MYSQLND_UNICODE 0
|
||||
#endif
|
||||
|
||||
#ifdef ZTS
|
||||
#include "TSRM.h"
|
||||
#endif
|
||||
|
@ -47,21 +41,12 @@
|
|||
#define pestrndup(s, length, persistent) ((persistent)?zend_strndup((s),(length)):estrndup((s),(length)))
|
||||
#endif
|
||||
|
||||
#if MYSQLND_UNICODE
|
||||
#define mysqlnd_array_init(arg, field_count) \
|
||||
{ \
|
||||
ALLOC_HASHTABLE_REL(Z_ARRVAL_P(arg));\
|
||||
zend_u_hash_init(Z_ARRVAL_P(arg), (field_count), NULL, ZVAL_PTR_DTOR, 0, 0);\
|
||||
Z_TYPE_P(arg) = IS_ARRAY;\
|
||||
}
|
||||
#else
|
||||
#define mysqlnd_array_init(arg, field_count) \
|
||||
{ \
|
||||
ALLOC_HASHTABLE_REL(Z_ARRVAL_P(arg));\
|
||||
zend_hash_init(Z_ARRVAL_P(arg), (field_count), NULL, ZVAL_PTR_DTOR, 0); \
|
||||
Z_TYPE_P(arg) = IS_ARRAY;\
|
||||
}
|
||||
#endif
|
||||
|
||||
#define MYSQLND_STR_W_LEN(str) str, (sizeof(str) - 1)
|
||||
|
||||
|
@ -174,9 +159,7 @@
|
|||
#define CONN_SET_STATE(c, s) (c)->m->set_state((c), (s) TSRMLS_CC)
|
||||
|
||||
/* PS stuff */
|
||||
typedef void (*ps_field_fetch_func)(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool everything_as_unicode TSRMLS_DC);
|
||||
typedef void (*ps_field_fetch_func)(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC);
|
||||
struct st_mysqlnd_perm_bind {
|
||||
ps_field_fetch_func func;
|
||||
/* should be signed int */
|
||||
|
@ -200,16 +183,14 @@ PHPAPI extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_res);
|
|||
PHPAPI extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_protocol);
|
||||
PHPAPI extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_net);
|
||||
|
||||
enum_func_status mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char *filename, zend_bool *is_warning TSRMLS_DC);
|
||||
enum_func_status mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char * filename, zend_bool * is_warning TSRMLS_DC);
|
||||
|
||||
|
||||
|
||||
void _mysqlnd_init_ps_subsystem();/* This one is private, mysqlnd_library_init() will call it */
|
||||
void _mysqlnd_init_ps_fetch_subsystem();
|
||||
|
||||
void ps_fetch_from_1_to_8_bytes(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row, zend_bool as_unicode,
|
||||
unsigned int byte_count TSRMLS_DC);
|
||||
void ps_fetch_from_1_to_8_bytes(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row, unsigned int byte_count TSRMLS_DC);
|
||||
|
||||
void mysqlnd_plugin_subsystem_init(TSRMLS_D);
|
||||
void mysqlnd_plugin_subsystem_end(TSRMLS_D);
|
||||
|
|
|
@ -734,7 +734,6 @@ mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES *result, void *param, unsigned int f
|
|||
current_row,
|
||||
meta->field_count,
|
||||
meta->fields,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC);
|
||||
if (PASS != rc) {
|
||||
|
@ -853,7 +852,6 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int
|
|||
result->unbuf->last_row_data,
|
||||
row_packet->field_count,
|
||||
row_packet->fields_metadata,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC))
|
||||
{
|
||||
|
@ -871,14 +869,7 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int
|
|||
zval_dtor(stmt->result_bind[i].zv);
|
||||
#endif
|
||||
if (IS_NULL != (Z_TYPE_P(stmt->result_bind[i].zv) = Z_TYPE_P(data)) ) {
|
||||
if (
|
||||
(Z_TYPE_P(data) == IS_STRING
|
||||
#if MYSQLND_UNICODE
|
||||
|| Z_TYPE_P(data) == IS_UNICODE
|
||||
#endif
|
||||
)
|
||||
&& (result->meta->fields[i].max_length < (unsigned long) Z_STRLEN_P(data)))
|
||||
{
|
||||
if ((Z_TYPE_P(data) == IS_STRING) && (result->meta->fields[i].max_length < (unsigned long) Z_STRLEN_P(data))) {
|
||||
result->meta->fields[i].max_length = Z_STRLEN_P(data);
|
||||
}
|
||||
stmt->result_bind[i].zv->value = data->value;
|
||||
|
@ -1037,7 +1028,6 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla
|
|||
result->unbuf->last_row_data,
|
||||
row_packet->field_count,
|
||||
row_packet->fields_metadata,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC))
|
||||
{
|
||||
|
@ -1058,13 +1048,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla
|
|||
DBG_INF_FMT("i=%u bound_var=%p type=%u refc=%u", i, stmt->result_bind[i].zv,
|
||||
Z_TYPE_P(data), Z_REFCOUNT_P(stmt->result_bind[i].zv));
|
||||
if (IS_NULL != (Z_TYPE_P(stmt->result_bind[i].zv) = Z_TYPE_P(data))) {
|
||||
if ((Z_TYPE_P(data) == IS_STRING
|
||||
#if MYSQLND_UNICODE
|
||||
|| Z_TYPE_P(data) == IS_UNICODE
|
||||
#endif
|
||||
)
|
||||
&& (result->meta->fields[i].max_length < (unsigned long) Z_STRLEN_P(data)))
|
||||
{
|
||||
if ((Z_TYPE_P(data) == IS_STRING) && (result->meta->fields[i].max_length < (unsigned long) Z_STRLEN_P(data))) {
|
||||
result->meta->fields[i].max_length = Z_STRLEN_P(data);
|
||||
}
|
||||
stmt->result_bind[i].zv->value = data->value;
|
||||
|
|
|
@ -53,9 +53,9 @@ struct st_mysqlnd_perm_bind mysqlnd_ps_fetch_functions[MYSQL_TYPE_LAST + 1];
|
|||
#define MYSQLND_PS_SKIP_RESULT_STR -2
|
||||
|
||||
/* {{{ ps_fetch_from_1_to_8_bytes */
|
||||
void ps_fetch_from_1_to_8_bytes(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row, zend_bool as_unicode,
|
||||
unsigned int byte_count TSRMLS_DC)
|
||||
void
|
||||
ps_fetch_from_1_to_8_bytes(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len,
|
||||
zend_uchar ** row, unsigned int byte_count TSRMLS_DC)
|
||||
{
|
||||
char tmp[22];
|
||||
size_t tmp_len = 0;
|
||||
|
@ -117,16 +117,7 @@ void ps_fetch_from_1_to_8_bytes(zval *zv, const MYSQLND_FIELD * const field,
|
|||
}
|
||||
|
||||
if (tmp_len) {
|
||||
#if MYSQLND_UNICODE
|
||||
if (as_unicode) {
|
||||
DBG_INF("stringify");
|
||||
ZVAL_UTF8_STRINGL(zv, tmp, tmp_len, ZSTR_DUPLICATE);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
DBG_INF("stringify");
|
||||
ZVAL_STRINGL(zv, tmp, tmp_len, 1);
|
||||
}
|
||||
ZVAL_STRINGL(zv, tmp, tmp_len, 1);
|
||||
}
|
||||
(*row)+= byte_count;
|
||||
DBG_VOID_RETURN;
|
||||
|
@ -135,10 +126,8 @@ void ps_fetch_from_1_to_8_bytes(zval *zv, const MYSQLND_FIELD * const field,
|
|||
|
||||
|
||||
/* {{{ ps_fetch_null */
|
||||
static
|
||||
void ps_fetch_null(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_null(zval *zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
ZVAL_NULL(zv);
|
||||
}
|
||||
|
@ -146,54 +135,44 @@ void ps_fetch_null(zval *zv, const MYSQLND_FIELD * const field,
|
|||
|
||||
|
||||
/* {{{ ps_fetch_int8 */
|
||||
static
|
||||
void ps_fetch_int8(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_int8(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
ps_fetch_from_1_to_8_bytes(zv, field, pack_len, row, as_unicode, 1 TSRMLS_CC);
|
||||
ps_fetch_from_1_to_8_bytes(zv, field, pack_len, row, 1 TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ ps_fetch_int16 */
|
||||
static
|
||||
void ps_fetch_int16(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_int16(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
ps_fetch_from_1_to_8_bytes(zv, field, pack_len, row, as_unicode, 2 TSRMLS_CC);
|
||||
ps_fetch_from_1_to_8_bytes(zv, field, pack_len, row, 2 TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ ps_fetch_int32 */
|
||||
static
|
||||
void ps_fetch_int32(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_int32(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
ps_fetch_from_1_to_8_bytes(zv, field, pack_len, row, as_unicode, 4 TSRMLS_CC);
|
||||
ps_fetch_from_1_to_8_bytes(zv, field, pack_len, row, 4 TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ ps_fetch_int64 */
|
||||
static
|
||||
void ps_fetch_int64(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_int64(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
ps_fetch_from_1_to_8_bytes(zv, field, pack_len, row, as_unicode, 8 TSRMLS_CC);
|
||||
ps_fetch_from_1_to_8_bytes(zv, field, pack_len, row, 8 TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ ps_fetch_float */
|
||||
static
|
||||
void ps_fetch_float(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_float(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
float value;
|
||||
DBG_ENTER("ps_fetch_float");
|
||||
|
@ -207,10 +186,8 @@ void ps_fetch_float(zval *zv, const MYSQLND_FIELD * const field,
|
|||
|
||||
|
||||
/* {{{ ps_fetch_double */
|
||||
static
|
||||
void ps_fetch_double(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_double(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
double value;
|
||||
DBG_ENTER("ps_fetch_double");
|
||||
|
@ -224,18 +201,16 @@ void ps_fetch_double(zval *zv, const MYSQLND_FIELD * const field,
|
|||
|
||||
|
||||
/* {{{ ps_fetch_time */
|
||||
static
|
||||
void ps_fetch_time(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_time(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
struct st_mysqlnd_time t;
|
||||
unsigned int length; /* First byte encodes the length*/
|
||||
unsigned long length; /* First byte encodes the length*/
|
||||
char * value;
|
||||
DBG_ENTER("ps_fetch_time");
|
||||
|
||||
if ((length = php_mysqlnd_net_field_length(row))) {
|
||||
zend_uchar *to= *row;
|
||||
zend_uchar * to= *row;
|
||||
|
||||
t.time_type = MYSQLND_TIMESTAMP_TIME;
|
||||
t.neg = (zend_bool) to[0];
|
||||
|
@ -261,29 +236,19 @@ void ps_fetch_time(zval *zv, const MYSQLND_FIELD * const field,
|
|||
length = mnd_sprintf(&value, 0, "%s%02u:%02u:%02u", (t.neg ? "-" : ""), t.hour, t.minute, t.second);
|
||||
|
||||
DBG_INF_FMT("%s", value);
|
||||
#if MYSQLND_UNICODE
|
||||
if (!as_unicode) {
|
||||
#endif
|
||||
ZVAL_STRINGL(zv, value, length, 1);
|
||||
mnd_sprintf_free(value);
|
||||
#if MYSQLND_UNICODE
|
||||
} else {
|
||||
ZVAL_UTF8_STRINGL(zv, value, length, ZSTR_AUTOFREE);
|
||||
}
|
||||
#endif
|
||||
ZVAL_STRINGL(zv, value, length, 1);
|
||||
mnd_sprintf_free(value);
|
||||
DBG_VOID_RETURN;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ ps_fetch_date */
|
||||
static
|
||||
void ps_fetch_date(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_date(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
struct st_mysqlnd_time t = {0};
|
||||
unsigned int length; /* First byte encodes the length*/
|
||||
unsigned long length; /* First byte encodes the length*/
|
||||
char * value;
|
||||
DBG_ENTER("ps_fetch_date");
|
||||
|
||||
|
@ -308,34 +273,24 @@ void ps_fetch_date(zval *zv, const MYSQLND_FIELD * const field,
|
|||
length = mnd_sprintf(&value, 0, "%04u-%02u-%02u", t.year, t.month, t.day);
|
||||
|
||||
DBG_INF_FMT("%s", value);
|
||||
#if MYSQLND_UNICODE
|
||||
if (!as_unicode) {
|
||||
#endif
|
||||
ZVAL_STRINGL(zv, value, length, 1);
|
||||
mnd_sprintf_free(value);
|
||||
#if MYSQLND_UNICODE
|
||||
} else {
|
||||
ZVAL_UTF8_STRINGL(zv, value, length, ZSTR_AUTOFREE);
|
||||
}
|
||||
#endif
|
||||
ZVAL_STRINGL(zv, value, length, 1);
|
||||
mnd_sprintf_free(value);
|
||||
DBG_VOID_RETURN;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ ps_fetch_datetime */
|
||||
static
|
||||
void ps_fetch_datetime(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_datetime(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
struct st_mysqlnd_time t;
|
||||
unsigned int length; /* First byte encodes the length*/
|
||||
unsigned long length; /* First byte encodes the length*/
|
||||
char * value;
|
||||
DBG_ENTER("ps_fetch_datetime");
|
||||
|
||||
if ((length = php_mysqlnd_net_field_length(row))) {
|
||||
zend_uchar *to= *row;
|
||||
zend_uchar * to = *row;
|
||||
|
||||
t.time_type = MYSQLND_TIMESTAMP_DATETIME;
|
||||
t.neg = 0;
|
||||
|
@ -362,46 +317,26 @@ void ps_fetch_datetime(zval *zv, const MYSQLND_FIELD * const field,
|
|||
length = mnd_sprintf(&value, 0, "%04u-%02u-%02u %02u:%02u:%02u", t.year, t.month, t.day, t.hour, t.minute, t.second);
|
||||
|
||||
DBG_INF_FMT("%s", value);
|
||||
#if MYSQLND_UNICODE
|
||||
if (!as_unicode) {
|
||||
#endif
|
||||
ZVAL_STRINGL(zv, value, length, 1);
|
||||
mnd_sprintf_free(value);
|
||||
#if MYSQLND_UNICODE
|
||||
} else {
|
||||
ZVAL_UTF8_STRINGL(zv, to, length, ZSTR_AUTOFREE);
|
||||
}
|
||||
#endif
|
||||
ZVAL_STRINGL(zv, value, length, 1);
|
||||
mnd_sprintf_free(value);
|
||||
DBG_VOID_RETURN;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ ps_fetch_string */
|
||||
static
|
||||
void ps_fetch_string(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_string(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
/*
|
||||
For now just copy, before we make it possible
|
||||
to write \0 to the row buffer
|
||||
*/
|
||||
unsigned long length = php_mysqlnd_net_field_length(row);
|
||||
const unsigned long length = php_mysqlnd_net_field_length(row);
|
||||
DBG_ENTER("ps_fetch_string");
|
||||
DBG_INF_FMT("len = %lu", length);
|
||||
#if MYSQLND_UNICODE
|
||||
if (field->charsetnr == MYSQLND_BINARY_CHARSET_NR) {
|
||||
DBG_INF("Binary charset");
|
||||
ZVAL_STRINGL(zv, (char *)*row, length, 1);
|
||||
} else {
|
||||
DBG_INF_FMT("copying from the row buffer");
|
||||
ZVAL_UTF8_STRINGL(zv, (char*)*row, length, ZSTR_DUPLICATE);
|
||||
}
|
||||
#else
|
||||
DBG_INF("copying from the row buffer");
|
||||
ZVAL_STRINGL(zv, (char *)*row, length, 1);
|
||||
#endif
|
||||
|
||||
(*row) += length;
|
||||
DBG_VOID_RETURN;
|
||||
|
@ -410,13 +345,11 @@ void ps_fetch_string(zval *zv, const MYSQLND_FIELD * const field,
|
|||
|
||||
|
||||
/* {{{ ps_fetch_bit */
|
||||
static
|
||||
void ps_fetch_bit(zval *zv, const MYSQLND_FIELD * const field,
|
||||
unsigned int pack_len, zend_uchar **row,
|
||||
zend_bool as_unicode TSRMLS_DC)
|
||||
static void
|
||||
ps_fetch_bit(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_len, zend_uchar ** row TSRMLS_DC)
|
||||
{
|
||||
unsigned long length= php_mysqlnd_net_field_length(row);
|
||||
ps_fetch_from_1_to_8_bytes(zv, field, pack_len, row, as_unicode, length TSRMLS_CC);
|
||||
unsigned long length = php_mysqlnd_net_field_length(row);
|
||||
ps_fetch_from_1_to_8_bytes(zv, field, pack_len, row, length TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -566,7 +499,7 @@ void _mysqlnd_init_ps_fetch_subsystem()
|
|||
|
||||
/* {{{ mysqlnd_stmt_copy_it */
|
||||
static enum_func_status
|
||||
mysqlnd_stmt_copy_it(zval *** copies, zval *original, unsigned int param_count, unsigned int current TSRMLS_DC)
|
||||
mysqlnd_stmt_copy_it(zval *** copies, zval * original, unsigned int param_count, unsigned int current TSRMLS_DC)
|
||||
{
|
||||
if (!*copies) {
|
||||
*copies = mnd_ecalloc(param_count, sizeof(zval *));
|
||||
|
@ -786,12 +719,7 @@ mysqlnd_stmt_execute_store_params(MYSQLND_STMT * s, zend_uchar **buf, zend_uchar
|
|||
case MYSQL_TYPE_VAR_STRING:
|
||||
use_string:
|
||||
data_size += 8; /* max 8 bytes for size */
|
||||
#if MYSQLND_UNICODE
|
||||
if (Z_TYPE_P(the_var) != IS_STRING || Z_TYPE_P(the_var) == IS_UNICODE)
|
||||
#else
|
||||
if (Z_TYPE_P(the_var) != IS_STRING)
|
||||
#endif
|
||||
{
|
||||
if (Z_TYPE_P(the_var) != IS_STRING) {
|
||||
if (!copies || !copies[i]) {
|
||||
if (PASS != mysqlnd_stmt_copy_it(&copies, the_var, stmt->param_count, i TSRMLS_CC)) {
|
||||
SET_OOM_ERROR(*stmt->error_info);
|
||||
|
@ -799,11 +727,6 @@ use_string:
|
|||
}
|
||||
}
|
||||
the_var = copies[i];
|
||||
#if MYSQLND_UNICODE
|
||||
if (Z_TYPE_P(the_var) == IS_UNICODE) {
|
||||
zval_unicode_to_string_ex(the_var, UG(utf8_conv) TSRMLS_CC);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
convert_to_string_ex(&the_var);
|
||||
data_size += Z_STRLEN_P(the_var);
|
||||
|
|
|
@ -55,7 +55,6 @@ MYSQLND_METHOD(mysqlnd_res, initialize_result_set_rest)(MYSQLND_RES * const resu
|
|||
data_cursor,
|
||||
result->meta->field_count,
|
||||
result->meta->fields,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC);
|
||||
if (rc != PASS) {
|
||||
|
@ -106,16 +105,6 @@ mysqlnd_rset_zval_ptr_dtor(zval **zv, enum_mysqlnd_res_type type, zend_bool * co
|
|||
/*
|
||||
Not a prepared statement, then we have to
|
||||
call copy_ctor and then zval_ptr_dtor()
|
||||
|
||||
In Unicode mode the destruction of the zvals should not call
|
||||
zval_copy_ctor() because then we will leak.
|
||||
I suppose we can use UG(unicode) in mysqlnd.c when freeing a result set
|
||||
to check if we need to call copy_ctor().
|
||||
|
||||
If the type is IS_UNICODE, which can happen with PHP6, then we don't
|
||||
need to copy_ctor, as the data doesn't point to our internal buffers.
|
||||
If it's string (in PHP5 always) and in PHP6 if data is binary, then
|
||||
it still points to internal buffers and has to be copied.
|
||||
*/
|
||||
if (Z_TYPE_PP(zv) == IS_STRING) {
|
||||
zval_copy_ctor(*zv);
|
||||
|
@ -669,7 +658,6 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TSRMLS_DC)
|
|||
result->unbuf->last_row_data,
|
||||
row_packet->field_count,
|
||||
row_packet->fields_metadata,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC);
|
||||
if (PASS != rc) {
|
||||
|
@ -784,7 +772,6 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, void *param, unsigned int fla
|
|||
result->unbuf->last_row_data,
|
||||
field_count,
|
||||
row_packet->fields_metadata,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC);
|
||||
if (PASS != rc) {
|
||||
|
@ -812,19 +799,11 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, void *param, unsigned int fla
|
|||
*/
|
||||
Z_ADDREF_P(data);
|
||||
if (hash_key->is_numeric == FALSE) {
|
||||
#if MYSQLND_UNICODE
|
||||
zend_u_hash_quick_update(Z_ARRVAL_P(row), IS_UNICODE,
|
||||
hash_key->ustr,
|
||||
hash_key->ulen + 1,
|
||||
hash_key->key,
|
||||
(void *) &data, sizeof(zval *), NULL);
|
||||
#else
|
||||
zend_hash_quick_update(Z_ARRVAL_P(row),
|
||||
field->name,
|
||||
field->name_length + 1,
|
||||
hash_key->key,
|
||||
(void *) &data, sizeof(zval *), NULL);
|
||||
#endif
|
||||
} else {
|
||||
zend_hash_index_update(Z_ARRVAL_P(row),
|
||||
hash_key->key,
|
||||
|
@ -950,7 +929,6 @@ mysqlnd_fetch_row_buffered_c(MYSQLND_RES * result TSRMLS_DC)
|
|||
current_row,
|
||||
result->meta->field_count,
|
||||
result->meta->fields,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC);
|
||||
if (rc != PASS) {
|
||||
|
@ -1023,7 +1001,6 @@ mysqlnd_fetch_row_buffered(MYSQLND_RES * result, void *param, unsigned int flags
|
|||
current_row,
|
||||
result->meta->field_count,
|
||||
result->meta->fields,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC);
|
||||
if (rc != PASS) {
|
||||
|
@ -1062,19 +1039,11 @@ mysqlnd_fetch_row_buffered(MYSQLND_RES * result, void *param, unsigned int flags
|
|||
*/
|
||||
Z_ADDREF_P(data);
|
||||
if (hash_key->is_numeric == FALSE) {
|
||||
#if MYSQLND_UNICODE
|
||||
zend_u_hash_quick_update(Z_ARRVAL_P(row), IS_UNICODE,
|
||||
hash_key->ustr,
|
||||
hash_key->ulen + 1,
|
||||
hash_key->key,
|
||||
(void *) &data, sizeof(zval *), NULL);
|
||||
#else
|
||||
zend_hash_quick_update(Z_ARRVAL_P(row),
|
||||
field->name,
|
||||
field->name_length + 1,
|
||||
hash_key->key,
|
||||
(void *) &data, sizeof(zval *), NULL);
|
||||
#endif
|
||||
} else {
|
||||
zend_hash_index_update(Z_ARRVAL_P(row),
|
||||
hash_key->key,
|
||||
|
|
|
@ -92,60 +92,12 @@ mysqlnd_is_key_numeric(const char * key, size_t length, long *idx)
|
|||
/* }}} */
|
||||
|
||||
|
||||
#if MYSQLND_UNICODE
|
||||
/* {{{ mysqlnd_unicode_is_key_numeric */
|
||||
static zend_bool
|
||||
mysqlnd_unicode_is_key_numeric(UChar *key, size_t length, long *idx)
|
||||
{
|
||||
register UChar * tmp=key;
|
||||
|
||||
if (*tmp==0x2D /*'-'*/) {
|
||||
tmp++;
|
||||
}
|
||||
if ((*tmp>=0x30 /*'0'*/ && *tmp<=0x39 /*'9'*/)) { /* possibly a numeric index */
|
||||
do {
|
||||
UChar *end=key+length-1;
|
||||
|
||||
if (*tmp++==0x30 && length>2) { /* don't accept numbers with leading zeros */
|
||||
break;
|
||||
}
|
||||
while (tmp<end) {
|
||||
if (!(*tmp>=0x30 /*'0'*/ && *tmp<=0x39 /*'9'*/)) {
|
||||
break;
|
||||
}
|
||||
tmp++;
|
||||
}
|
||||
if (tmp==end && *tmp==0) { /* a numeric index */
|
||||
if (*key==0x2D /*'-'*/) {
|
||||
*idx = zend_u_strtol(key, NULL, 10);
|
||||
if (*idx!=LONG_MIN) {
|
||||
return TRUE;
|
||||
}
|
||||
} else {
|
||||
*idx = zend_u_strtol(key, NULL, 10);
|
||||
if (*idx!=LONG_MAX) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while (0);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
/* }}} */
|
||||
#endif
|
||||
|
||||
|
||||
/* {{{ mysqlnd_res_meta::read_metadata */
|
||||
static enum_func_status
|
||||
MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const meta, MYSQLND_CONN_DATA * conn TSRMLS_DC)
|
||||
{
|
||||
unsigned int i = 0;
|
||||
MYSQLND_PACKET_RES_FIELD * field_packet;
|
||||
#if MYSQLND_UNICODE
|
||||
UChar *ustr;
|
||||
int ulen;
|
||||
#endif
|
||||
|
||||
DBG_ENTER("mysqlnd_res_meta::read_metadata");
|
||||
|
||||
|
@ -226,21 +178,6 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met
|
|||
}
|
||||
}
|
||||
|
||||
#if MYSQLND_UNICODE
|
||||
zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen,
|
||||
meta->fields[i].name,
|
||||
meta->fields[i].name_length TSRMLS_CC);
|
||||
if ((meta->zend_hash_keys[i].is_numeric =
|
||||
mysqlnd_unicode_is_key_numeric(ustr, ulen + 1, &idx)))
|
||||
{
|
||||
meta->zend_hash_keys[i].key = idx;
|
||||
mnd_efree(ustr);
|
||||
} else {
|
||||
meta->zend_hash_keys[i].ustr.u = ustr;
|
||||
meta->zend_hash_keys[i].ulen = ulen;
|
||||
meta->zend_hash_keys[i].key = zend_u_get_hash_value(IS_UNICODE, ZSTR(ustr), ulen + 1);
|
||||
}
|
||||
#else
|
||||
/* For BC we have to check whether the key is numeric and use it like this */
|
||||
if ((meta->zend_hash_keys[i].is_numeric =
|
||||
mysqlnd_is_key_numeric(field_packet->metadata->name,
|
||||
|
@ -253,7 +190,6 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met
|
|||
zend_get_hash_value(field_packet->metadata->name,
|
||||
field_packet->metadata->name_length + 1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
PACKET_FREE(field_packet);
|
||||
|
||||
|
@ -283,15 +219,6 @@ MYSQLND_METHOD(mysqlnd_res_meta, free)(MYSQLND_RES_METADATA * meta TSRMLS_DC)
|
|||
|
||||
if (meta->zend_hash_keys) {
|
||||
DBG_INF("Freeing zend_hash_keys");
|
||||
#if MYSQLND_UNICODE
|
||||
if (UG(unicode)) {
|
||||
for (i = 0; i < meta->field_count; i++) {
|
||||
if (meta->zend_hash_keys[i].ustr.v) {
|
||||
mnd_pefree(meta->zend_hash_keys[i].ustr.v, meta->persistent);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
mnd_pefree(meta->zend_hash_keys, meta->persistent);
|
||||
meta->zend_hash_keys = NULL;
|
||||
}
|
||||
|
@ -379,15 +306,6 @@ MYSQLND_METHOD(mysqlnd_res_meta, clone_metadata)(const MYSQLND_RES_METADATA * co
|
|||
/* copy the trailing \0 too */
|
||||
memcpy(new_fields[i].def, orig_fields[i].def, orig_fields[i].def_length + 1);
|
||||
}
|
||||
#if MYSQLND_UNICODE
|
||||
if (new_meta->zend_hash_keys[i].ustr.u) {
|
||||
new_meta->zend_hash_keys[i].ustr.u =
|
||||
eustrndup(new_meta->zend_hash_keys[i].ustr.u, new_meta->zend_hash_keys[i].ulen);
|
||||
if (!new_meta->zend_hash_keys[i].ustr.u) {
|
||||
goto oom;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
new_meta->current_field = 0;
|
||||
new_meta->field_count = meta->field_count;
|
||||
|
|
|
@ -203,22 +203,10 @@ mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, const MYSQLND_STRING
|
|||
|
||||
mysqlnd_array_init(return_value, stats->count);
|
||||
for (i = 0; i < stats->count; i++) {
|
||||
#if MYSQLND_UNICODE
|
||||
UChar *ustr, *tstr;
|
||||
int ulen, tlen;
|
||||
#endif
|
||||
char tmp[25];
|
||||
|
||||
sprintf((char *)&tmp, MYSQLND_LLU_SPEC, stats->values[i]);
|
||||
#if MYSQLND_UNICODE
|
||||
zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, names[i].s, names[i].l + 1 TSRMLS_CC);
|
||||
zend_string_to_unicode(UG(utf8_conv), &tstr, &tlen, tmp, strlen(tmp) + 1 TSRMLS_CC);
|
||||
add_u_assoc_unicode_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen, tstr, 1);
|
||||
efree(ustr);
|
||||
efree(tstr);
|
||||
#else
|
||||
add_assoc_string_ex(return_value, names[i].s, names[i].l + 1, tmp, 1);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
|
|
@ -183,7 +183,6 @@ typedef struct st_mysqlnd_options
|
|||
/* maximum allowed packet size for communication */
|
||||
ulong max_allowed_packet;
|
||||
|
||||
zend_bool numeric_and_datetime_as_unicode;
|
||||
#ifdef MYSQLND_STRING_TO_INT_CONVERSION
|
||||
zend_bool int_and_float_native;
|
||||
#endif
|
||||
|
@ -625,9 +624,8 @@ typedef void (*func_mysqlnd_res__unbuffered_free_last_data)(MYSQLND_RES *resu
|
|||
|
||||
/* for decoding - binary or text protocol */
|
||||
typedef enum_func_status (*func_mysqlnd_res__row_decoder)(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
|
||||
unsigned int field_count, MYSQLND_FIELD *fields_metadata,
|
||||
zend_bool as_unicode, zend_bool as_int_or_float,
|
||||
MYSQLND_STATS * stats TSRMLS_DC);
|
||||
unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
|
||||
zend_bool as_int_or_float, MYSQLND_STATS * stats TSRMLS_DC);
|
||||
|
||||
typedef MYSQLND_RES_METADATA * (*func_mysqlnd_res__result_meta_init)(unsigned int field_count, zend_bool persistent TSRMLS_DC);
|
||||
|
||||
|
@ -932,10 +930,6 @@ struct mysqlnd_field_hash_key
|
|||
{
|
||||
zend_bool is_numeric;
|
||||
unsigned long key;
|
||||
#if MYSQLND_UNICODE
|
||||
zstr ustr;
|
||||
unsigned int ulen;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1411,9 +1411,8 @@ php_mysqlnd_read_row_ex(MYSQLND_CONN_DATA * conn, MYSQLND_MEMORY_POOL * result_s
|
|||
/* {{{ php_mysqlnd_rowp_read_binary_protocol */
|
||||
enum_func_status
|
||||
php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
|
||||
unsigned int field_count, MYSQLND_FIELD *fields_metadata,
|
||||
zend_bool as_unicode, zend_bool as_int_or_float,
|
||||
MYSQLND_STATS * stats TSRMLS_DC)
|
||||
unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
|
||||
zend_bool as_int_or_float, MYSQLND_STATS * stats TSRMLS_DC)
|
||||
{
|
||||
unsigned int i;
|
||||
zend_uchar * p = row_buffer->ptr;
|
||||
|
@ -1446,17 +1445,17 @@ php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zv
|
|||
enum_mysqlnd_collected_stats statistic;
|
||||
zend_uchar * orig_p = p;
|
||||
|
||||
DBG_INF_FMT("Into zval=%p decoding column %u [%s.%s.%s] type=%u field->flags&unsigned=%u flags=%u is_bit=%u as_unicode=%u",
|
||||
DBG_INF_FMT("Into zval=%p decoding column %u [%s.%s.%s] type=%u field->flags&unsigned=%u flags=%u is_bit=%u",
|
||||
*current_field, i,
|
||||
fields_metadata[i].db, fields_metadata[i].table, fields_metadata[i].name, fields_metadata[i].type,
|
||||
fields_metadata[i].flags & UNSIGNED_FLAG, fields_metadata[i].flags, fields_metadata[i].type == MYSQL_TYPE_BIT, as_unicode);
|
||||
fields_metadata[i].flags & UNSIGNED_FLAG, fields_metadata[i].flags, fields_metadata[i].type == MYSQL_TYPE_BIT);
|
||||
if (*null_ptr & bit) {
|
||||
DBG_INF("It's null");
|
||||
ZVAL_NULL(*current_field);
|
||||
statistic = STAT_BINARY_TYPE_FETCHED_NULL;
|
||||
} else {
|
||||
enum_mysqlnd_field_types type = fields_metadata[i].type;
|
||||
mysqlnd_ps_fetch_functions[type].func(*current_field, &fields_metadata[i], 0, &p, as_unicode TSRMLS_CC);
|
||||
mysqlnd_ps_fetch_functions[type].func(*current_field, &fields_metadata[i], 0, &p TSRMLS_CC);
|
||||
|
||||
if (MYSQLND_G(collect_statistics)) {
|
||||
switch (fields_metadata[i].type) {
|
||||
|
@ -1510,9 +1509,8 @@ php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zv
|
|||
/* {{{ php_mysqlnd_rowp_read_text_protocol */
|
||||
enum_func_status
|
||||
php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
|
||||
unsigned int field_count, MYSQLND_FIELD *fields_metadata,
|
||||
zend_bool as_unicode, zend_bool as_int_or_float,
|
||||
MYSQLND_STATS * stats TSRMLS_DC)
|
||||
unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
|
||||
zend_bool as_int_or_float, MYSQLND_STATS * stats TSRMLS_DC)
|
||||
{
|
||||
unsigned int i;
|
||||
zend_bool last_field_was_string = FALSE;
|
||||
|
@ -1564,7 +1562,7 @@ php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval
|
|||
ZVAL_NULL(*current_field);
|
||||
last_field_was_string = FALSE;
|
||||
} else {
|
||||
#if MYSQLND_UNICODE || defined(MYSQLND_STRING_TO_INT_CONVERSION)
|
||||
#if defined(MYSQLND_STRING_TO_INT_CONVERSION)
|
||||
struct st_mysqlnd_perm_bind perm_bind =
|
||||
mysqlnd_ps_fetch_functions[fields_metadata[i].type];
|
||||
#endif
|
||||
|
@ -1660,7 +1658,7 @@ php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval
|
|||
Definitely not nice, _hackish_ :(, but works.
|
||||
*/
|
||||
zend_uchar *start = bit_area;
|
||||
ps_fetch_from_1_to_8_bytes(*current_field, &(fields_metadata[i]), 0, &p, as_unicode, len TSRMLS_CC);
|
||||
ps_fetch_from_1_to_8_bytes(*current_field, &(fields_metadata[i]), 0, &p, len TSRMLS_CC);
|
||||
/*
|
||||
We have advanced in ps_fetch_from_1_to_8_bytes. We should go back because
|
||||
later in this function there will be an advancement.
|
||||
|
@ -1668,60 +1666,16 @@ php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval
|
|||
p -= len;
|
||||
if (Z_TYPE_PP(current_field) == IS_LONG) {
|
||||
bit_area += 1 + sprintf((char *)start, "%ld", Z_LVAL_PP(current_field));
|
||||
#if MYSQLND_UNICODE
|
||||
if (as_unicode) {
|
||||
ZVAL_UTF8_STRINGL(*current_field, start, bit_area - start - 1, 0);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
ZVAL_STRINGL(*current_field, (char *) start, bit_area - start - 1, 0);
|
||||
}
|
||||
ZVAL_STRINGL(*current_field, (char *) start, bit_area - start - 1, 0);
|
||||
} else if (Z_TYPE_PP(current_field) == IS_STRING){
|
||||
memcpy(bit_area, Z_STRVAL_PP(current_field), Z_STRLEN_PP(current_field));
|
||||
bit_area += Z_STRLEN_PP(current_field);
|
||||
*bit_area++ = '\0';
|
||||
zval_dtor(*current_field);
|
||||
#if MYSQLND_UNICODE
|
||||
if (as_unicode) {
|
||||
ZVAL_UTF8_STRINGL(*current_field, start, bit_area - start - 1, 0);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
ZVAL_STRINGL(*current_field, (char *) start, bit_area - start - 1, 0);
|
||||
}
|
||||
ZVAL_STRINGL(*current_field, (char *) start, bit_area - start - 1, 0);
|
||||
}
|
||||
/*
|
||||
IS_UNICODE should not be specially handled. In unicode mode
|
||||
the buffers are not referenced - everything is copied.
|
||||
*/
|
||||
} else
|
||||
#if MYSQLND_UNICODE == 0
|
||||
{
|
||||
ZVAL_STRINGL(*current_field, (char *)p, len, 0);
|
||||
}
|
||||
#else
|
||||
/*
|
||||
Here we have to convert to UTF16, which means not reusing the buffer.
|
||||
Which in turn means that we can free the buffers once we have
|
||||
stored the result set, if we use store_result().
|
||||
|
||||
Also the destruction of the zvals should not call zval_copy_ctor()
|
||||
because then we will leak.
|
||||
|
||||
XXX: Keep in mind that up there there is an open `else` in
|
||||
#ifdef MYSQLND_STRING_TO_INT_CONVERSION
|
||||
which will make with this `if` an `else if`.
|
||||
*/
|
||||
if ((perm_bind.is_possibly_blob == TRUE &&
|
||||
fields_metadata[i].charsetnr == MYSQLND_BINARY_CHARSET_NR) ||
|
||||
(!as_unicode && perm_bind.can_ret_as_str_in_uni == TRUE))
|
||||
{
|
||||
/* BLOB - no conversion please */
|
||||
ZVAL_STRINGL(*current_field, (char *)p, len, 0);
|
||||
} else {
|
||||
ZVAL_UTF8_STRINGL(*current_field, (char *)p, len, 0);
|
||||
}
|
||||
#endif
|
||||
ZVAL_STRINGL(*current_field, (char *)p, len, 0);
|
||||
p += len;
|
||||
last_field_was_string = TRUE;
|
||||
}
|
||||
|
|
|
@ -307,15 +307,13 @@ PHPAPI const extern char * const mysqlnd_empty_string;
|
|||
|
||||
|
||||
enum_func_status php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
|
||||
unsigned int field_count, MYSQLND_FIELD *fields_metadata,
|
||||
zend_bool as_unicode, zend_bool as_int_or_float,
|
||||
MYSQLND_STATS * stats TSRMLS_DC);
|
||||
unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
|
||||
zend_bool as_int_or_float, MYSQLND_STATS * stats TSRMLS_DC);
|
||||
|
||||
|
||||
enum_func_status php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
|
||||
unsigned int field_count, MYSQLND_FIELD *fields_metadata,
|
||||
zend_bool as_unicode, zend_bool as_int_or_float,
|
||||
MYSQLND_STATS * stats TSRMLS_DC);
|
||||
unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
|
||||
zend_bool as_int_or_float, MYSQLND_STATS * stats TSRMLS_DC);
|
||||
|
||||
|
||||
PHPAPI MYSQLND_PROTOCOL * mysqlnd_protocol_init(zend_bool persistent TSRMLS_DC);
|
||||
|
|
|
@ -40,39 +40,8 @@ static zend_function_entry mysqlnd_functions[] = {
|
|||
|
||||
|
||||
/* {{{ mysqlnd_minfo_print_hash */
|
||||
#if MYSQLND_UNICODE
|
||||
PHPAPI void mysqlnd_minfo_print_hash(zval *values)
|
||||
{
|
||||
zval **values_entry;
|
||||
HashPosition pos_values;
|
||||
|
||||
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos_values);
|
||||
while (zend_hash_get_current_data_ex(Z_ARRVAL_P(values),
|
||||
(void **)&values_entry, &pos_values) == SUCCESS) {
|
||||
zstr string_key;
|
||||
uint string_key_len;
|
||||
ulong num_key;
|
||||
int s_len;
|
||||
char *s = NULL;
|
||||
|
||||
TSRMLS_FETCH();
|
||||
zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &string_key, &string_key_len, &num_key, 0, &pos_values);
|
||||
|
||||
convert_to_string(*values_entry);
|
||||
|
||||
if (zend_unicode_to_string(ZEND_U_CONVERTER(UG(runtime_encoding_conv)),
|
||||
&s, &s_len, string_key.u, string_key_len TSRMLS_CC) == SUCCESS) {
|
||||
php_info_print_table_row(2, s, Z_STRVAL_PP(values_entry));
|
||||
}
|
||||
if (s) {
|
||||
mnd_efree(s);
|
||||
}
|
||||
|
||||
zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos_values);
|
||||
}
|
||||
}
|
||||
#else
|
||||
PHPAPI void mysqlnd_minfo_print_hash(zval *values)
|
||||
PHPAPI void
|
||||
mysqlnd_minfo_print_hash(zval *values)
|
||||
{
|
||||
zval **values_entry;
|
||||
HashPosition pos_values;
|
||||
|
@ -91,7 +60,6 @@ PHPAPI void mysqlnd_minfo_print_hash(zval *values)
|
|||
zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos_values);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* }}} */
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue