Author: ahristov
Date: 2007-03-28 21:09:40 +0200 (Wed, 28 Mar 2007)
New Revision: 299
Modified:
trunk/ext/mysqli/mysqli.c
trunk/ext/mysqli/mysqli_libmysql.h
trunk/ext/mysqli/mysqlnd/mysqlnd.c
trunk/ext/mysqli/mysqlnd/mysqlnd.h
trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c
Log:
Add optional, switched off, conversion of columns that
are of integer type (float-point is not handled) from string
to in (when using the text protocol). This won't affect anything
as the code is ifdef-out-ed. We need to bench it after 5.1.1 is
released to decide whether it makes sense. I can make sense from
memory usage POV anyway.
Modified: trunk/ext/mysqli/mysqli.c
===================================================================
--- trunk/ext/mysqli/mysqli.c 2007-03-28 17:08:48 UTC (rev 298)
+++ trunk/ext/mysqli/mysqli.c 2007-03-28 19:09:40 UTC (rev 299)
@@ -612,6 +612,9 @@
REGISTER_LONG_CONSTANT("MYSQLI_OPT_LOCAL_INFILE", MYSQL_OPT_LOCAL_INFILE, CONST_CS |
CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_INIT_COMMAND", MYSQL_INIT_COMMAND, CONST_CS |
CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQLI_OPT_NUMERIC_AND_DATETIME_AS_UNICODE",
MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE, CONST_CS | CONST_PERSISTENT);
+#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);
+#endif
/* mysqli_real_connect flags */
REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT);
Modified: trunk/ext/mysqli/mysqli_libmysql.h
===================================================================
--- trunk/ext/mysqli/mysqli_libmysql.h 2007-03-28 17:08:48 UTC (rev 298)
+++ trunk/ext/mysqli/mysqli_libmysql.h 2007-03-28 19:09:40 UTC (rev 299)
@@ -23,7 +23,8 @@
#define MYSQLI_CLOSE_EXPLICIT
#define MYSQLI_CLOSE_IMPLICIT
#define MYSQLI_CLOSE_DISCONNECTED
-#define MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE 100
+#define MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE 200
+#define MYSQLND_OPT_INT_AND_YEAR_AS_INT 201
#define mysqli_result_is_unbuffered(r) ((r)->handle &&
(r)->handle->status == MYSQL_STATUS_USE_RESULT)
#define mysqli_server_status(c) (c)->server_status
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd.c 2007-03-28 17:08:48 UTC (rev 298)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd.c 2007-03-28 19:09:40 UTC (rev 299)
@@ -2448,6 +2448,11 @@
case MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE:
conn->options.numeric_and_datetime_as_unicode = *(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;
+ break;
+#endif
case MYSQL_OPT_CONNECT_TIMEOUT:
conn->options.timeout_connect = *(uint*) value;
break;
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd.h
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd.h 2007-03-28 17:08:48 UTC (rev 298)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd.h 2007-03-28 19:09:40 UTC (rev 299)
@@ -24,7 +24,9 @@
#define MYSQLND_H
/* This forces inlining some accessor functions */
-#define MYSQLND_USE_OPTIMISATIONS 0
+#define MYSQLND_USE_OPTIMISATIONS 1
+
+/* #define MYSQLND_STRING_TO_INT_CONVERSION */
/*
This force mysqlnd to do a single (or more depending on ammount of data)
non-blocking read() calls before sending a command to the server. Useful
@@ -156,7 +158,10 @@
MYSQL_REPORT_DATA_TRUNCATION,
MYSQL_OPT_RECONNECT,
MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
- MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE = 100,
+ MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE = 200
+#ifdef MYSQLND_STRING_TO_INT_CONVERSION
+ ,MYSQLND_OPT_INT_AND_YEAR_AS_INT = 201
+#endif
} enum_mysqlnd_option;
@@ -465,6 +470,9 @@
ulong max_allowed_packet;
zend_bool numeric_and_datetime_as_unicode;
+#ifdef MYSQLND_STRING_TO_INT_CONVERSION
+ zend_bool int_and_year_as_int;
+#endif
} MYSQLND_OPTION;
@@ -880,9 +888,9 @@
#define mysqlnd_fetch_lengths(result) ((result)->m.fetch_lengths?
(result)->m.fetch_lengths((result)):NULL)
#define mysqlnd_field_seek(result, ofs) (result)->m.seek_field((result), (ofs))
-#define mysqlnd_field_tell(result) ((result)->meta? (result)->current_field:0)
+#define mysqlnd_field_tell(result) ((result)->meta?
(result)->meta->current_field:0)
#define mysqlnd_fetch_field(result) (result)->m.fetch_field((result))
-#define mysqlnd_fetch_field_direct(result,fnr) ((result)->meta?
&((result)->fields[(fnr)]:NULL)
+#define mysqlnd_fetch_field_direct(result,fnr) ((result)->meta?
&((result)->meta->fields[(fnr)]):NULL)
/* mysqlnd metadata */
#define mysqlnd_get_client_info() MYSQLND_VERSION
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c 2007-03-28 17:08:48 UTC (rev 298)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c 2007-03-28 19:09:40 UTC (rev 299)
@@ -1168,6 +1168,9 @@
zend_bool last_field_was_string;
zval **current_field, **end_field, **start_field;
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;
+#endif
end_field = (current_field = start_field = packet->fields) + packet->field_count;
for (i = 0; current_field < end_field; current_field++, i++) {
@@ -1209,11 +1212,46 @@
ZVAL_NULL(*current_field);
last_field_was_string = FALSE;
} else {
+ struct st_mysqlnd_perm_bind perm_bind =
+ mysqlnd_ps_fetch_functions[packet->fields_metadata[i].type];
+
+#ifdef MYSQLND_STRING_TO_INT_CONVERSION
+ if (as_int && perm_bind.php_type == IS_LONG &&
+ perm_bind.pack_len <= SIZEOF_LONG)
+ {
+ zend_uchar save = *(p + len);
+ /* We have to make it ASCIIZ temporarily */
+ *(p + len) = '\0';
+ if (perm_bind.pack_len < SIZEOF_LONG)
+ {
+ /* direct conversion */
+ my_int64 v = atoll((char *) p);
+ ZVAL_LONG(*current_field, v);
+ } else {
+ my_uint64 v = (my_uint64) atoll((char *) p);
+ zend_bool uns = packet->fields_metadata[i].flags & UNSIGNED_FLAG? TRUE:FALSE;
+ /* We have to make it ASCIIZ temporarily */
+#if SIZEOF_LONG==8
+ if (uns == TRUE && v > 9223372036854775807L)
+#elif SIZEOF_LONG==4
+ if ((uns == TRUE && v > L64(2147483647)) ||
+ (uns == FALSE && (( L64(2147483647) < (my_int64) v) ||
+ (L64(-2147483648) > (my_int64) v))))
+#endif
+ {
+ ZVAL_STRINGL(*current_field, (char *)p, len, 0);
+ } else {
+ ZVAL_LONG(*current_field, (my_int64)v);
+ }
+ }
+ *(p + len) = save;
+ } else
+#endif
#if PHP_MAJOR_VERSION < 6
- ZVAL_STRINGL(*current_field, (char *)p, len, 0);
+ {
+ ZVAL_STRINGL(*current_field, (char *)p, len, 0);
+ }
#else
- struct st_mysqlnd_perm_bind perm_bind =
- mysqlnd_ps_fetch_functions[packet->fields_metadata[i].type];
/*
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
@@ -1222,6 +1260,9 @@
I suppose we can use UG(unicode) in mysqlnd.c/mysqlnd_palloc.c when
freeing a result set
to check if we need to call copy_ctor().
+
+ XXX: Keep in mind that up there there is an open `else` in
+ #ifdef MYSQLND_STRING_TO_INT_CONVERSION
*/
if ((perm_bind.is_possibly_blob == TRUE &&
packet->fields_metadata[i].charsetnr == MYSQLND_BINARY_CHARSET_NR) ||
| Thread |
|---|
| • PHP mysqlnd svn commit: r299 - in trunk/ext/mysqli: . mysqlnd | ahristov | 28 Mar |