List:Commits« Previous MessageNext Message »
From:ahristov Date:March 6 2007 1:33pm
Subject:PHP mysqlnd svn commit: r90 - trunk/ext/mysqli/mysqlnd
View as plain text  
Author: ahristov
Date: 2007-03-06 14:33:50 +0100 (Tue, 06 Mar 2007)
New Revision: 90

Modified:
   trunk/ext/mysqli/mysqlnd/mysqlnd.c
   trunk/ext/mysqli/mysqlnd/mysqlnd.h
   trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c
   trunk/ext/mysqli/mysqlnd/mysqlnd_statistics.c
Log:
Add more statistics 
       STAT_CLOSE_EXPLICIT
       STAT_CLOSE_IMPLICIT
       STAT_CLOSE_DISCONNECT
       STAT_CLOSE_IN_MIDDLE
       STAT_FREE_RESULT_EXPLICIT
       STAT_FREE_RESULT_IMPLICIT
       STAT_STMT_CLOSE_EXPLICIT
       STAT_STMT_CLOSE_IMPLICIT

Fix a segfault on calling mysqlnd_stmt_num_rows() for just initted
stmt.



Modified: trunk/ext/mysqli/mysqlnd/mysqlnd.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd.c	2007-03-05 16:56:10 UTC (rev 89)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd.c	2007-03-06 13:33:50 UTC (rev 90)
@@ -1143,6 +1143,11 @@
 		row_packet->fields = NULL;
 		row_packet->row_buffer = NULL;
 
+		result->row_count++;
+		*fetched_anything = TRUE;
+
+		MYSQLND_INC_CONN_STATISTIC(&result->conn->stats,
STAT_ROWS_FETCHED_FROM_CLIENT);
+
 		if (!row_packet->skip_extraction) {
 			HashTable *row_ht = Z_ARRVAL_P(row);
 			for (i = 0; i < field_count; i++) {
@@ -1175,15 +1180,9 @@
 				}
 			}
 		}
