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/mysqlnd | ahristov | 6 Mar |