List:Commits« Previous MessageNext Message »
From:ahristov Date:March 28 2007 7:09pm
Subject:PHP mysqlnd svn commit: r299 - in trunk/ext/mysqli: . mysqlnd
View as plain text  
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: . mysqlndahristov28 Mar