+	} else if (row_packet->eof) {
+		/* Mark the connection as usable again */
 
-		result->row_count++;
-		*fetched_anything = TRUE;
-	}
-
-	/* Mark the connection as usable again */
-	if (!row_packet->eof) {
-		MYSQLND_INC_CONN_STATISTIC(&result->conn->stats,
STAT_ROWS_FETCHED_FROM_CLIENT);
-	} else {
 		result->eof_reached = TRUE;
 		result->conn->upsert_status.warning_count = row_packet->warning_count;
 		result->conn->upsert_status.server_status = row_packet->server_status;
@@ -1440,9 +1439,12 @@
 
 /* {{{ _mysqlnd_free_result */
 static enum_func_status
-_mysqlnd_free_result(MYSQLND_RES *result TSRMLS_DC)
+_mysqlnd_free_result(MYSQLND_RES *result, zend_bool implicit TSRMLS_DC)
 {
 	result->m.skip_result(result TSRMLS_CC);
+	MYSQLND_INC_CONN_STATISTIC(result->conn? &result->conn->stats : NULL,
+							   implicit == TRUE?	STAT_FREE_RESULT_EXPLICIT:
+													STAT_FREE_RESULT_IMPLICIT);
 
 	mysqlnd_internal_free_result(result TSRMLS_CC);
 	return PASS;
@@ -1714,12 +1716,22 @@
 /* }}} */
 
 
+static enum_mysqlnd_collected_stats
+close_type_to_stat_map[MYSQLND_CLOSE_LAST] = {
+	STAT_CLOSE_EXPLICIT,
+	STAT_CLOSE_IMPLICIT,
+	STAT_CLOSE_DISCONNECT
+};
+
 /* {{{ _mysqlnd_close */
 enum_func_status
-_mysqlnd_close(MYSQLND *conn TSRMLS_DC)
+_mysqlnd_close(MYSQLND *conn, enum_connection_close_type close_type TSRMLS_DC)
 {
-	enum_func_status ret;
+	enum_func_status ret = PASS;
+	enum_mysqlnd_collected_stats stat = close_type_to_stat_map[close_type];
 
+	
+	MYSQLND_INC_CONN_STATISTIC(NULL, stat);
 	switch (conn->state) {
 		case CONN_READY:
 			ret =  mysqlnd_simple_command(conn, COM_QUIT, NULL, 0, PROT_LAST,
@@ -1729,6 +1741,7 @@
 		case CONN_NEXT_RESULT_PENDING:
 		case CONN_QUERY_SENT:
 		case CONN_FETCHING_DATA:
+			MYSQLND_INC_CONN_STATISTIC(NULL, STAT_CLOSE_IN_MIDDLE);
 #ifndef MYSQLND_SILENT
 			php_printf("Brutally closing connection [%p][%s]\n", conn, conn->scheme);
 #endif
@@ -1736,14 +1749,15 @@
 			  Do nothing, the connection will be brutally closed
 			  and the server will catch it and free close from its side.
 			*/
-			ret = PASS;
-			break;
 		case CONN_ALLOCED:
-		case CONN_QUIT_SENT:
 			/*
-			  We get here if the user has called mysqlnd_close(), and then later the
-			  resource destructor has kicked in.
+			  Allocated but not connected or there was failure when trying
+			  to connect with pre-allocated connect.
+
+			  Fall-through
 			*/
+		case CONN_QUIT_SENT:
+			/* The user has killed its own connection */
 			break;
 	}
 	/*

Modified: trunk/ext/mysqli/mysqlnd/mysqlnd.h
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd.h	2007-03-05 16:56:10 UTC (rev 89)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd.h	2007-03-06 13:33:50 UTC (rev 90)
@@ -297,8 +297,15 @@
 	CURSOR_TYPE_SCROLLABLE= 4
 };
 
+typedef enum mysqlnd_connection_close_type
+{
+	MYSQLND_CLOSE_EXPLICIT = 0,
+	MYSQLND_CLOSE_IMPLICIT,
+	MYSQLND_CLOSE_DISCONNECTED,
+	MYSQLND_CLOSE_LAST	/* for checking, should always be last */
+} enum_connection_close_type;
 
-enum {
+typedef enum mysqlnd_collected_stats {
 	STAT_BYTES_SENT,
 	STAT_BYTES_RECEIVED,
 	STAT_PACKETS_SENT,
@@ -324,8 +331,16 @@
 	STAT_CONNECT_SUCCESS,
 	STAT_CONNECT_FAILURE,
 	STAT_CONNECT_REUSED,
+	STAT_CLOSE_EXPLICIT,
+	STAT_CLOSE_IMPLICIT,
+	STAT_CLOSE_DISCONNECT,
+	STAT_CLOSE_IN_MIDDLE,
+	STAT_FREE_RESULT_EXPLICIT,
+	STAT_FREE_RESULT_IMPLICIT,
+	STAT_STMT_CLOSE_EXPLICIT,
+	STAT_STMT_CLOSE_IMPLICIT,
 	STAT_LAST /* Should be always the last */
-};
+} enum_mysqlnd_collected_stats;
 
 
 typedef struct st_mysqlnd_cmd_buffer {
@@ -523,7 +538,7 @@
 	enum_func_status	(*set_server_option)(MYSQLND * const conn, enum_mysqlnd_server_option
option TSRMLS_DC);
 	enum_func_status	(*set_client_option)(MYSQLND * const conn, enum_mysqlnd_option option,
const char * const value);
 	void				(*free_contents)(MYSQLND *conn TSRMLS_DC);	/* private */
-	enum_func_status	(*close)(MYSQLND *conn TSRMLS_DC);
+	enum_func_status	(*close)(MYSQLND *conn, enum_connection_close_type close_type
TSRMLS_DC);
 	void				(*dtor)(MYSQLND *conn TSRMLS_DC);	/* private */
 };
 
@@ -544,7 +559,7 @@
 	MYSQLND_ROW 		(*fetch_row_old_way)(MYSQLND_RES * result TSRMLS_DC ZEND_FILE_LINE_DC);
 	unsigned long *		(*fetch_lengths)(MYSQLND_RES * const result);
 	void				(*free_result_buffers)(MYSQLND_RES * result);	/* private */
-	enum_func_status	(*free_result)(MYSQLND_RES * result TSRMLS_DC);
+	enum_func_status	(*free_result)(MYSQLND_RES * result, zend_bool implicit TSRMLS_DC);
 };
 
 
@@ -555,8 +570,8 @@
 	enum_func_status	(*free_result)(MYSQLND_STMT * const stmt TSRMLS_DC);
 	enum_func_status	(*seek_data)(const MYSQLND_STMT * const stmt, mynd_ulonglong row);
 	enum_func_status	(*reset)(MYSQLND_STMT * const stmt TSRMLS_DC);
-	enum_func_status	(*close)(MYSQLND_STMT * const stmt TSRMLS_DC); /* private */
-	enum_func_status	(*dtor)(MYSQLND_STMT * const stmt TSRMLS_DC); /* use this for
mysqlnd_stmt_close */
+	enum_func_status	(*close)(MYSQLND_STMT * const stmt, zend_bool implicit TSRMLS_DC); /*
private */
+	enum_func_status	(*dtor)(MYSQLND_STMT * const stmt, zend_bool implicit TSRMLS_DC); /*
use this for mysqlnd_stmt_close */
 
 
 	enum_func_status	(*bind_param)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND * const
param_bind);
@@ -788,7 +803,7 @@
 #define mysqlnd_get_connection_stats(conn,
values)		(conn)->m->get_statistics((conn),  (values) TSRMLS_CC ZEND_FILE_LINE_CC)
 #define mysqlnd_get_client_stats(values)				_mysqlnd_get_client_stats((values) TSRMLS_CC
