Add float conversions too. Float users should understand how float works!!!
This commit is contained in:
Andrey Hristov 2008-09-15 18:09:20 +00:00
parent 2fced40b76
commit 8bb2465a51
5 changed files with 15 additions and 7 deletions

View file

@ -777,7 +777,7 @@ PHP_MINIT_FUNCTION(mysqli)
REGISTER_LONG_CONSTANT("MYSQLI_OPT_NET_READ_BUFFER_SIZE", MYSQLND_OPT_NET_READ_BUFFER_SIZE, CONST_CS | CONST_PERSISTENT);
#endif
#ifdef MYSQLND_STRING_TO_INT_CONVERSION
REGISTER_LONG_CONSTANT("MYSQLI_OPT_INT_AND_YEAR_AS_INT", MYSQLND_OPT_INT_AND_YEAR_AS_INT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_OPT_INT_AND_FLOAT_NATIVE", MYSQLND_OPT_INT_AND_FLOAT_NATIVE, CONST_CS | CONST_PERSISTENT);
#endif
/* mysqli_real_connect flags */

View file

@ -1711,8 +1711,8 @@ MYSQLND_METHOD(mysqlnd_conn, set_client_option)(MYSQLND * const conn,
conn->options.net_read_buffer_size = *(uint*) value;
break;
#ifdef MYSQLND_STRING_TO_INT_CONVERSION
case MYSQLND_OPT_INT_AND_YEAR_AS_INT:
conn->options.int_and_year_as_int = *(uint*) value;
case MYSQLND_OPT_INT_AND_FLOAT_NATIVE:
conn->options.int_and_float_native = *(uint*) value;
break;
#endif
case MYSQL_OPT_CONNECT_TIMEOUT:

View file

@ -136,7 +136,7 @@ typedef enum mysqlnd_option
MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE = 200,
#endif
#ifdef MYSQLND_STRING_TO_INT_CONVERSION
MYSQLND_OPT_INT_AND_YEAR_AS_INT = 201,
MYSQLND_OPT_INT_AND_FLOAT_NATIVE = 201,
#endif
MYSQLND_OPT_NET_CMD_BUFFER_SIZE = 202,
MYSQLND_OPT_NET_READ_BUFFER_SIZE = 203,

View file

@ -177,7 +177,7 @@ typedef struct st_mysqlnd_option
zend_bool numeric_and_datetime_as_unicode;
#ifdef MYSQLND_STRING_TO_INT_CONVERSION
zend_bool int_and_year_as_int;
zend_bool int_and_float_native;
#endif
unsigned int net_read_buffer_size;
} MYSQLND_OPTION;

View file

@ -1467,7 +1467,7 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer,
zend_uchar *bit_area = (zend_uchar*) row_buffer->ptr + data_size + 1; /* we allocate from here */
zend_bool as_unicode = conn->options.numeric_and_datetime_as_unicode;
#ifdef MYSQLND_STRING_TO_INT_CONVERSION
zend_bool as_int = conn->options.int_and_year_as_int;
zend_bool as_int_or_float = conn->options.int_and_float_native;
#endif
DBG_ENTER("php_mysqlnd_rowp_read_text_protocol");
@ -1551,7 +1551,7 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer,
}
#ifdef MYSQLND_STRING_TO_INT_CONVERSION
if (as_int && perm_bind.php_type == IS_LONG &&
if (as_int_or_float && perm_bind.php_type == IS_LONG &&
perm_bind.pack_len <= SIZEOF_LONG)
{
zend_uchar save = *(p + len);
@ -1580,6 +1580,14 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer,
}
}
*(p + len) = save;
} else if (as_int_or_float && perm_bind.php_type == IS_DOUBLE)
{
zend_uchar save = *(p + len);
/* We have to make it ASCIIZ temporarily */
*(p + len) = '\0';
double v = atof((char *) p);
ZVAL_DOUBLE(*current_field, v);
*(p + len) = save;
} else
#endif /* MYSQLND_STRING_TO_INT_CONVERSION */
if (fields_metadata[i].type == MYSQL_TYPE_BIT) {