From: Andrey Hristov Date: Fri, 8 Jan 2010 13:47:03 +0000 (+0000) Subject: add restart_psession and end_psession hooks X-Git-Tag: php-5.4.0alpha1~467 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3264e51983b46ee4951a14b591e8d80a542551b5;p=php add restart_psession and end_psession hooks --- diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index b66c458cde..b253b64907 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -411,26 +411,43 @@ MYSQLND_METHOD(mysqlnd_conn, set_server_option)(MYSQLND * const conn, PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn TSRMLS_DC) { DBG_ENTER("_mysqlnd_restart_psession"); + conn->m->restart_psession(conn TSRMLS_CC); + DBG_VOID_RETURN; +} +/* }}} */ + + +/* {{{ _mysqlnd_end_psession */ +PHPAPI void _mysqlnd_end_psession(MYSQLND *conn TSRMLS_DC) +{ + DBG_ENTER("_mysqlnd_end_psession"); + conn->m->end_psession(conn TSRMLS_CC); + DBG_VOID_RETURN; +} +/* }}} */ + +/* {{{ mysqlnd_conn::restart_psession */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_conn, restart_psession)(MYSQLND * conn TSRMLS_DC) +{ + DBG_ENTER("mysqlnd_conn::restart_psession"); MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_REUSED); /* Free here what should not be seen by the next script */ if (conn->last_message) { mnd_pefree(conn->last_message, conn->persistent); conn->last_message = NULL; } - /* - The thd zval cache is always freed on request shutdown, so this has happened already. - Don't touch the old value! Get new reference - */ - DBG_VOID_RETURN; + DBG_RETURN(PASS); } /* }}} */ -/* {{{ _mysqlnd_end_psession */ -PHPAPI void _mysqlnd_end_psession(MYSQLND *conn TSRMLS_DC) +/* {{{ mysqlnd_conn::end_psession */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_conn, end_psession)(MYSQLND * conn TSRMLS_DC) { - DBG_ENTER("_mysqlnd_end_psession"); - DBG_VOID_RETURN; + DBG_ENTER("mysqlnd_conn::end_psession"); + DBG_RETURN(PASS); } /* }}} */ @@ -2081,7 +2098,9 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_conn) MYSQLND_METHOD_PRIVATE(mysqlnd_conn, set_state), MYSQLND_METHOD(mysqlnd_conn, simple_command), - MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response) + MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response), + MYSQLND_METHOD(mysqlnd_conn, restart_psession), + MYSQLND_METHOD(mysqlnd_conn, end_psession) MYSQLND_CLASS_METHODS_END; diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h index a3a38c7314..03e55f7375 100644 --- a/ext/mysqlnd/mysqlnd.h +++ b/ext/mysqlnd/mysqlnd.h @@ -74,6 +74,9 @@ PHPAPI void ** _mysqlnd_plugin_get_plugin_result_data(const MYSQLND_RES * result PHPAPI void ** _mysqlnd_plugin_get_plugin_stmt_data(const MYSQLND_STMT * stmt, unsigned int plugin_id TSRMLS_DC); #define mysqlnd_plugin_get_plugin_stmt_data(s, p_id) _mysqlnd_plugin_get_plugin_stmt_data((s), (p_id) TSRMLS_CC) +PHPAPI void ** _mysqlnd_plugin_get_plugin_protocol_data(const MYSQLND_PROTOCOL * protocol, unsigned int plugin_id TSRMLS_DC); +#define mysqlnd_plugin_get_plugin_protocol_data(p, p_id) _mysqlnd_plugin_get_plugin_protocol_data((p), (p_id) TSRMLS_CC) + PHPAPI struct st_mysqlnd_conn_methods * mysqlnd_conn_get_methods(); PHPAPI void mysqlnd_conn_set_methods(struct st_mysqlnd_conn_methods *methods); diff --git a/ext/mysqlnd/mysqlnd_net.c b/ext/mysqlnd/mysqlnd_net.c index ea0ece399c..63bd263fc9 100644 --- a/ext/mysqlnd/mysqlnd_net.c +++ b/ext/mysqlnd/mysqlnd_net.c @@ -661,7 +661,8 @@ MYSQLND_METHOD(mysqlnd_net, free_contents)(MYSQLND_NET * net TSRMLS_DC) MYSQLND_NET * mysqlnd_net_init(zend_bool persistent TSRMLS_DC) { - MYSQLND_NET * net = mnd_pecalloc(1, sizeof(MYSQLND_NET), persistent); + size_t alloc_size = sizeof(MYSQLND_NET) + mysqlnd_plugin_count() * sizeof(void *); + MYSQLND_NET * net = mnd_pecalloc(1, alloc_size, persistent); DBG_ENTER("mysqlnd_net_init"); DBG_INF_FMT("persistent=%d", persistent); @@ -719,6 +720,20 @@ mysqlnd_net_free(MYSQLND_NET * const net TSRMLS_DC) /* }}} */ +/* {{{ _mysqlnd_plugin_get_plugin_net_data */ +PHPAPI void ** _mysqlnd_plugin_get_plugin_net_data(const MYSQLND_NET * net, unsigned int plugin_id TSRMLS_DC) +{ + DBG_ENTER("_mysqlnd_plugin_get_plugin_net_data"); + DBG_INF_FMT("plugin_id=%u", plugin_id); + if (!net || plugin_id >= mysqlnd_plugin_count()) { + return NULL; + } + DBG_RETURN((void *)((char *)net + sizeof(MYSQLND_NET) + plugin_id * sizeof(void *))); +} +/* }}} */ + + + /* * Local variables: * tab-width: 4 diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 016b3bd32a..a186861b61 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -336,6 +336,9 @@ struct st_mysqlnd_conn_methods enum_func_status (*simple_command)(MYSQLND *conn, enum php_mysqlnd_server_command command, const char * const arg, size_t arg_len, enum php_mysql_packet_type ok_packet, zend_bool silent, zend_bool ignore_upsert_status TSRMLS_DC); enum_func_status (*simple_command_handle_response)(MYSQLND *conn, enum php_mysql_packet_type ok_packet, zend_bool silent, enum php_mysqlnd_server_command command, zend_bool ignore_upsert_status TSRMLS_DC); + + enum_func_status (*restart_psession)(MYSQLND *conn TSRMLS_DC); + enum_func_status (*end_psession)(MYSQLND *conn TSRMLS_DC); }; diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 277ad00ab4..7ec96dc866 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1974,6 +1974,19 @@ mysqlnd_protocol_free(MYSQLND_PROTOCOL * const protocol TSRMLS_DC) /* }}} */ +/* {{{ _mysqlnd_plugin_get_plugin_protocol_data */ +PHPAPI void ** _mysqlnd_plugin_get_plugin_protocol_data(const MYSQLND_PROTOCOL * protocol, unsigned int plugin_id TSRMLS_DC) +{ + DBG_ENTER("_mysqlnd_plugin_get_plugin_protocol_data"); + DBG_INF_FMT("plugin_id=%u", plugin_id); + if (!protocol || plugin_id >= mysqlnd_plugin_count()) { + return NULL; + } + DBG_RETURN((void *)((char *)protocol + sizeof(MYSQLND_PROTOCOL) + plugin_id * sizeof(void *))); +} +/* }}} */ + + /* * Local variables: * tab-width: 4