ZEND_FILE_LINE_CC)
 
-#define mysqlnd_close(conn)								(conn)->m->close(conn TSRMLS_CC)
+#define mysqlnd_close(conn,is_forced)					(conn)->m->close((conn), (is_forced)
TSRMLS_CC)
 #define mysqlnd_query(conn, query_str, query_len)		(conn)->m->query((conn),
(query_str), (query_len) TSRMLS_CC)
 #define mysqlnd_unbuffered_skip_result(result)			(result)->m.skip_result((result)
TSRMLS_CC)
 
@@ -797,7 +812,7 @@
 #define mysqlnd_store_result(conn)		(conn)->m->store_result((conn) TSRMLS_CC)
 #define mysqlnd_next_result(conn)		(conn)->m->next_result((conn) TSRMLS_CC)
 #define mysqlnd_more_results(conn)		(conn)->m->more_results((conn))
-#define
mysqlnd_free_result(result)		((MYSQLND_RES*)result)->m.free_result(((MYSQLND_RES*)(result))
TSRMLS_CC)
+#define
mysqlnd_free_result(r,e_or_i)	((MYSQLND_RES*)r)->m.free_result(((MYSQLND_RES*)(r)),
(e_or_i) TSRMLS_CC)
 #define mysqlnd_data_seek(result, row)	(result)->m.seek_data((result), (row))
 
 /*****************************************************************************************************/
@@ -836,7 +851,7 @@
 /* PS */
 #define mysqlnd_stmt_insert_id(stmt)		(stmt)->upsert_status.last_insert_id
 #define mysqlnd_stmt_affected_rows(stmt)	(stmt)->upsert_status.affected_rows
-#define mysqlnd_stmt_num_rows(stmt)			(stmt)->result->row_count
+#define mysqlnd_stmt_num_rows(stmt)			((stmt)->result?
(stmt)->result->row_count:0)
 #define mysqlnd_stmt_param_count(stmt)		(stmt)->param_count
 #define mysqlnd_stmt_field_count(stmt)		(stmt)->field_count
 #define mysqlnd_stmt_warning_count(stmt)	(stmt)->upsert_status.warning_count
@@ -926,7 +941,7 @@
 
 /* PS */
 #define mysqlnd_stmt_init(conn)				(conn)->m->stmt_init((conn))
-#define mysqlnd_stmt_store_result(stmt)		((stmt)->m->store_result((stmt)
TSRMLS_CC)? PASS:FAIL)
+#define mysqlnd_stmt_store_result(stmt)		(!mysqlnd_stmt_field_count((stmt)) ?
PASS:((stmt)->m->store_result((stmt) TSRMLS_CC)? PASS:FAIL))
 #define mysqlnd_stmt_data_seek(stmt, row)	(stmt)->m->seek_data((stmt), (row))
 #define mysqlnd_stmt_prepare(stmt, q, qlen)	(stmt)->m->prepare((stmt), (q), (qlen)
TSRMLS_CC)
 #define mysqlnd_stmt_execute(stmt) 			(stmt)->m->execute((stmt) TSRMLS_CC)
@@ -935,7 +950,7 @@
 #define mysqlnd_stmt_bind_result(stmt,bind)	(stmt)->m->bind_result((stmt), (bind))
 
 #define	mysqlnd_stmt_free_result(stmt)		(stmt)->m->free_result((stmt) TSRMLS_CC)
-#define	mysqlnd_stmt_close(stmt)			(stmt)->m->dtor((stmt) TSRMLS_CC)
+#define	mysqlnd_stmt_close(stmt, implicit)	(stmt)->m->dtor((stmt), (implicit)
TSRMLS_CC)
 #define	mysqlnd_stmt_reset(stmt)			(stmt)->m->reset((stmt) TSRMLS_CC)
 
 

Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c	2007-03-05 16:56:10 UTC (rev 89)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c	2007-03-06 13:33:50 UTC (rev 90)
@@ -66,6 +66,10 @@
 	php_mysql_packet_row row_packet;
 	MYSQLND_RES *result;
 
+	/* be compliant with libmysql - NULL will turn */
+	if (!stmt->field_count) {
+		return NULL;
+	}
 
 	if (stmt->cursor_exists) {
 		/* Silently convert buffered to unbuffered, for now */
@@ -73,8 +77,7 @@
 	}
 
 	/* Nothing to store for UPSERT/LOAD DATA*/
-	if (!stmt->field_count ||
-		conn->state != CONN_FETCHING_DATA ||
+	if (conn->state != CONN_FETCHING_DATA ||
 		stmt->state != MYSQLND_STMT_WAITING_USE_OR_STORE)
 	{
 		SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC,
@@ -315,7 +318,7 @@
 
 	if (stmt_to_prepare != stmt) {
 		/* Free old buffers, binding and resources on server */
-		stmt->m->close(stmt TSRMLS_CC);
+		stmt->m->close(stmt, TRUE TSRMLS_CC);
 
 		/* Now we will have a clean new statement object */
 		memcpy(stmt, stmt_to_prepare, sizeof(MYSQLND_STMT));
@@ -326,7 +329,7 @@
 
 fail:
 	if (stmt_to_prepare != stmt) {
-		stmt_to_prepare->m->dtor(stmt_to_prepare TSRMLS_CC);
+		stmt_to_prepare->m->dtor(stmt_to_prepare, TRUE TSRMLS_CC);
 	}
 	stmt->state = MYSQLND_STMT_INITTED;
 
@@ -786,7 +789,7 @@
 
 /* {{{ _mysqlnd_stmt_close */
 static enum_func_status
-_mysqlnd_stmt_close(MYSQLND_STMT * const stmt TSRMLS_DC)
+_mysqlnd_stmt_close(MYSQLND_STMT * const stmt, zend_bool implicit TSRMLS_DC)
 {
 	MYSQLND * conn = stmt->conn;
 	zend_uchar cmd_buf[STMT_ID_LENGTH /* statement id */];
@@ -798,6 +801,10 @@
 			stmt->result->m.skip_result(stmt->result TSRMLS_CC);
 		}
 
+		MYSQLND_INC_CONN_STATISTIC(NULL,
+								   implicit == TRUE?	STAT_FREE_RESULT_IMPLICIT:
+														STAT_FREE_RESULT_EXPLICIT);
+
 		int4store(cmd_buf, stmt->stmt_id);
 		if (conn->state == CONN_READY &&
 			FAIL == mysqlnd_simple_command(conn, COM_STMT_CLOSE, (char *)cmd_buf, sizeof(cmd_buf),
@@ -815,10 +822,15 @@
 
 /* {{{ _mysqlnd_stmt_close */
 static enum_func_status
-_mysqlnd_stmt_dtor(MYSQLND_STMT * const stmt TSRMLS_DC)
+_mysqlnd_stmt_dtor(MYSQLND_STMT * const stmt, zend_bool implicit TSRMLS_DC)
 {
 	enum_func_status ret;
-	if (PASS == (ret = stmt->m->close(stmt TSRMLS_CC))) {
+
+	MYSQLND_INC_CONN_STATISTIC(NULL,
+							   implicit == TRUE?	STAT_STMT_CLOSE_IMPLICIT:
+													STAT_STMT_CLOSE_EXPLICIT);
+
+	if (PASS == (ret = stmt->m->close(stmt, implicit TSRMLS_CC))) {
 		efree(stmt);
 	}
 
@@ -1016,7 +1028,7 @@
 static
 mynd_ulonglong _mysqlnd_stmt_num_rows(const MYSQLND_STMT * const stmt)
 {
-	return stmt->result->row_count;
+	return stmt->result? stmt->result->row_count:0;
 }
 /* }}} */
 

Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_statistics.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_statistics.c	2007-03-05 16:56:10 UTC (rev 89)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_statistics.c	2007-03-06 13:33:50 UTC (rev 90)
@@ -64,6 +64,14 @@
 	{ STR_W_LEN("connect_success") },
 	{ STR_W_LEN("connect_failure") },
 	{ STR_W_LEN("connection_reused") },
+	{ STR_W_LEN("explicit_close") },
+	{ STR_W_LEN("implicit_close") },
+	{ STR_W_LEN("disconnect_close") },
+	{ STR_W_LEN("in_middle_of_command_close") },
+	{ STR_W_LEN("explicit_free_result") },
+	{ STR_W_LEN("implicit_free_result") },
+	{ STR_W_LEN("explicit_stmt_close") },
+	{ STR_W_LEN("implicit_stmt_close") },
 };
 /* }}} */
 

Thread
PHP mysqlnd svn commit: r90 - trunk/ext/mysqli/mysqlndahristov6 Mar